send a NodeJoin event on startup for cases where a quick restart has occurred and memberlist is not aware of it

This commit is contained in:
Travis Turner 2018-02-26 15:41:04 -06:00
parent 1cc45b22a2
commit fa4e543e84
No known key found for this signature in database
GPG key ID: 7F08008DFD9314C9
5 changed files with 338 additions and 126 deletions

View file

@ -136,6 +136,7 @@ const (
MessageTypeSetCoordinator
MessageTypeNodeState
MessageTypeRecalculateCaches
MessageTypeNodeEvent
)
// MarshalMessage encodes the protobuf message into a byte slice.
@ -176,6 +177,8 @@ func MarshalMessage(m proto.Message) ([]byte, error) {
typ = MessageTypeNodeState
case *internal.RecalculateCaches:
typ = MessageTypeRecalculateCaches
case *internal.NodeEventMessage:
typ = MessageTypeNodeEvent
default:
return nil, fmt.Errorf("message type not implemented for marshalling: %s", reflect.TypeOf(obj))
}
@ -226,6 +229,8 @@ func UnmarshalMessage(buf []byte) (proto.Message, error) {
m = &internal.NodeStateMessage{}
case MessageTypeRecalculateCaches:
m = &internal.RecalculateCaches{}
case MessageTypeNodeEvent:
m = &internal.NodeEventMessage{}
default:
return nil, fmt.Errorf("invalid message type: %d", typ)
}

View file

@ -114,6 +114,13 @@ func DecodeNode(node *internal.Node) *Node {
}
}
func DecodeNodeEvent(ne *internal.NodeEventMessage) *NodeEvent {
return &NodeEvent{
Event: NodeEventType(ne.Event),
Node: DecodeNode(ne.Node),
}
}
// Nodes represents a list of nodes.
type Nodes []*Node
@ -897,6 +904,22 @@ func (c *Cluster) Open() error {
// If not coordinator then wait for ClusterStatus from coordinator.
if !c.IsCoordinator() {
// In the case where a node has been restarted and memberlist has
// not had enough time to determine the node went down/up, then
// the coorninator needs to be alerted that this node is back up
// (and now in a state of STARTING) so that it can be put to the correct
// cluster state.
// TODO: Because the normal code path already sends a NodeJoin event (via
// memberlist), this it a bit redundant in most cases. Perhaps determine
// that the node has been restarted and don't do this step.
msg := &internal.NodeEventMessage{
Event: uint32(NodeJoin),
Node: EncodeNode(c.Node),
}
if err := c.Broadcaster.SendAsync(msg); err != nil {
return fmt.Errorf("sending restart NodeJoin: %v", err)
}
c.logger().Printf("wait for joining to complete")
<-c.joining
c.logger().Printf("joining has completed")
@ -1678,9 +1701,11 @@ func (c *Cluster) nodeJoin(node *Node) error {
return nil
}
// Don't do anything else if the cluster already contains the node.
if c.nodeByID(node.ID) != nil {
return nil
// If the cluster already contains the node, just send it the cluster status.
// This is useful in the case where a node is restarted or temporarily leaves
// the cluster.
if node := c.nodeByID(node.ID); node != nil {
return c.sendTo(node, c.Status())
}
// If the holder does not yet contain data, go ahead and add the node.

View file

@ -34,6 +34,7 @@
URI
Node
NodeStateMessage
NodeEventMessage
NodeStatus
ClusterStatus
Field
@ -797,6 +798,30 @@ func (m *NodeStateMessage) GetState() string {
return ""
}
type NodeEventMessage struct {
Event uint32 `protobuf:"varint,1,opt,name=Event,proto3" json:"Event,omitempty"`
Node *Node `protobuf:"bytes,2,opt,name=Node" json:"Node,omitempty"`
}
func (m *NodeEventMessage) Reset() { *m = NodeEventMessage{} }
func (m *NodeEventMessage) String() string { return proto.CompactTextString(m) }
func (*NodeEventMessage) ProtoMessage() {}
func (*NodeEventMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{25} }
func (m *NodeEventMessage) GetEvent() uint32 {
if m != nil {
return m.Event
}
return 0
}
func (m *NodeEventMessage) GetNode() *Node {
if m != nil {
return m.Node
}
return nil
}
type NodeStatus struct {
Node *Node `protobuf:"bytes,1,opt,name=Node" json:"Node,omitempty"`
MaxSlices *MaxSlices `protobuf:"bytes,2,opt,name=MaxSlices" json:"MaxSlices,omitempty"`
@ -806,7 +831,7 @@ type NodeStatus struct {
func (m *NodeStatus) Reset() { *m = NodeStatus{} }
func (m *NodeStatus) String() string { return proto.CompactTextString(m) }
func (*NodeStatus) ProtoMessage() {}
func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{25} }
func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{26} }
func (m *NodeStatus) GetNode() *Node {
if m != nil {
@ -838,7 +863,7 @@ type ClusterStatus struct {
func (m *ClusterStatus) Reset() { *m = ClusterStatus{} }
func (m *ClusterStatus) String() string { return proto.CompactTextString(m) }
func (*ClusterStatus) ProtoMessage() {}
func (*ClusterStatus) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{26} }
func (*ClusterStatus) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{27} }
func (m *ClusterStatus) GetClusterID() string {
if m != nil {
@ -871,7 +896,7 @@ type Field struct {
func (m *Field) Reset() { *m = Field{} }
func (m *Field) String() string { return proto.CompactTextString(m) }
func (*Field) ProtoMessage() {}
func (*Field) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{27} }
func (*Field) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{28} }
func (m *Field) GetName() string {
if m != nil {
@ -910,7 +935,7 @@ type CreateViewMessage struct {
func (m *CreateViewMessage) Reset() { *m = CreateViewMessage{} }
func (m *CreateViewMessage) String() string { return proto.CompactTextString(m) }
func (*CreateViewMessage) ProtoMessage() {}
func (*CreateViewMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{28} }
func (*CreateViewMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{29} }
func (m *CreateViewMessage) GetIndex() string {
if m != nil {
@ -942,7 +967,7 @@ type DeleteViewMessage struct {
func (m *DeleteViewMessage) Reset() { *m = DeleteViewMessage{} }
func (m *DeleteViewMessage) String() string { return proto.CompactTextString(m) }
func (*DeleteViewMessage) ProtoMessage() {}
func (*DeleteViewMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{29} }
func (*DeleteViewMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{30} }
func (m *DeleteViewMessage) GetIndex() string {
if m != nil {
@ -977,7 +1002,7 @@ type ResizeInstruction struct {
func (m *ResizeInstruction) Reset() { *m = ResizeInstruction{} }
func (m *ResizeInstruction) String() string { return proto.CompactTextString(m) }
func (*ResizeInstruction) ProtoMessage() {}
func (*ResizeInstruction) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{30} }
func (*ResizeInstruction) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{31} }
func (m *ResizeInstruction) GetJobID() int64 {
if m != nil {
@ -1032,7 +1057,7 @@ type ResizeSource struct {
func (m *ResizeSource) Reset() { *m = ResizeSource{} }
func (m *ResizeSource) String() string { return proto.CompactTextString(m) }
func (*ResizeSource) ProtoMessage() {}
func (*ResizeSource) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{31} }
func (*ResizeSource) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{32} }
func (m *ResizeSource) GetNode() *Node {
if m != nil {
@ -1079,7 +1104,7 @@ func (m *ResizeInstructionComplete) Reset() { *m = ResizeInstructionComp
func (m *ResizeInstructionComplete) String() string { return proto.CompactTextString(m) }
func (*ResizeInstructionComplete) ProtoMessage() {}
func (*ResizeInstructionComplete) Descriptor() ([]byte, []int) {
return fileDescriptorPrivate, []int{32}
return fileDescriptorPrivate, []int{33}
}
func (m *ResizeInstructionComplete) GetJobID() int64 {
@ -1110,7 +1135,7 @@ type SetCoordinatorMessage struct {
func (m *SetCoordinatorMessage) Reset() { *m = SetCoordinatorMessage{} }
func (m *SetCoordinatorMessage) String() string { return proto.CompactTextString(m) }
func (*SetCoordinatorMessage) ProtoMessage() {}
func (*SetCoordinatorMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{33} }
func (*SetCoordinatorMessage) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{34} }
func (m *SetCoordinatorMessage) GetNew() *Node {
if m != nil {
@ -1127,7 +1152,7 @@ type Topology struct {
func (m *Topology) Reset() { *m = Topology{} }
func (m *Topology) String() string { return proto.CompactTextString(m) }
func (*Topology) ProtoMessage() {}
func (*Topology) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{34} }
func (*Topology) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{35} }
func (m *Topology) GetClusterID() string {
if m != nil {
@ -1149,7 +1174,7 @@ type RecalculateCaches struct {
func (m *RecalculateCaches) Reset() { *m = RecalculateCaches{} }
func (m *RecalculateCaches) String() string { return proto.CompactTextString(m) }
func (*RecalculateCaches) ProtoMessage() {}
func (*RecalculateCaches) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{35} }
func (*RecalculateCaches) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{36} }
func init() {
proto.RegisterType((*IndexMeta)(nil), "internal.IndexMeta")
@ -1177,6 +1202,7 @@ func init() {
proto.RegisterType((*URI)(nil), "internal.URI")
proto.RegisterType((*Node)(nil), "internal.Node")
proto.RegisterType((*NodeStateMessage)(nil), "internal.NodeStateMessage")
proto.RegisterType((*NodeEventMessage)(nil), "internal.NodeEventMessage")
proto.RegisterType((*NodeStatus)(nil), "internal.NodeStatus")
proto.RegisterType((*ClusterStatus)(nil), "internal.ClusterStatus")
proto.RegisterType((*Field)(nil), "internal.Field")
@ -2187,6 +2213,39 @@ func (m *NodeStateMessage) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *NodeEventMessage) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *NodeEventMessage) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Event != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Event))
}
if m.Node != nil {
dAtA[i] = 0x12
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Node.Size()))
n13, err := m.Node.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n13
}
return i, nil
}
func (m *NodeStatus) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -2206,32 +2265,32 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Node.Size()))
n13, err := m.Node.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n13
}
if m.MaxSlices != nil {
dAtA[i] = 0x12
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.MaxSlices.Size()))
n14, err := m.MaxSlices.MarshalTo(dAtA[i:])
n14, err := m.Node.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n14
}
if m.Schema != nil {
dAtA[i] = 0x1a
if m.MaxSlices != nil {
dAtA[i] = 0x12
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Schema.Size()))
n15, err := m.Schema.MarshalTo(dAtA[i:])
i = encodeVarintPrivate(dAtA, i, uint64(m.MaxSlices.Size()))
n15, err := m.MaxSlices.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n15
}
if m.Schema != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Schema.Size()))
n16, err := m.Schema.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n16
}
return i, nil
}
@ -2413,21 +2472,21 @@ func (m *ResizeInstruction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Node.Size()))
n16, err := m.Node.MarshalTo(dAtA[i:])
n17, err := m.Node.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n16
i += n17
}
if m.Coordinator != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Coordinator.Size()))
n17, err := m.Coordinator.MarshalTo(dAtA[i:])
n18, err := m.Coordinator.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n17
i += n18
}
if len(m.Sources) > 0 {
for _, msg := range m.Sources {
@ -2445,21 +2504,21 @@ func (m *ResizeInstruction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Schema.Size()))
n18, err := m.Schema.MarshalTo(dAtA[i:])
n19, err := m.Schema.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n18
i += n19
}
if m.ClusterStatus != nil {
dAtA[i] = 0x32
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.ClusterStatus.Size()))
n19, err := m.ClusterStatus.MarshalTo(dAtA[i:])
n20, err := m.ClusterStatus.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n19
i += n20
}
return i, nil
}
@ -2483,11 +2542,11 @@ func (m *ResizeSource) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Node.Size()))
n20, err := m.Node.MarshalTo(dAtA[i:])
n21, err := m.Node.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n20
i += n21
}
if len(m.Index) > 0 {
dAtA[i] = 0x12
@ -2539,11 +2598,11 @@ func (m *ResizeInstructionComplete) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Node.Size()))
n21, err := m.Node.MarshalTo(dAtA[i:])
n22, err := m.Node.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n21
i += n22
}
if len(m.Error) > 0 {
dAtA[i] = 0x1a
@ -2573,11 +2632,11 @@ func (m *SetCoordinatorMessage) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.New.Size()))
n22, err := m.New.MarshalTo(dAtA[i:])
n23, err := m.New.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n22
i += n23
}
return i, nil
}
@ -3106,6 +3165,19 @@ func (m *NodeStateMessage) Size() (n int) {
return n
}
func (m *NodeEventMessage) Size() (n int) {
var l int
_ = l
if m.Event != 0 {
n += 1 + sovPrivate(uint64(m.Event))
}
if m.Node != nil {
l = m.Node.Size()
n += 1 + l + sovPrivate(uint64(l))
}
return n
}
func (m *NodeStatus) Size() (n int) {
var l int
_ = l
@ -6745,6 +6817,108 @@ func (m *NodeStateMessage) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *NodeEventMessage) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowPrivate
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: NodeEventMessage: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: NodeEventMessage: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType)
}
m.Event = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowPrivate
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Event |= (uint32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Node", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowPrivate
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthPrivate
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Node == nil {
m.Node = &Node{}
}
if err := m.Node.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipPrivate(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthPrivate
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *NodeStatus) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -8354,87 +8528,88 @@ var (
func init() { proto.RegisterFile("private.proto", fileDescriptorPrivate) }
var fileDescriptorPrivate = []byte{
// 1306 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xdd, 0x6e, 0x1b, 0x45,
0x14, 0x66, 0xbd, 0xb6, 0x63, 0x1f, 0xd7, 0xa9, 0x33, 0x4d, 0x83, 0x13, 0x45, 0xae, 0x19, 0x15,
0x1a, 0x2a, 0x11, 0x15, 0x57, 0x42, 0x34, 0xa8, 0x52, 0x89, 0xed, 0xaa, 0x0b, 0x24, 0x94, 0x71,
0x1a, 0x24, 0x24, 0x90, 0x26, 0xf6, 0x90, 0xae, 0xb2, 0xde, 0x35, 0xbb, 0xe3, 0x24, 0xee, 0x05,
0x97, 0x08, 0x09, 0x71, 0x8f, 0xb8, 0xe5, 0x65, 0xb8, 0xe4, 0x11, 0x50, 0x78, 0x08, 0x24, 0x6e,
0x40, 0xf3, 0xb7, 0xbb, 0xfe, 0x0d, 0x09, 0xdc, 0xed, 0xf9, 0xe6, 0x9c, 0x33, 0xdf, 0x9c, 0xbf,
0x99, 0x85, 0xf2, 0x20, 0x74, 0x4f, 0x29, 0x67, 0xdb, 0x83, 0x30, 0xe0, 0x01, 0x2a, 0xb8, 0x3e,
0x67, 0xa1, 0x4f, 0x3d, 0xfc, 0x29, 0x14, 0x1d, 0xbf, 0xc7, 0xce, 0xf7, 0x18, 0xa7, 0xa8, 0x0e,
0xa5, 0x66, 0xe0, 0x0d, 0xfb, 0xfe, 0x27, 0xf4, 0x88, 0x79, 0x55, 0xab, 0x6e, 0x6d, 0x15, 0x49,
0x1a, 0x12, 0x1a, 0x07, 0x6e, 0x9f, 0x7d, 0x36, 0xa4, 0x3e, 0x1f, 0xf6, 0xab, 0x19, 0xa5, 0x91,
0x82, 0xf0, 0x5f, 0x16, 0x14, 0x9f, 0x86, 0xb4, 0xcf, 0xa4, 0xc7, 0x0d, 0x28, 0x90, 0xe0, 0x2c,
0xed, 0x2e, 0x96, 0xd1, 0x5b, 0xb0, 0xec, 0xf8, 0xa7, 0x2c, 0x8c, 0x58, 0xdb, 0xa7, 0x47, 0x1e,
0xeb, 0x49, 0x77, 0x05, 0x32, 0x81, 0xa2, 0x4d, 0x28, 0x36, 0x69, 0xf7, 0x25, 0x3b, 0x18, 0x0d,
0x58, 0xd5, 0x96, 0x4e, 0x12, 0x20, 0x5e, 0xed, 0xb8, 0xaf, 0x58, 0x35, 0x5b, 0xb7, 0xb6, 0xca,
0x24, 0x01, 0x26, 0xf9, 0xe6, 0xa6, 0xf8, 0x22, 0x0c, 0x37, 0x08, 0xf5, 0x8f, 0x63, 0x0e, 0x79,
0xc9, 0x61, 0x0c, 0x43, 0xf7, 0x20, 0xff, 0xd4, 0x65, 0x5e, 0x2f, 0xaa, 0x2e, 0xd5, 0xed, 0xad,
0x52, 0xe3, 0xe6, 0xb6, 0x89, 0xdf, 0xb6, 0xc4, 0x89, 0x5e, 0xc6, 0x18, 0x96, 0x9d, 0xfe, 0x20,
0x08, 0x39, 0x61, 0xd1, 0x20, 0xf0, 0x23, 0x86, 0x2a, 0x60, 0xb7, 0xc3, 0x50, 0x9f, 0x5d, 0x7c,
0xe2, 0x6f, 0xa1, 0xb2, 0xeb, 0x05, 0xdd, 0x93, 0x16, 0xe5, 0x94, 0xb0, 0x6f, 0x86, 0x2c, 0xe2,
0x68, 0x15, 0x72, 0x32, 0x0b, 0x5a, 0x4f, 0x09, 0x02, 0x95, 0x91, 0xd4, 0x61, 0x56, 0x82, 0x40,
0xa5, 0xbd, 0x0c, 0x45, 0x96, 0x28, 0x41, 0xa0, 0x1d, 0xcf, 0xed, 0xaa, 0x10, 0x64, 0x89, 0x12,
0x10, 0x82, 0xec, 0xa1, 0xcb, 0xce, 0xf4, 0xb9, 0xe5, 0x37, 0x76, 0x60, 0x25, 0xb5, 0xbf, 0xa6,
0xb9, 0x06, 0x79, 0x12, 0x9c, 0x39, 0xad, 0xa8, 0x6a, 0xd5, 0xed, 0xad, 0x2c, 0xd1, 0x92, 0x8c,
0xae, 0x4c, 0xbf, 0x58, 0xca, 0xc8, 0xa5, 0x04, 0xc0, 0xeb, 0x90, 0x93, 0xa1, 0x16, 0xa7, 0x4c,
0x6c, 0xc5, 0x27, 0xfe, 0xdb, 0x82, 0xe2, 0x1e, 0x3d, 0x97, 0x34, 0x22, 0xf4, 0x18, 0x0a, 0x1d,
0x4e, 0xfd, 0x1e, 0x0d, 0x7b, 0x52, 0xa9, 0xd4, 0x78, 0x23, 0x09, 0x61, 0xac, 0xb6, 0x6d, 0x74,
0xda, 0x3e, 0x0f, 0x47, 0x24, 0x36, 0x41, 0x3b, 0xb0, 0xa4, 0x6b, 0x42, 0x72, 0x28, 0x35, 0xea,
0xb3, 0xac, 0xe3, 0xb2, 0x11, 0xc6, 0xc6, 0x60, 0xe3, 0x03, 0x28, 0x8f, 0xb9, 0x15, 0x5c, 0x4f,
0xd8, 0xc8, 0x64, 0xe4, 0x84, 0x8d, 0x44, 0xec, 0x4e, 0xa9, 0x37, 0x54, 0x71, 0xce, 0x12, 0x25,
0xec, 0x64, 0xde, 0xb7, 0x36, 0x76, 0xe0, 0x46, 0xda, 0xeb, 0x55, 0x6c, 0xf1, 0x57, 0x80, 0x9a,
0x21, 0xa3, 0x9c, 0x49, 0x7a, 0x7b, 0x2c, 0x8a, 0xe8, 0x31, 0x9b, 0x9f, 0x69, 0x95, 0xbd, 0x4c,
0x3a, 0x7b, 0x9b, 0x50, 0x74, 0x22, 0x73, 0x70, 0x5b, 0xd6, 0x65, 0x02, 0xe0, 0xfb, 0x80, 0x5a,
0xcc, 0x63, 0x9c, 0xe9, 0xfe, 0x5d, 0xe0, 0x1f, 0x77, 0x0c, 0x97, 0xcb, 0x75, 0xd1, 0x3d, 0xc8,
0x8a, 0xd6, 0x95, 0x54, 0x4a, 0x8d, 0x5b, 0x49, 0xa4, 0xe3, 0x39, 0x41, 0xa4, 0x02, 0x76, 0x8d,
0x53, 0xdd, 0xee, 0x97, 0x1c, 0x70, 0x46, 0x29, 0x9b, 0xad, 0xec, 0xc9, 0xad, 0xe2, 0x01, 0xa2,
0xb7, 0x7a, 0x62, 0xce, 0x7a, 0xdd, 0xad, 0xf0, 0x71, 0x4c, 0x56, 0x74, 0xea, 0x75, 0xc8, 0xbe,
0x09, 0x39, 0x69, 0xab, 0xd9, 0x4e, 0xcd, 0x00, 0xb5, 0x8a, 0x0f, 0x63, 0xaa, 0xd7, 0xdd, 0x68,
0x35, 0xbd, 0x51, 0xd1, 0xf8, 0xfd, 0x42, 0xeb, 0x8a, 0x9e, 0xde, 0x17, 0x36, 0xca, 0x93, 0xfc,
0x9e, 0x9f, 0xb3, 0x89, 0x40, 0x0a, 0xdf, 0x62, 0x08, 0x44, 0x55, 0xbb, 0x6e, 0x0b, 0xdf, 0x52,
0xc0, 0x0f, 0x21, 0xdf, 0xe9, 0xbe, 0x64, 0x7d, 0x8a, 0xde, 0x16, 0x9d, 0xd6, 0x63, 0xe7, 0x2c,
0xd2, 0x7d, 0x7a, 0x73, 0x22, 0xff, 0xc4, 0xac, 0xe3, 0x1f, 0x2c, 0x7d, 0xa6, 0x39, 0x8c, 0xf2,
0x72, 0xef, 0xa8, 0x9a, 0x9d, 0x1a, 0x99, 0x02, 0x27, 0x7a, 0x19, 0xb5, 0xa1, 0xe2, 0xf8, 0x83,
0x21, 0x6f, 0xb1, 0xaf, 0x5d, 0xdf, 0xe5, 0x6e, 0xe0, 0x47, 0xd5, 0xbc, 0x34, 0x59, 0x4f, 0x6f,
0x3d, 0xa6, 0x41, 0xa6, 0x4c, 0xf0, 0x77, 0x16, 0xdc, 0x9c, 0x00, 0x2f, 0xe1, 0x95, 0x59, 0xcc,
0xeb, 0xbd, 0x78, 0xe6, 0xdb, 0x52, 0xb1, 0x36, 0x97, 0xcd, 0xf8, 0x15, 0xf0, 0x8b, 0x05, 0xab,
0xb3, 0x14, 0x66, 0xb2, 0xa9, 0x01, 0x3c, 0x0f, 0xdd, 0x3e, 0x0d, 0x47, 0x1f, 0xb3, 0x91, 0xbe,
0xfe, 0x52, 0x08, 0xfa, 0x1c, 0xd6, 0x26, 0x7c, 0x7d, 0xd8, 0x55, 0x21, 0x52, 0xa4, 0xee, 0xcc,
0x25, 0xa5, 0xf4, 0xc8, 0x1c, 0x73, 0xfc, 0xa7, 0x05, 0xb7, 0x67, 0x2e, 0x25, 0x35, 0x69, 0xa5,
0x6b, 0xf2, 0x3e, 0x54, 0x0e, 0xc5, 0x64, 0x6b, 0xb1, 0x88, 0xbb, 0x3e, 0x15, 0x9a, 0xba, 0x68,
0xa7, 0x70, 0xe4, 0x40, 0x41, 0x62, 0x7b, 0x74, 0xa0, 0x69, 0xbe, 0x73, 0x09, 0xcd, 0x6d, 0xa3,
0xaf, 0x07, 0xbf, 0x11, 0x05, 0x19, 0x79, 0x11, 0x99, 0x5b, 0x4d, 0x0a, 0x62, 0xa4, 0x8f, 0x19,
0x5c, 0x69, 0x2c, 0x07, 0xb0, 0x69, 0x46, 0xe1, 0x18, 0x93, 0xc5, 0x9d, 0xfa, 0x08, 0x20, 0x51,
0xd5, 0x13, 0x60, 0x41, 0x7d, 0xa6, 0x94, 0xf1, 0x33, 0xd8, 0x34, 0x73, 0xfa, 0x0a, 0x1b, 0x9a,
0x6a, 0xc9, 0x24, 0xd5, 0x82, 0xdb, 0x60, 0xbf, 0x20, 0x8e, 0xb8, 0xab, 0x65, 0xb7, 0x9a, 0x14,
0x69, 0x49, 0x98, 0x3c, 0x0b, 0x22, 0x6e, 0x4c, 0xc4, 0xb7, 0xc0, 0x9e, 0x07, 0x21, 0x97, 0x8c,
0xcb, 0x44, 0x7e, 0xe3, 0x2f, 0x21, 0xbb, 0x1f, 0xf4, 0x18, 0x5a, 0x86, 0x8c, 0xd3, 0xd2, 0x3e,
0x32, 0x4e, 0x0b, 0xdd, 0x91, 0xee, 0xf5, 0x0c, 0x29, 0x27, 0x87, 0x7b, 0x41, 0x1c, 0x22, 0x37,
0xbe, 0x0b, 0x65, 0x27, 0x6a, 0x06, 0x41, 0xd8, 0x13, 0xa9, 0x0e, 0x42, 0x7d, 0x27, 0x8d, 0x83,
0xf8, 0x09, 0x54, 0x84, 0xfb, 0x0e, 0xa7, 0x3c, 0x9e, 0xd4, 0x6b, 0x90, 0x17, 0x58, 0xbc, 0x9d,
0x96, 0xe4, 0xbd, 0x27, 0xf4, 0xcc, 0x00, 0x94, 0x02, 0xfe, 0xd1, 0x02, 0x30, 0x2e, 0x86, 0x11,
0xc2, 0x8a, 0xaf, 0x34, 0x2d, 0x35, 0x96, 0x13, 0x62, 0x02, 0x25, 0xea, 0x2c, 0xef, 0xa6, 0x5e,
0x1b, 0xd3, 0x53, 0x30, 0x5e, 0x22, 0xa9, 0x37, 0xc9, 0x96, 0x19, 0x7a, 0x3a, 0x9d, 0x95, 0x44,
0x5f, 0xe1, 0x3a, 0xb0, 0xe2, 0xa2, 0x2b, 0x37, 0xbd, 0x61, 0xc4, 0x59, 0xa8, 0x19, 0x89, 0x57,
0x91, 0x02, 0xe2, 0x13, 0x25, 0xc0, 0xec, 0x43, 0xa1, 0xbb, 0x90, 0x13, 0x4c, 0x4d, 0xe7, 0x4e,
0x1e, 0x43, 0x2d, 0xe2, 0x8e, 0x9e, 0xfd, 0x33, 0xa7, 0x05, 0x82, 0xac, 0x7c, 0x03, 0xeb, 0x04,
0xcb, 0xe7, 0x6f, 0x05, 0xec, 0x3d, 0x57, 0x55, 0xa4, 0x4d, 0xc4, 0xa7, 0x44, 0xe8, 0xb9, 0xec,
0x18, 0x81, 0x50, 0x71, 0xfb, 0xaf, 0xa8, 0x92, 0x17, 0xd3, 0xfe, 0x3a, 0x37, 0x92, 0x79, 0x46,
0xda, 0xa9, 0x67, 0x64, 0x07, 0x56, 0x54, 0x59, 0xff, 0x9f, 0x4e, 0x7f, 0xce, 0xc0, 0x0a, 0x61,
0x91, 0xfb, 0x8a, 0x39, 0x7e, 0xc4, 0xc3, 0x61, 0x3c, 0x92, 0x3e, 0x0a, 0x8e, 0x74, 0xa8, 0x6d,
0xa2, 0x84, 0xb8, 0x2c, 0x32, 0x0b, 0xca, 0xe2, 0x81, 0xf8, 0xa1, 0x19, 0xaf, 0xd7, 0x69, 0xd5,
0xb4, 0x0a, 0x7a, 0x00, 0x4b, 0x9d, 0x60, 0x18, 0x76, 0xe3, 0x8b, 0x6b, 0x2d, 0xd1, 0x56, 0xcc,
0xd4, 0x32, 0x31, 0x6a, 0xa9, 0x3a, 0xca, 0x2d, 0xae, 0x23, 0xf4, 0x78, 0xa2, 0x8e, 0xe4, 0xbf,
0x46, 0xa9, 0xf1, 0x7a, 0x62, 0x30, 0xb6, 0x4c, 0xc6, 0xb5, 0xf1, 0xf7, 0x16, 0xdc, 0x48, 0x53,
0xf8, 0x57, 0x8d, 0x11, 0x67, 0x24, 0x33, 0x33, 0x23, 0xf6, 0xac, 0x8c, 0x64, 0x93, 0x8c, 0x24,
0x2f, 0xd3, 0x5c, 0xea, 0x65, 0x8a, 0x4f, 0x60, 0x7d, 0x2a, 0x4d, 0xcd, 0xa0, 0x3f, 0x10, 0xf5,
0xf0, 0x1f, 0xd2, 0xb5, 0x0a, 0xb9, 0x76, 0x18, 0xea, 0x44, 0x15, 0x89, 0x12, 0xf0, 0x23, 0xb8,
0xdd, 0x61, 0x3c, 0x95, 0x24, 0x53, 0x6d, 0x75, 0xb0, 0xf7, 0xd9, 0xd9, 0x9c, 0xe3, 0x8b, 0x25,
0xbc, 0x0b, 0x85, 0x83, 0x60, 0x10, 0x78, 0xc1, 0xf1, 0xe8, 0x92, 0xa6, 0xad, 0xc2, 0x92, 0x9a,
0x49, 0xea, 0x61, 0x50, 0x24, 0x46, 0xc4, 0xb7, 0x44, 0x49, 0x76, 0xa9, 0xd7, 0x1d, 0x7a, 0x94,
0x33, 0xf9, 0xbf, 0x13, 0xed, 0x56, 0x7e, 0xbd, 0xa8, 0x59, 0xbf, 0x5d, 0xd4, 0xac, 0xdf, 0x2f,
0x6a, 0xd6, 0x4f, 0x7f, 0xd4, 0x5e, 0x3b, 0xca, 0xcb, 0x3f, 0xeb, 0x87, 0xff, 0x04, 0x00, 0x00,
0xff, 0xff, 0xd7, 0xef, 0xfa, 0x68, 0x6a, 0x0f, 0x00, 0x00,
// 1325 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0x1b, 0x45,
0x14, 0x67, 0xbd, 0xb6, 0x13, 0xbf, 0xd4, 0xa9, 0x33, 0x6d, 0x83, 0x5b, 0x45, 0xae, 0x19, 0x15,
0x1a, 0x2a, 0x11, 0x95, 0x54, 0x42, 0xb4, 0xa8, 0x52, 0xa9, 0xed, 0xaa, 0x0b, 0x4d, 0x29, 0xe3,
0xb6, 0x48, 0x48, 0x20, 0x4d, 0xec, 0x21, 0x5d, 0x65, 0xbd, 0x6b, 0x76, 0xc7, 0x49, 0xdc, 0x03,
0x47, 0x84, 0x84, 0xb8, 0x23, 0xae, 0x7c, 0x19, 0x8e, 0x7c, 0x04, 0x54, 0x3e, 0x04, 0x12, 0x17,
0xd0, 0xbc, 0x99, 0xd9, 0x5d, 0xff, 0x4b, 0x9a, 0xc0, 0x6d, 0xdf, 0x6f, 0xde, 0x7b, 0xf3, 0x9b,
0xf7, 0x6f, 0x66, 0xa1, 0x3a, 0x8c, 0xfd, 0x03, 0x2e, 0xc5, 0xd6, 0x30, 0x8e, 0x64, 0x44, 0x96,
0xfd, 0x50, 0x8a, 0x38, 0xe4, 0x01, 0xfd, 0x0c, 0x2a, 0x5e, 0xd8, 0x17, 0x47, 0x3b, 0x42, 0x72,
0xd2, 0x84, 0x95, 0x56, 0x14, 0x8c, 0x06, 0xe1, 0x23, 0xbe, 0x2b, 0x82, 0xba, 0xd3, 0x74, 0x36,
0x2b, 0x2c, 0x0f, 0x29, 0x8d, 0xa7, 0xfe, 0x40, 0x7c, 0x3e, 0xe2, 0xa1, 0x1c, 0x0d, 0xea, 0x05,
0xad, 0x91, 0x83, 0xe8, 0xdf, 0x0e, 0x54, 0x1e, 0xc4, 0x7c, 0x20, 0xd0, 0xe3, 0x15, 0x58, 0x66,
0xd1, 0x61, 0xde, 0x5d, 0x2a, 0x93, 0x77, 0x60, 0xd5, 0x0b, 0x0f, 0x44, 0x9c, 0x88, 0x4e, 0xc8,
0x77, 0x03, 0xd1, 0x47, 0x77, 0xcb, 0x6c, 0x0a, 0x25, 0x1b, 0x50, 0x69, 0xf1, 0xde, 0x0b, 0xf1,
0x74, 0x3c, 0x14, 0x75, 0x17, 0x9d, 0x64, 0x40, 0xba, 0xda, 0xf5, 0x5f, 0x8a, 0x7a, 0xb1, 0xe9,
0x6c, 0x56, 0x59, 0x06, 0x4c, 0xf3, 0x2d, 0xcd, 0xf0, 0x25, 0x14, 0xce, 0x31, 0x1e, 0xee, 0xa5,
0x1c, 0xca, 0xc8, 0x61, 0x02, 0x23, 0xd7, 0xa1, 0xfc, 0xc0, 0x17, 0x41, 0x3f, 0xa9, 0x2f, 0x35,
0xdd, 0xcd, 0x95, 0xed, 0xf3, 0x5b, 0x36, 0x7e, 0x5b, 0x88, 0x33, 0xb3, 0x4c, 0x29, 0xac, 0x7a,
0x83, 0x61, 0x14, 0x4b, 0x26, 0x92, 0x61, 0x14, 0x26, 0x82, 0xd4, 0xc0, 0xed, 0xc4, 0xb1, 0x39,
0xbb, 0xfa, 0xa4, 0xdf, 0x41, 0xed, 0x7e, 0x10, 0xf5, 0xf6, 0xdb, 0x5c, 0x72, 0x26, 0xbe, 0x1d,
0x89, 0x44, 0x92, 0x8b, 0x50, 0xc2, 0x2c, 0x18, 0x3d, 0x2d, 0x28, 0x14, 0x23, 0x69, 0xc2, 0xac,
0x05, 0x85, 0xa2, 0x3d, 0x86, 0xa2, 0xc8, 0xb4, 0xa0, 0xd0, 0x6e, 0xe0, 0xf7, 0x74, 0x08, 0x8a,
0x4c, 0x0b, 0x84, 0x40, 0xf1, 0xb9, 0x2f, 0x0e, 0xcd, 0xb9, 0xf1, 0x9b, 0x7a, 0xb0, 0x96, 0xdb,
0xdf, 0xd0, 0x5c, 0x87, 0x32, 0x8b, 0x0e, 0xbd, 0x76, 0x52, 0x77, 0x9a, 0xee, 0x66, 0x91, 0x19,
0x09, 0xa3, 0x8b, 0xe9, 0x57, 0x4b, 0x05, 0x5c, 0xca, 0x00, 0x7a, 0x19, 0x4a, 0x18, 0x6a, 0x75,
0xca, 0xcc, 0x56, 0x7d, 0xd2, 0x7f, 0x1c, 0xa8, 0xec, 0xf0, 0x23, 0xa4, 0x91, 0x90, 0xbb, 0xb0,
0xdc, 0x95, 0x3c, 0xec, 0xf3, 0xb8, 0x8f, 0x4a, 0x2b, 0xdb, 0x6f, 0x65, 0x21, 0x4c, 0xd5, 0xb6,
0xac, 0x4e, 0x27, 0x94, 0xf1, 0x98, 0xa5, 0x26, 0xe4, 0x0e, 0x2c, 0x99, 0x9a, 0x40, 0x0e, 0x2b,
0xdb, 0xcd, 0x79, 0xd6, 0x69, 0xd9, 0x28, 0x63, 0x6b, 0x70, 0xe5, 0x23, 0xa8, 0x4e, 0xb8, 0x55,
0x5c, 0xf7, 0xc5, 0xd8, 0x66, 0x64, 0x5f, 0x8c, 0x55, 0xec, 0x0e, 0x78, 0x30, 0xd2, 0x71, 0x2e,
0x32, 0x2d, 0xdc, 0x29, 0x7c, 0xe8, 0x5c, 0xb9, 0x03, 0xe7, 0xf2, 0x5e, 0x4f, 0x63, 0x4b, 0xbf,
0x06, 0xd2, 0x8a, 0x05, 0x97, 0x02, 0xe9, 0xed, 0x88, 0x24, 0xe1, 0x7b, 0x62, 0x71, 0xa6, 0x75,
0xf6, 0x0a, 0xf9, 0xec, 0x6d, 0x40, 0xc5, 0x4b, 0xec, 0xc1, 0x5d, 0xac, 0xcb, 0x0c, 0xa0, 0x37,
0x80, 0xb4, 0x45, 0x20, 0xa4, 0x30, 0xfd, 0x7b, 0x8c, 0x7f, 0xda, 0xb5, 0x5c, 0x4e, 0xd6, 0x25,
0xd7, 0xa1, 0xa8, 0x5a, 0x17, 0xa9, 0xac, 0x6c, 0x5f, 0xc8, 0x22, 0x9d, 0xce, 0x09, 0x86, 0x0a,
0xd4, 0xb7, 0x4e, 0x4d, 0xbb, 0x9f, 0x70, 0xc0, 0x39, 0xa5, 0x6c, 0xb7, 0x72, 0xa7, 0xb7, 0x4a,
0x07, 0x88, 0xd9, 0xea, 0x9e, 0x3d, 0xeb, 0x59, 0xb7, 0xa2, 0x7b, 0x29, 0x59, 0xd5, 0xa9, 0x67,
0x21, 0xfb, 0x36, 0x94, 0xd0, 0xd6, 0xb0, 0x9d, 0x99, 0x01, 0x7a, 0x95, 0x3e, 0x4f, 0xa9, 0x9e,
0x75, 0xa3, 0x8b, 0xf9, 0x8d, 0x2a, 0xd6, 0xef, 0x97, 0x46, 0x57, 0xf5, 0xf4, 0x63, 0x65, 0xa3,
0x3d, 0xe1, 0xf7, 0xe2, 0x9c, 0x4d, 0x05, 0x52, 0xf9, 0x56, 0x43, 0x20, 0xa9, 0xbb, 0x4d, 0x57,
0xf9, 0x46, 0x81, 0xde, 0x82, 0x72, 0xb7, 0xf7, 0x42, 0x0c, 0x38, 0x79, 0x57, 0x75, 0x5a, 0x5f,
0x1c, 0x89, 0xc4, 0xf4, 0xe9, 0xf9, 0xa9, 0xfc, 0x33, 0xbb, 0x4e, 0x7f, 0x74, 0xcc, 0x99, 0x16,
0x30, 0x2a, 0xe3, 0xde, 0x49, 0xbd, 0x38, 0x33, 0x32, 0x15, 0xce, 0xcc, 0x32, 0xe9, 0x40, 0xcd,
0x0b, 0x87, 0x23, 0xd9, 0x16, 0xdf, 0xf8, 0xa1, 0x2f, 0xfd, 0x28, 0x4c, 0xea, 0x65, 0x34, 0xb9,
0x9c, 0xdf, 0x7a, 0x42, 0x83, 0xcd, 0x98, 0xd0, 0xef, 0x1d, 0x38, 0x3f, 0x05, 0x9e, 0xc0, 0xab,
0x70, 0x3c, 0xaf, 0x0f, 0xd2, 0x99, 0xef, 0xa2, 0x62, 0x63, 0x21, 0x9b, 0xc9, 0x2b, 0xe0, 0x57,
0x07, 0x2e, 0xce, 0x53, 0x98, 0xcb, 0xa6, 0x01, 0xf0, 0x24, 0xf6, 0x07, 0x3c, 0x1e, 0x7f, 0x2a,
0xc6, 0xe6, 0xfa, 0xcb, 0x21, 0xe4, 0x0b, 0x58, 0x9f, 0xf2, 0xf5, 0x71, 0x4f, 0x87, 0x48, 0x93,
0xba, 0xba, 0x90, 0x94, 0xd6, 0x63, 0x0b, 0xcc, 0xe9, 0x5f, 0x0e, 0x5c, 0x9a, 0xbb, 0x94, 0xd5,
0xa4, 0x93, 0xaf, 0xc9, 0x1b, 0x50, 0x7b, 0xae, 0x26, 0x5b, 0x5b, 0x24, 0xd2, 0x0f, 0xb9, 0xd2,
0x34, 0x45, 0x3b, 0x83, 0x13, 0x0f, 0x96, 0x11, 0xdb, 0xe1, 0x43, 0x43, 0xf3, 0xbd, 0x13, 0x68,
0x6e, 0x59, 0x7d, 0x33, 0xf8, 0xad, 0xa8, 0xc8, 0xe0, 0x45, 0x64, 0x6f, 0x35, 0x14, 0xd4, 0x48,
0x9f, 0x30, 0x38, 0xd5, 0x58, 0x8e, 0x60, 0xc3, 0x8e, 0xc2, 0x09, 0x26, 0xc7, 0x77, 0xea, 0x6d,
0x80, 0x4c, 0xd5, 0x4c, 0x80, 0x63, 0xea, 0x33, 0xa7, 0x4c, 0x1f, 0xc2, 0x86, 0x9d, 0xd3, 0xa7,
0xd8, 0xd0, 0x56, 0x4b, 0x21, 0xab, 0x16, 0xda, 0x01, 0xf7, 0x19, 0xf3, 0xd4, 0x5d, 0x8d, 0xdd,
0x6a, 0x53, 0x64, 0x24, 0x65, 0xf2, 0x30, 0x4a, 0xa4, 0x35, 0x51, 0xdf, 0x0a, 0x7b, 0x12, 0xc5,
0x12, 0x19, 0x57, 0x19, 0x7e, 0xd3, 0xaf, 0xa0, 0xf8, 0x38, 0xea, 0x0b, 0xb2, 0x0a, 0x05, 0xaf,
0x6d, 0x7c, 0x14, 0xbc, 0x36, 0xb9, 0x8a, 0xee, 0xcd, 0x0c, 0xa9, 0x66, 0x87, 0x7b, 0xc6, 0x3c,
0x86, 0x1b, 0x5f, 0x83, 0xaa, 0x97, 0xb4, 0xa2, 0x28, 0xee, 0xab, 0x54, 0x47, 0xb1, 0xb9, 0x93,
0x26, 0x41, 0x7a, 0x0f, 0x6a, 0xca, 0x7d, 0x57, 0x72, 0x99, 0x4e, 0xea, 0x75, 0x28, 0x2b, 0x2c,
0xdd, 0xce, 0x48, 0x78, 0xef, 0x29, 0x3d, 0x3b, 0x00, 0x51, 0xa0, 0x8f, 0xb4, 0x87, 0xce, 0x81,
0x08, 0x65, 0x2e, 0x4a, 0x28, 0xa3, 0x83, 0x2a, 0xd3, 0x02, 0xa1, 0xfa, 0x28, 0x86, 0xf3, 0x6a,
0xc6, 0x59, 0xa1, 0x0c, 0xd7, 0xe8, 0x4f, 0x0e, 0x80, 0x25, 0x34, 0x4a, 0x52, 0x13, 0x67, 0xb1,
0x09, 0x79, 0x3f, 0xf7, 0x76, 0x99, 0x9d, 0xa9, 0xe9, 0x12, 0xcb, 0xbd, 0x70, 0x36, 0xed, 0x08,
0x35, 0xc5, 0x51, 0xcb, 0xf4, 0x35, 0x6e, 0xd2, 0xa4, 0xae, 0xcd, 0x6a, 0x2b, 0x18, 0x25, 0x52,
0xc4, 0x86, 0x91, 0x7a, 0x63, 0x69, 0x20, 0x8d, 0x4f, 0x06, 0xcc, 0x0f, 0x11, 0xb9, 0x06, 0x25,
0xc5, 0xd4, 0xce, 0x81, 0xe9, 0x63, 0xe8, 0x45, 0xda, 0x35, 0x37, 0xc9, 0xdc, 0xd9, 0x43, 0xa0,
0x88, 0x2f, 0x6a, 0x53, 0x2e, 0xf8, 0x98, 0xae, 0x81, 0xbb, 0xe3, 0xeb, 0xfa, 0x76, 0x99, 0xfa,
0x44, 0x84, 0x1f, 0x61, 0xff, 0x29, 0x84, 0xab, 0xb7, 0xc4, 0x9a, 0x6e, 0x20, 0x75, 0x77, 0x9c,
0xe5, 0x7e, 0xb3, 0x8f, 0x52, 0x37, 0xf7, 0x28, 0xed, 0xc2, 0x9a, 0x6e, 0x92, 0xff, 0xd3, 0xe9,
0x2f, 0x05, 0x58, 0x63, 0x22, 0xf1, 0x5f, 0x0a, 0x2f, 0x4c, 0x64, 0x3c, 0x4a, 0x07, 0xdc, 0x27,
0xd1, 0xae, 0x09, 0xb5, 0xcb, 0xb4, 0xf0, 0x3a, 0x95, 0x44, 0x6e, 0xaa, 0xdf, 0xa3, 0xc9, 0xea,
0x9f, 0x55, 0xcd, 0xab, 0x90, 0x9b, 0xb0, 0xd4, 0x8d, 0x46, 0x71, 0x2f, 0xbd, 0x06, 0xd7, 0x33,
0x6d, 0xcd, 0x4c, 0x2f, 0x33, 0xab, 0x96, 0xab, 0xa3, 0xd2, 0xf1, 0x75, 0x44, 0xee, 0x4e, 0xd5,
0x11, 0xfe, 0xb9, 0xac, 0x6c, 0xbf, 0x99, 0x19, 0x4c, 0x2c, 0xb3, 0x49, 0x6d, 0xfa, 0x83, 0x03,
0xe7, 0xf2, 0x14, 0x5e, 0xab, 0x31, 0xd2, 0x8c, 0x14, 0xe6, 0x66, 0xc4, 0x9d, 0x97, 0x91, 0x62,
0x96, 0x91, 0xec, 0x9d, 0x5b, 0xca, 0xbd, 0x73, 0xe9, 0x3e, 0x5c, 0x9e, 0x49, 0x53, 0x2b, 0x1a,
0x0c, 0x55, 0x3d, 0xfc, 0x87, 0x74, 0xa9, 0x91, 0x11, 0xc7, 0x26, 0x51, 0x15, 0xa6, 0x05, 0x7a,
0x1b, 0x2e, 0x75, 0x85, 0xcc, 0x25, 0xc9, 0x56, 0x5b, 0x13, 0xdc, 0xc7, 0xe2, 0x70, 0xc1, 0xf1,
0xd5, 0x12, 0xbd, 0x0f, 0xcb, 0x4f, 0xa3, 0x61, 0x14, 0x44, 0x7b, 0xe3, 0x13, 0x9a, 0xb6, 0x0e,
0x4b, 0x7a, 0xc2, 0xe9, 0x67, 0x46, 0x85, 0x59, 0x91, 0x5e, 0x50, 0x25, 0xd9, 0xe3, 0x41, 0x6f,
0x14, 0x70, 0x29, 0xf0, 0xef, 0x29, 0xb9, 0x5f, 0xfb, 0xed, 0x55, 0xc3, 0xf9, 0xfd, 0x55, 0xc3,
0xf9, 0xe3, 0x55, 0xc3, 0xf9, 0xf9, 0xcf, 0xc6, 0x1b, 0xbb, 0x65, 0xfc, 0x4f, 0xbf, 0xf5, 0x6f,
0x00, 0x00, 0x00, 0xff, 0xff, 0x30, 0x4b, 0x92, 0xf6, 0xb8, 0x0f, 0x00, 0x00,
}

View file

@ -144,6 +144,11 @@ message NodeStateMessage {
string State = 2;
}
message NodeEventMessage {
uint32 Event = 1;
Node Node = 2;
}
message NodeStatus {
Node Node = 1;
MaxSlices MaxSlices = 2;

View file

@ -463,6 +463,8 @@ func (s *Server) ReceiveMessage(pb proto.Message) error {
}
case *internal.RecalculateCaches:
s.Holder.RecalculateCaches()
case *internal.NodeEventMessage:
s.Cluster.ReceiveEvent(DecodeNodeEvent(obj))
}
return nil