From 7a59e8da42783804dab2d8cd6609410b480febeb Mon Sep 17 00:00:00 2001 From: Manish R Jain Date: Thu, 8 Nov 2018 11:36:44 -0800 Subject: [PATCH] Do not retry proposal if already found in CommittedEntries (#2740) This is the first win from Open Census. Learnt that proposals immediately show up in `raft.Ready().CommittedEntries`, but then take a long time in the `applyCh` queue to be applied. If these proposals are just waiting in the queue to be applied, then we're sure that Raft didn't lose them in flight, and therefore, we don't need to re-propose them. This PR detects that and avoids retrying the proposal. --- conn/raft_server.go | 5 +- protos/pb.proto | 15 +- protos/pb/pb.pb.go | 543 +++++++++++++++++++++++--------------------- worker/draft.go | 130 ++++++----- worker/proposal.go | 51 +++-- 5 files changed, 404 insertions(+), 340 deletions(-) diff --git a/conn/raft_server.go b/conn/raft_server.go index c6f27fd1155..73e4ab212ce 100644 --- a/conn/raft_server.go +++ b/conn/raft_server.go @@ -52,8 +52,9 @@ func (r *lockedSource) Seed(seed int64) { } type ProposalCtx struct { - Ch chan error - Ctx context.Context + Found uint32 + Ch chan error + Ctx context.Context } type proposals struct { diff --git a/protos/pb.proto b/protos/pb.proto index bec54f12bc1..7c01698a021 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -211,13 +211,14 @@ message Snapshot { } message Proposal { - Mutations mutations = 2; - repeated KV kv = 4; - MembershipState state = 5; - string clean_predicate = 6; // Delete the predicate which was moved to other group. - string key = 7; - OracleDelta delta = 8; - Snapshot snapshot = 9; // Used to tell the group when to take snapshot. + Mutations mutations = 2; + repeated KV kv = 4; + MembershipState state = 5; + string clean_predicate = 6; // Delete the predicate which was moved to other group. + string key = 7; + OracleDelta delta = 8; + Snapshot snapshot = 9; // Used to tell the group when to take snapshot. + uint64 index = 10; // Used to store Raft index, in raft.Ready. } message KVS { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 43ced2c8d3b..81ba22b63dd 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{17, 0} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{24, 0} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{24, 1} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{36, 0} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{36, 0} } type ExportPayload_Status int32 @@ -179,7 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{39, 0} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{39, 0} } type List struct { @@ -193,7 +193,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{0} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -241,7 +241,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{1} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -297,7 +297,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{2} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +370,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{3} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +487,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{4} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -534,7 +534,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{5} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +587,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{6} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +678,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{7} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +743,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{8} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +818,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{9} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +868,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{10} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +945,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{11} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1035,7 +1035,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{12} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1096,7 +1096,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{13} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1202,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{14} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1300,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{15} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1366,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{16} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1456,7 +1456,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{17} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1564,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{18} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1646,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{19} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1697,7 +1697,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{20} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1762,6 +1762,7 @@ type Proposal struct { Key string `protobuf:"bytes,7,opt,name=key,proto3" json:"key,omitempty"` Delta *OracleDelta `protobuf:"bytes,8,opt,name=delta" json:"delta,omitempty"` Snapshot *Snapshot `protobuf:"bytes,9,opt,name=snapshot" json:"snapshot,omitempty"` + Index uint64 `protobuf:"varint,10,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1771,7 +1772,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{21} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1849,6 +1850,13 @@ func (m *Proposal) GetSnapshot() *Snapshot { return nil } +func (m *Proposal) GetIndex() uint64 { + if m != nil { + return m.Index + } + return 0 +} + type KVS struct { Kv []*KV `protobuf:"bytes,1,rep,name=kv" json:"kv,omitempty"` // done used to indicate if the stream of KVS is over. @@ -1862,7 +1870,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{22} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1919,7 +1927,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{23} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1998,7 +2006,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{24} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2112,7 +2120,7 @@ func (m *UidBlock) Reset() { *m = UidBlock{} } func (m *UidBlock) String() string { return proto.CompactTextString(m) } func (*UidBlock) ProtoMessage() {} func (*UidBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{25} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{25} } func (m *UidBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2167,7 +2175,7 @@ func (m *UidPack) Reset() { *m = UidPack{} } func (m *UidPack) String() string { return proto.CompactTextString(m) } func (*UidPack) ProtoMessage() {} func (*UidPack) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{26} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{26} } func (m *UidPack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2223,7 +2231,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{27} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{27} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2285,7 +2293,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{28} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{28} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2348,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{29} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{29} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2394,7 +2402,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{30} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{30} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2441,7 +2449,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{31} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{31} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2490,7 +2498,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{32} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{32} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2554,7 +2562,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{33} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{33} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2619,7 +2627,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{34} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{34} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2680,7 +2688,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{35} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{35} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2734,7 +2742,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{36} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{36} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2834,7 +2842,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{37} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{37} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2898,7 +2906,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{38} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{38} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2972,7 +2980,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{39} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{39} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3041,7 +3049,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{40} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{40} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3096,7 +3104,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{41} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{41} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,7 +3158,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{42} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{42} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3197,7 +3205,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{43} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{43} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3245,7 +3253,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{44} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{44} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3308,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{45} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{45} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3357,7 +3365,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{46} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{46} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3419,7 +3427,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{47} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{47} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3476,7 +3484,7 @@ func (m *Status) Reset() { *m = Status{} } func (m *Status) String() string { return proto.CompactTextString(m) } func (*Status) ProtoMessage() {} func (*Status) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{48} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{48} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3533,7 +3541,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_d366d8792d76fc2b, []int{49} + return fileDescriptor_pb_dfad8aaebbd1dd59, []int{49} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5978,6 +5986,11 @@ func (m *Proposal) MarshalTo(dAtA []byte) (int, error) { } i += n20 } + if m.Index != 0 { + dAtA[i] = 0x50 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.Index)) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -7874,6 +7887,9 @@ func (m *Proposal) Size() (n int) { l = m.Snapshot.Size() n += 1 + l + sovPb(uint64(l)) } + if m.Index != 0 { + n += 1 + sovPb(uint64(m.Index)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12542,6 +12558,25 @@ func (m *Proposal) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) @@ -16080,208 +16115,208 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_d366d8792d76fc2b) } +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_dfad8aaebbd1dd59) } -var fileDescriptor_pb_d366d8792d76fc2b = []byte{ - // 3195 bytes of a gzipped FileDescriptorProto +var fileDescriptor_pb_dfad8aaebbd1dd59 = []byte{ + // 3199 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xcb, 0x72, 0xe3, 0x56, 0x76, 0x02, 0x48, 0x82, 0xc0, 0x21, 0xa9, 0xa6, 0xaf, 0x3b, 0x6d, 0x9a, 0x76, 0xd4, 0x32, 0xdc, 0x0f, 0x75, 0xdb, 0x56, 0xda, 0xb2, 0x13, 0x3f, 0x76, 0x6a, 0x91, 0xea, 0xa2, 0x5b, 0xaf, 0x5c, 0x52, 0xed, 0xc4, 0x0b, 0xb3, 0x20, 0xe0, 0x8a, 0x42, 0x04, 0x02, 0x08, 0x2e, 0xa8, 0xa2, 0x7a, - 0x97, 0x4d, 0xbe, 0xc1, 0xab, 0x2c, 0xb2, 0x4c, 0x7e, 0x60, 0xe6, 0x03, 0xa6, 0x6a, 0x6a, 0x56, - 0xde, 0xce, 0x6e, 0xaa, 0x67, 0x35, 0xeb, 0xa9, 0xa9, 0x59, 0xcc, 0x66, 0xea, 0x9e, 0x7b, 0xf1, - 0x20, 0x5b, 0x52, 0xdb, 0x53, 0x35, 0x2b, 0xe2, 0xbc, 0xee, 0xe3, 0x9c, 0x73, 0xcf, 0x8b, 0x60, - 0xc6, 0x27, 0x9b, 0x71, 0x12, 0xa5, 0x11, 0xd1, 0xe3, 0x93, 0xae, 0xe5, 0xc4, 0xbe, 0x04, 0xed, - 0x2e, 0x54, 0xf7, 0x7c, 0x9e, 0x12, 0x02, 0xd5, 0x99, 0xef, 0xf1, 0x8e, 0xb6, 0x5e, 0xd9, 0x30, - 0x28, 0x7e, 0xdb, 0xfb, 0x60, 0x8d, 0x1c, 0x7e, 0xfe, 0xc2, 0x09, 0x66, 0x8c, 0xb4, 0xa1, 0x72, - 0xe1, 0x04, 0x1d, 0x6d, 0x5d, 0xdb, 0x68, 0x52, 0xf1, 0x49, 0x36, 0xc1, 0xbc, 0x70, 0x82, 0x71, - 0x7a, 0x19, 0xb3, 0x8e, 0xbe, 0xae, 0x6d, 0xac, 0x6e, 0xbd, 0xbd, 0x19, 0x9f, 0x6c, 0x1e, 0x45, - 0x3c, 0xf5, 0xc3, 0xc9, 0xe6, 0x0b, 0x27, 0x18, 0x5d, 0xc6, 0x8c, 0xd6, 0x2f, 0xe4, 0x87, 0x7d, - 0x08, 0x8d, 0x61, 0xe2, 0xee, 0xce, 0x42, 0x37, 0xf5, 0xa3, 0x50, 0xec, 0x18, 0x3a, 0x53, 0x86, - 0x2b, 0x5a, 0x14, 0xbf, 0x05, 0xce, 0x49, 0x26, 0xbc, 0x53, 0x59, 0xaf, 0x08, 0x9c, 0xf8, 0x26, - 0x1d, 0xa8, 0xfb, 0x7c, 0x27, 0x9a, 0x85, 0x69, 0xa7, 0xba, 0xae, 0x6d, 0x98, 0x34, 0x03, 0xed, - 0x3f, 0xea, 0x50, 0xfb, 0xd7, 0x19, 0x4b, 0x2e, 0x51, 0x2e, 0x4d, 0x93, 0x6c, 0x2d, 0xf1, 0x4d, - 0x6e, 0x43, 0x2d, 0x70, 0xc2, 0x09, 0xef, 0xe8, 0xb8, 0x98, 0x04, 0xc8, 0x7b, 0x60, 0x39, 0xa7, - 0x29, 0x4b, 0xc6, 0x33, 0xdf, 0xeb, 0x54, 0xd6, 0xb5, 0x0d, 0x83, 0x9a, 0x88, 0x38, 0xf6, 0x3d, - 0xf2, 0x2e, 0x98, 0x5e, 0x34, 0x76, 0xcb, 0x7b, 0x79, 0x11, 0xee, 0x45, 0x3e, 0x04, 0x73, 0xe6, - 0x7b, 0xe3, 0xc0, 0xe7, 0x69, 0xa7, 0xb6, 0xae, 0x6d, 0x34, 0xb6, 0x4c, 0x71, 0x59, 0xa1, 0x3b, - 0x5a, 0x9f, 0xf9, 0x1e, 0x2a, 0xf1, 0x31, 0x98, 0x3c, 0x71, 0xc7, 0xa7, 0xb3, 0xd0, 0xed, 0x18, - 0xc8, 0x74, 0x4b, 0x30, 0x95, 0x6e, 0x4d, 0xeb, 0x5c, 0x02, 0xe2, 0x5a, 0x09, 0xbb, 0x60, 0x09, - 0x67, 0x9d, 0xba, 0xdc, 0x4a, 0x81, 0xe4, 0x09, 0x34, 0x4e, 0x1d, 0x97, 0xa5, 0xe3, 0xd8, 0x49, - 0x9c, 0x69, 0xc7, 0x2c, 0x16, 0xda, 0x15, 0xe8, 0x23, 0x81, 0xe5, 0x14, 0x4e, 0x73, 0x80, 0x7c, - 0x06, 0x2d, 0x84, 0xf8, 0xf8, 0xd4, 0x0f, 0x52, 0x96, 0x74, 0x2c, 0x94, 0x59, 0x45, 0x19, 0xc4, - 0x8c, 0x12, 0xc6, 0x68, 0x53, 0x32, 0x49, 0x0c, 0xf9, 0x47, 0x00, 0x36, 0x8f, 0x9d, 0xd0, 0x1b, - 0x3b, 0x41, 0xd0, 0x01, 0x3c, 0x83, 0x25, 0x31, 0xdb, 0x41, 0x40, 0xde, 0x11, 0xe7, 0x73, 0xbc, - 0x71, 0xca, 0x3b, 0xad, 0x75, 0x6d, 0xa3, 0x4a, 0x0d, 0x01, 0x8e, 0xb8, 0xbd, 0x05, 0x16, 0x7a, - 0x04, 0xde, 0xf8, 0x3e, 0x18, 0x17, 0x02, 0x90, 0x8e, 0xd3, 0xd8, 0x6a, 0x89, 0x2d, 0x73, 0xa7, - 0xa1, 0x8a, 0x68, 0xaf, 0x81, 0xb9, 0xe7, 0x84, 0x93, 0xcc, 0xd3, 0x84, 0x29, 0x50, 0xc0, 0xa2, - 0xf8, 0x6d, 0xff, 0xa0, 0x83, 0x41, 0x19, 0x9f, 0x05, 0x29, 0x79, 0x08, 0x20, 0x14, 0x3d, 0x75, - 0xd2, 0xc4, 0x9f, 0xab, 0x55, 0x0b, 0x55, 0x5b, 0x33, 0xdf, 0xdb, 0x47, 0x12, 0x79, 0x02, 0x4d, - 0x5c, 0x3d, 0x63, 0xd5, 0x8b, 0x03, 0xe4, 0xe7, 0xa3, 0x0d, 0x64, 0x51, 0x12, 0x77, 0xc0, 0x40, - 0xdb, 0x4a, 0xff, 0x6a, 0x51, 0x05, 0x91, 0xfb, 0xb0, 0xea, 0x87, 0xa9, 0xd0, 0xbd, 0x9b, 0x8e, - 0x3d, 0xc6, 0x33, 0xe3, 0xb7, 0x72, 0x6c, 0x8f, 0xf1, 0x94, 0x7c, 0x0a, 0x52, 0x81, 0xd9, 0x86, - 0x35, 0xdc, 0x70, 0x35, 0x37, 0x0c, 0x97, 0x3b, 0x22, 0x8f, 0xda, 0xf1, 0x13, 0x68, 0x88, 0xfb, - 0x65, 0x12, 0x06, 0x4a, 0x34, 0xf1, 0x36, 0x4a, 0x1d, 0x14, 0x04, 0x83, 0x62, 0x17, 0xaa, 0x11, - 0x0e, 0x26, 0x1d, 0x02, 0xbf, 0xed, 0x3e, 0xd4, 0x0e, 0x13, 0x8f, 0x25, 0x57, 0xfa, 0x38, 0x81, - 0xaa, 0xc7, 0xb8, 0x8b, 0xcf, 0xcf, 0xa4, 0xf8, 0x5d, 0xf8, 0x7d, 0xa5, 0xe4, 0xf7, 0xf6, 0xff, - 0x68, 0xd0, 0x18, 0x46, 0x49, 0xba, 0xcf, 0x38, 0x77, 0x26, 0x8c, 0xdc, 0x85, 0x5a, 0x24, 0x96, - 0x55, 0x1a, 0xb6, 0xc4, 0x99, 0x70, 0x1f, 0x2a, 0xf1, 0x4b, 0x76, 0xd0, 0xaf, 0xb7, 0xc3, 0x6d, - 0xa8, 0xc9, 0x17, 0x23, 0x5e, 0x53, 0x8d, 0x4a, 0x40, 0xe8, 0x3a, 0x3a, 0x3d, 0xe5, 0x4c, 0xea, - 0xb2, 0x46, 0x15, 0x74, 0xbd, 0x5b, 0xfd, 0x33, 0x80, 0x38, 0xdf, 0xcf, 0xf4, 0x02, 0xfb, 0x0c, - 0x1a, 0xd4, 0x39, 0x4d, 0x77, 0xa2, 0x30, 0x65, 0xf3, 0x94, 0xac, 0x82, 0xee, 0x7b, 0xa8, 0x22, - 0x83, 0xea, 0xbe, 0x27, 0x0e, 0x37, 0x49, 0xa2, 0x59, 0x8c, 0x1a, 0x6a, 0x51, 0x09, 0xa0, 0x2a, - 0x3d, 0x2f, 0xc1, 0x13, 0x0b, 0x55, 0x7a, 0x5e, 0x42, 0xee, 0x42, 0x83, 0x87, 0x4e, 0xcc, 0xcf, - 0xa2, 0x54, 0x1c, 0xae, 0x8a, 0x87, 0x83, 0x0c, 0x35, 0xe2, 0xf6, 0xaf, 0x34, 0x30, 0xf6, 0xd9, - 0xf4, 0x84, 0x25, 0xaf, 0xed, 0xf2, 0x2e, 0x98, 0xb8, 0xf0, 0xd8, 0xf7, 0xd4, 0x46, 0x75, 0x84, - 0x07, 0xde, 0x95, 0x5b, 0xdd, 0x01, 0x23, 0x60, 0x8e, 0x50, 0xbe, 0xf4, 0x33, 0x05, 0x09, 0xdd, - 0x38, 0xd3, 0xb1, 0xc7, 0x1c, 0x0f, 0x43, 0x8c, 0x49, 0x0d, 0x67, 0xda, 0x63, 0x8e, 0x27, 0xce, - 0x16, 0x38, 0x3c, 0x1d, 0xcf, 0x62, 0xcf, 0x49, 0x19, 0x86, 0x96, 0xaa, 0x70, 0x1c, 0x9e, 0x1e, - 0x23, 0x86, 0x3c, 0x86, 0xb7, 0xdc, 0x60, 0xc6, 0x45, 0x5c, 0xf3, 0xc3, 0xd3, 0x68, 0x1c, 0x85, - 0xc1, 0x25, 0xea, 0xd7, 0xa4, 0xb7, 0x14, 0x61, 0x10, 0x9e, 0x46, 0x87, 0x61, 0x70, 0x69, 0xff, - 0x45, 0x83, 0xda, 0x33, 0x54, 0xc3, 0x13, 0xa8, 0x4f, 0xf1, 0x42, 0xd9, 0xeb, 0xbd, 0x23, 0x34, - 0x8c, 0xb4, 0x4d, 0x79, 0x53, 0xde, 0x0f, 0xd3, 0xe4, 0x92, 0x66, 0x6c, 0x42, 0x22, 0x75, 0x4e, - 0x02, 0x96, 0x72, 0xe5, 0x11, 0x25, 0x89, 0x91, 0x24, 0x28, 0x09, 0xc5, 0xd6, 0xdd, 0x85, 0x66, - 0x79, 0x29, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xea, 0xae, 0x4a, 0xc5, 0x27, 0x59, 0x87, 0x1a, 0x3e, - 0x52, 0xd4, 0x5c, 0x63, 0x0b, 0xc4, 0x8a, 0x52, 0x84, 0x4a, 0xc2, 0xd7, 0xfa, 0x97, 0x9a, 0x58, - 0xa7, 0xbc, 0x41, 0x79, 0x1d, 0xeb, 0xfa, 0x75, 0xa4, 0x48, 0x69, 0x1d, 0xfb, 0xcf, 0x1a, 0x34, - 0xbf, 0x63, 0x49, 0x74, 0x94, 0x44, 0x71, 0xc4, 0x9d, 0x80, 0xd8, 0x60, 0xc8, 0xdb, 0x5d, 0xb1, - 0xbf, 0xa2, 0x08, 0x1e, 0x79, 0x1f, 0x34, 0xe3, 0xe2, 0xda, 0x8a, 0x42, 0xd6, 0x00, 0xa6, 0xce, - 0x7c, 0x8f, 0x39, 0x9c, 0x0d, 0xbc, 0xcc, 0x7d, 0x0a, 0x0c, 0xe9, 0x82, 0x39, 0x75, 0xe6, 0xa3, - 0x79, 0x38, 0xe2, 0x68, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x3e, 0x58, 0x53, 0x67, 0x2e, 0xfc, 0x78, - 0xe0, 0x29, 0xeb, 0x16, 0x08, 0xf2, 0x01, 0x54, 0xd2, 0x79, 0x88, 0x41, 0x41, 0xe4, 0x01, 0x91, - 0xbb, 0x47, 0xf3, 0x50, 0x79, 0x3c, 0x15, 0xb4, 0x4c, 0x1b, 0x66, 0xa1, 0x8d, 0x36, 0x54, 0x5c, - 0xdf, 0xc3, 0x44, 0x60, 0x51, 0xf1, 0x69, 0xff, 0xa2, 0x02, 0xb7, 0x94, 0x29, 0xce, 0xfc, 0x78, - 0x98, 0x0a, 0xbf, 0xe9, 0x40, 0x1d, 0x9f, 0x2b, 0x4b, 0x94, 0x45, 0x32, 0x90, 0x7c, 0x01, 0x06, - 0xba, 0x70, 0x66, 0xe8, 0xbb, 0x85, 0x5a, 0x72, 0x71, 0x69, 0x78, 0x65, 0x71, 0xc5, 0x4e, 0x3e, - 0x87, 0xda, 0x4b, 0x96, 0x44, 0x32, 0xfc, 0x34, 0xb6, 0xd6, 0xae, 0x92, 0x13, 0x06, 0x50, 0x62, - 0x92, 0xf9, 0xef, 0xa8, 0xbd, 0x7b, 0x22, 0xe0, 0x4c, 0xa3, 0x0b, 0xe6, 0x75, 0xea, 0x78, 0xa2, - 0xb2, 0x81, 0x33, 0x52, 0xa6, 0x2e, 0x33, 0x57, 0x57, 0xb7, 0x07, 0x8d, 0xd2, 0xf5, 0xca, 0xfe, - 0xd6, 0x92, 0x1a, 0xbe, 0xbb, 0xe8, 0x6f, 0x56, 0xfe, 0x12, 0xca, 0x6e, 0xdb, 0x03, 0x28, 0x2e, - 0xfb, 0xb7, 0x3a, 0xbf, 0xfd, 0x5f, 0x1a, 0xdc, 0xda, 0x89, 0xc2, 0x90, 0x61, 0x0d, 0x21, 0x4d, - 0x57, 0xf8, 0xad, 0x76, 0xad, 0xdf, 0x3e, 0x82, 0x1a, 0x17, 0xcc, 0x6a, 0xf5, 0xb7, 0xaf, 0xb0, - 0x05, 0x95, 0x1c, 0x22, 0xc4, 0x4c, 0x9d, 0xf9, 0x38, 0x66, 0xa1, 0xe7, 0x87, 0x13, 0xf4, 0x73, - 0x69, 0x81, 0x23, 0x89, 0xb1, 0xff, 0x57, 0x03, 0x43, 0xba, 0xfc, 0x42, 0xb8, 0xd3, 0x16, 0xc3, - 0xdd, 0xfb, 0x60, 0xc5, 0x09, 0xf3, 0x7c, 0x37, 0xdb, 0xd5, 0xa2, 0x05, 0x42, 0x44, 0xe3, 0xd3, - 0x28, 0x71, 0x19, 0x2e, 0x6f, 0x52, 0x09, 0x88, 0x92, 0x0c, 0x53, 0x02, 0x06, 0x2d, 0x19, 0x11, - 0x4d, 0x81, 0x10, 0xd1, 0x4a, 0x88, 0xf0, 0xd8, 0x71, 0x65, 0x91, 0x54, 0xa1, 0x12, 0x10, 0x11, - 0x54, 0x5a, 0x0e, 0x2d, 0x66, 0x52, 0x05, 0xd9, 0xff, 0xa7, 0x43, 0xb3, 0xe7, 0x27, 0xcc, 0x4d, - 0x99, 0xd7, 0xf7, 0x26, 0xc8, 0xc8, 0xc2, 0xd4, 0x4f, 0x2f, 0x55, 0xb4, 0x56, 0x50, 0x9e, 0x4c, - 0xf5, 0xc5, 0x82, 0x51, 0xda, 0xa2, 0x82, 0x35, 0xae, 0x04, 0xc8, 0x16, 0x80, 0x2c, 0x33, 0xb0, - 0xce, 0xad, 0x5e, 0x5f, 0xe7, 0x5a, 0xc8, 0x26, 0x3e, 0x85, 0x82, 0xa4, 0x8c, 0x2f, 0x23, 0xb9, - 0x81, 0x45, 0xf0, 0x4c, 0x38, 0x32, 0x66, 0xe7, 0x13, 0x16, 0xa0, 0xa3, 0x62, 0x76, 0x3e, 0x61, - 0x41, 0x5e, 0x13, 0xd5, 0xe5, 0x71, 0xc4, 0x37, 0xf9, 0x10, 0xf4, 0x28, 0xc6, 0xfb, 0xa9, 0x0d, - 0xcb, 0x17, 0xdb, 0x3c, 0x8c, 0xa9, 0x1e, 0xc5, 0xc2, 0x0b, 0x64, 0x51, 0xd7, 0xb1, 0x94, 0x73, - 0x8b, 0xf0, 0x80, 0xe5, 0x08, 0x55, 0x14, 0xfb, 0x0e, 0xe8, 0x87, 0x31, 0xa9, 0x43, 0x65, 0xd8, - 0x1f, 0xb5, 0x57, 0xc4, 0x47, 0xaf, 0xbf, 0xd7, 0xd6, 0xec, 0x57, 0x1a, 0x58, 0xfb, 0xb3, 0xd4, - 0x11, 0x3e, 0xc5, 0x6f, 0x32, 0xea, 0xbb, 0x60, 0xf2, 0xd4, 0x49, 0x30, 0x2f, 0xea, 0x32, 0x4c, - 0x20, 0x3c, 0xe2, 0xe4, 0x01, 0xd4, 0x98, 0x37, 0x61, 0xd9, 0x6b, 0x6f, 0x2f, 0x9f, 0x93, 0x4a, - 0x32, 0xd9, 0x00, 0x83, 0xbb, 0x67, 0x6c, 0xea, 0x74, 0xaa, 0x05, 0xe3, 0x10, 0x31, 0x32, 0x85, - 0x51, 0x45, 0xc7, 0x1a, 0x3c, 0x89, 0x62, 0x2c, 0x4a, 0x6b, 0xaa, 0x06, 0x4f, 0xa2, 0x58, 0x94, - 0xa4, 0x5b, 0xf0, 0x0f, 0xfe, 0x24, 0x8c, 0x12, 0x36, 0xf6, 0x43, 0x8f, 0xcd, 0xc7, 0x6e, 0x14, - 0x9e, 0x06, 0xbe, 0x9b, 0xa2, 0x2e, 0x4d, 0xfa, 0xb6, 0x24, 0x0e, 0x04, 0x6d, 0x47, 0x91, 0xec, - 0x0f, 0xc1, 0x7a, 0xce, 0x2e, 0xb1, 0x20, 0xe4, 0xe4, 0x0e, 0xe8, 0xe7, 0x17, 0x2a, 0xd7, 0x19, - 0xe2, 0x04, 0xcf, 0x5f, 0x50, 0xfd, 0xfc, 0xc2, 0x9e, 0x83, 0x39, 0x54, 0x89, 0x9e, 0x3c, 0x12, - 0x21, 0x11, 0x43, 0xab, 0x7a, 0x58, 0x58, 0x79, 0x97, 0x6a, 0x0c, 0x9a, 0xd1, 0x85, 0x2d, 0xf1, - 0x20, 0x4a, 0x29, 0x12, 0x28, 0x57, 0x38, 0x95, 0x72, 0x85, 0x83, 0xc5, 0x5a, 0x14, 0x32, 0xe5, - 0xe2, 0xf8, 0x6d, 0xff, 0xb7, 0x0e, 0x66, 0x9e, 0x8a, 0x3e, 0x02, 0x6b, 0x9a, 0xd9, 0x43, 0x3d, - 0x59, 0x2c, 0x67, 0x73, 0x23, 0xd1, 0x82, 0xae, 0xee, 0x52, 0x5d, 0xbe, 0x4b, 0xf1, 0xe6, 0x6b, - 0x6f, 0x7c, 0xf3, 0x0f, 0xe1, 0x96, 0x1b, 0x30, 0x27, 0x1c, 0x17, 0x4f, 0x56, 0x7a, 0xe5, 0x2a, - 0xa2, 0x8f, 0xf2, 0x77, 0xab, 0xe2, 0x56, 0xbd, 0x48, 0x2f, 0xf7, 0xa1, 0xe6, 0xb1, 0x20, 0x75, - 0xca, 0xdd, 0xc9, 0x61, 0xe2, 0xb8, 0x01, 0xeb, 0x09, 0x34, 0x95, 0x54, 0xb2, 0x01, 0x66, 0x56, - 0x41, 0xa9, 0x9e, 0x04, 0x8b, 0xdf, 0x4c, 0xd9, 0x34, 0xa7, 0xda, 0x9f, 0x42, 0xe5, 0xf9, 0x8b, - 0xe1, 0x75, 0x16, 0xca, 0x75, 0xa7, 0x97, 0x74, 0xf7, 0x3d, 0xe8, 0xcf, 0x5f, 0x94, 0x63, 0x6a, - 0x33, 0x4f, 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0xe6, 0x8c, 0xb3, 0x64, 0x9f, 0xa5, - 0x8e, 0x7a, 0xdc, 0x39, 0x2c, 0x52, 0xa0, 0x68, 0xbb, 0xfc, 0x28, 0x54, 0x69, 0x27, 0x03, 0xed, - 0x3f, 0x54, 0xa0, 0xae, 0x1e, 0xb9, 0x58, 0x73, 0x96, 0x97, 0x7c, 0xe2, 0xb3, 0x88, 0x16, 0x7a, - 0x39, 0x5a, 0x94, 0x7b, 0xe2, 0xca, 0x9b, 0x7b, 0x62, 0xf2, 0x35, 0x34, 0x63, 0x49, 0x2b, 0xc7, - 0x97, 0x77, 0xca, 0x32, 0xea, 0x17, 0xe5, 0x1a, 0x71, 0x01, 0x88, 0x97, 0x82, 0xcd, 0x45, 0xea, - 0x4c, 0xd0, 0xd8, 0x4d, 0x5a, 0x17, 0xf0, 0xc8, 0x99, 0x5c, 0x13, 0x65, 0x7e, 0x42, 0xb0, 0x10, - 0xa5, 0x6d, 0x14, 0x77, 0x9a, 0x18, 0x00, 0x44, 0x80, 0x29, 0xbf, 0xfd, 0xd6, 0xe2, 0xdb, 0x7f, - 0x0f, 0x2c, 0x37, 0x9a, 0x4e, 0x7d, 0xa4, 0xad, 0xca, 0xa4, 0x2c, 0x11, 0x23, 0x6e, 0xbf, 0x84, - 0xba, 0xba, 0x2c, 0x69, 0x40, 0xbd, 0xd7, 0xdf, 0xdd, 0x3e, 0xde, 0x13, 0xd1, 0x07, 0xc0, 0x78, - 0x3a, 0x38, 0xd8, 0xa6, 0xff, 0xde, 0xd6, 0x44, 0x24, 0x1a, 0x1c, 0x8c, 0xda, 0x3a, 0xb1, 0xa0, - 0xb6, 0xbb, 0x77, 0xb8, 0x3d, 0x6a, 0x57, 0x88, 0x09, 0xd5, 0xa7, 0x87, 0x87, 0x7b, 0xed, 0x2a, - 0x69, 0x82, 0xd9, 0xdb, 0x1e, 0xf5, 0x47, 0x83, 0xfd, 0x7e, 0xbb, 0x26, 0x78, 0x9f, 0xf5, 0x0f, - 0xdb, 0x86, 0xf8, 0x38, 0x1e, 0xf4, 0xda, 0x75, 0x41, 0x3f, 0xda, 0x1e, 0x0e, 0xbf, 0x3d, 0xa4, - 0xbd, 0xb6, 0x29, 0xd6, 0x1d, 0x8e, 0xe8, 0xe0, 0xe0, 0x59, 0xdb, 0xb2, 0x3f, 0x85, 0x46, 0x49, - 0x69, 0x42, 0x82, 0xf6, 0x77, 0xdb, 0x2b, 0x62, 0x9b, 0x17, 0xdb, 0x7b, 0xc7, 0xfd, 0xb6, 0x46, - 0x56, 0x01, 0xf0, 0x73, 0xbc, 0xb7, 0x7d, 0xf0, 0xac, 0xad, 0xdb, 0xff, 0x02, 0xe6, 0xb1, 0xef, - 0x3d, 0x0d, 0x22, 0xf7, 0x5c, 0xf8, 0xda, 0x89, 0xc3, 0x99, 0x4a, 0xd3, 0xf8, 0x2d, 0xf2, 0x08, - 0x7a, 0x34, 0x57, 0xe6, 0x56, 0x90, 0x7d, 0x00, 0xf5, 0x63, 0xdf, 0x3b, 0x72, 0xdc, 0x73, 0xd1, - 0x4f, 0x9f, 0x08, 0xf9, 0x31, 0xf7, 0x5f, 0x32, 0x15, 0x42, 0x2d, 0xc4, 0x0c, 0xfd, 0x97, 0x8c, - 0xdc, 0x03, 0x03, 0x81, 0xac, 0xa0, 0xc2, 0x87, 0x90, 0xed, 0x49, 0x15, 0xcd, 0x4e, 0xf3, 0xa3, - 0x63, 0xaf, 0x7c, 0x17, 0xaa, 0xb1, 0xe3, 0x9e, 0xab, 0x48, 0xd4, 0x50, 0x22, 0x62, 0x3b, 0x8a, - 0x04, 0xf2, 0x10, 0x4c, 0xe5, 0x12, 0xd9, 0xba, 0x8d, 0x92, 0xef, 0xd0, 0x9c, 0xb8, 0x68, 0xac, - 0xca, 0x92, 0xb1, 0x3e, 0x07, 0x28, 0x46, 0x0b, 0x57, 0x94, 0xd6, 0xb7, 0xa1, 0xe6, 0x04, 0xbe, - 0xba, 0xbc, 0x45, 0x25, 0x60, 0x1f, 0x40, 0xa3, 0x34, 0x90, 0x10, 0x9e, 0xe2, 0x04, 0xc1, 0xf8, - 0x9c, 0x5d, 0x72, 0x94, 0x35, 0x69, 0xdd, 0x09, 0x82, 0xe7, 0xec, 0x92, 0x93, 0x7b, 0x50, 0x93, - 0xb3, 0x0c, 0x7d, 0xa9, 0x65, 0x46, 0x51, 0x2a, 0x89, 0xf6, 0xc7, 0x60, 0xc8, 0x3e, 0xba, 0xe4, - 0xa8, 0xda, 0xb5, 0x59, 0xed, 0x2b, 0x75, 0x66, 0xec, 0xba, 0xc9, 0x47, 0x6a, 0x66, 0xc2, 0xe5, - 0x84, 0x46, 0x2b, 0x2a, 0x3d, 0xc9, 0xa4, 0xc6, 0x25, 0xc8, 0x6c, 0xf7, 0xc0, 0xbc, 0x71, 0x0a, - 0xa5, 0x14, 0xa0, 0x17, 0x0a, 0xb8, 0x62, 0x2e, 0x65, 0xff, 0x07, 0x40, 0x31, 0x5b, 0x51, 0xef, - 0x46, 0xae, 0x22, 0xde, 0xcd, 0x63, 0x30, 0xdd, 0x33, 0x3f, 0xf0, 0x12, 0x16, 0x2e, 0xdc, 0xba, - 0x98, 0xc6, 0xe4, 0x74, 0xb2, 0x0e, 0x55, 0x1c, 0x19, 0x55, 0x8a, 0x08, 0x99, 0xcf, 0x8b, 0x90, - 0x62, 0x9f, 0x40, 0x4b, 0x26, 0x4b, 0xca, 0xfe, 0x73, 0xc6, 0xf8, 0x8d, 0x25, 0xd8, 0x1a, 0x40, - 0x1e, 0xcf, 0xb3, 0xe1, 0x57, 0x09, 0x23, 0x5c, 0xf9, 0xd4, 0x67, 0x81, 0x97, 0xdd, 0x46, 0x41, - 0xf6, 0x17, 0xd0, 0xcc, 0xf6, 0x50, 0x2d, 0x78, 0x96, 0xb2, 0xa5, 0x36, 0x65, 0xe7, 0x21, 0x59, - 0x0e, 0x22, 0x2f, 0xcf, 0xd8, 0xf6, 0x6f, 0xf5, 0x4c, 0x52, 0x75, 0xa3, 0x0b, 0x45, 0xa0, 0xb6, - 0x5c, 0x04, 0x2e, 0x16, 0x54, 0xfa, 0x4f, 0x2a, 0xa8, 0xbe, 0x04, 0xcb, 0xc3, 0xaa, 0xc2, 0xbf, - 0xc8, 0xe2, 0x6a, 0x77, 0xb9, 0x82, 0x50, 0x75, 0x87, 0x7f, 0xc1, 0x68, 0xc1, 0x2c, 0xce, 0x92, - 0x46, 0xe7, 0x2c, 0xf4, 0x5f, 0x62, 0xbb, 0x2d, 0x2e, 0x5c, 0x20, 0x8a, 0xd9, 0x85, 0xac, 0x34, - 0xd4, 0xec, 0x22, 0x1b, 0xc3, 0x18, 0xc5, 0x18, 0x46, 0x68, 0x6d, 0x16, 0x73, 0x96, 0xa4, 0x59, - 0xc5, 0x29, 0xa1, 0xbc, 0x72, 0xb3, 0x14, 0xaf, 0x13, 0x4e, 0xec, 0xaf, 0xc0, 0xca, 0xcf, 0x22, - 0x02, 0xda, 0xc1, 0xe1, 0x41, 0x5f, 0x86, 0x9f, 0xc1, 0x41, 0xaf, 0xff, 0x6f, 0x6d, 0x4d, 0x84, - 0x44, 0xda, 0x7f, 0xd1, 0xa7, 0xc3, 0x7e, 0x5b, 0x17, 0xa1, 0xab, 0xd7, 0xdf, 0xeb, 0x8f, 0xfa, - 0xed, 0xca, 0x37, 0x55, 0xb3, 0xde, 0x36, 0xa9, 0xc9, 0xe6, 0x71, 0xe0, 0xbb, 0x7e, 0x6a, 0x1f, - 0x83, 0xb9, 0xef, 0xc4, 0xaf, 0x75, 0x0f, 0x45, 0xa6, 0x9b, 0xa9, 0x91, 0x83, 0xca, 0x4a, 0xf7, - 0xa1, 0xae, 0x9e, 0xbc, 0xf2, 0xa6, 0x85, 0x70, 0x90, 0xd1, 0xec, 0xff, 0xd7, 0xe0, 0xf6, 0x7e, - 0x74, 0xc1, 0xf2, 0x14, 0x7f, 0xe4, 0x5c, 0x06, 0x91, 0xe3, 0xbd, 0xc1, 0x74, 0x0f, 0xe0, 0x16, - 0x8f, 0x66, 0x89, 0xcb, 0xc6, 0x4b, 0xe3, 0x8e, 0x96, 0x44, 0x3f, 0x53, 0x2e, 0x68, 0x43, 0xcb, - 0x63, 0x3c, 0x2d, 0xb8, 0x2a, 0xc8, 0xd5, 0x10, 0xc8, 0x8c, 0x27, 0xaf, 0x53, 0xaa, 0x6f, 0xaa, - 0x53, 0xec, 0xdf, 0x68, 0xd0, 0xea, 0xcf, 0xe3, 0x28, 0x49, 0xb3, 0x63, 0xde, 0xe0, 0xfe, 0x4f, - 0xc0, 0x10, 0x52, 0x33, 0xae, 0x5c, 0xab, 0x23, 0x16, 0x5e, 0x90, 0xde, 0x1c, 0x22, 0x9d, 0x2a, - 0xbe, 0xeb, 0x0b, 0xb6, 0x77, 0xa0, 0x3e, 0x0b, 0xfd, 0x79, 0x36, 0x0e, 0xaa, 0x50, 0x43, 0x80, - 0x23, 0x6e, 0x7f, 0x0d, 0x86, 0x5c, 0xa3, 0x64, 0xdd, 0x06, 0xd4, 0x87, 0xc7, 0x3b, 0x3b, 0xfd, - 0xe1, 0xb0, 0xad, 0x91, 0x16, 0x58, 0xbd, 0xe3, 0xa3, 0xbd, 0xc1, 0xce, 0xf6, 0x48, 0x59, 0x78, - 0x77, 0x7b, 0xb0, 0xd7, 0xef, 0xb5, 0x2b, 0xf6, 0x0e, 0x58, 0xa3, 0x79, 0xa8, 0xc4, 0xcb, 0xd9, - 0x55, 0xbb, 0x21, 0xbb, 0xea, 0x4b, 0x01, 0x7b, 0x08, 0x8d, 0x52, 0xb5, 0x45, 0x3e, 0x80, 0x6a, - 0x3a, 0x0f, 0x17, 0x67, 0xb0, 0xd9, 0x1e, 0x14, 0x49, 0xe4, 0x03, 0x68, 0x8a, 0xfe, 0xce, 0xe1, - 0xdc, 0x9f, 0x84, 0xcc, 0x53, 0x2b, 0x8a, 0x9e, 0x6f, 0x5b, 0xa1, 0xec, 0xbb, 0xd0, 0x12, 0x0d, - 0xb5, 0x3f, 0x65, 0x3c, 0x75, 0xa6, 0x31, 0xd6, 0x02, 0x2a, 0x04, 0x57, 0xa9, 0x9e, 0x72, 0xfb, - 0x01, 0x34, 0x8f, 0x18, 0x4b, 0x28, 0xe3, 0x71, 0x14, 0xca, 0xa4, 0xa8, 0x54, 0x2d, 0xe3, 0xbd, - 0x82, 0xec, 0xef, 0xc1, 0x12, 0xf5, 0xf2, 0x53, 0x27, 0x75, 0xcf, 0x7e, 0x4e, 0x3d, 0xfd, 0x00, - 0xea, 0xb1, 0x34, 0x91, 0xaa, 0x7e, 0x9b, 0x18, 0x72, 0x94, 0xd9, 0x68, 0x46, 0xb4, 0x3f, 0x87, - 0xca, 0xc1, 0x6c, 0x5a, 0xfe, 0x47, 0xa2, 0x2a, 0xeb, 0xbc, 0x85, 0x4e, 0x52, 0x5f, 0xec, 0x24, - 0xed, 0xef, 0xa0, 0x91, 0x5d, 0x75, 0xe0, 0xe1, 0xdf, 0x0a, 0xa8, 0xea, 0x81, 0xb7, 0xa0, 0x79, - 0xd9, 0xa2, 0xb1, 0xd0, 0x1b, 0x64, 0x3a, 0x92, 0xc0, 0xe2, 0xda, 0x6a, 0x04, 0x91, 0xaf, 0xbd, - 0x0b, 0xcd, 0xac, 0xa6, 0xc5, 0xa2, 0x52, 0x18, 0x2f, 0xf0, 0x59, 0x58, 0x32, 0xac, 0x29, 0x11, - 0x23, 0x7e, 0xc3, 0xb4, 0xd0, 0xde, 0xcc, 0x1d, 0x8b, 0x40, 0xd5, 0x8d, 0x3c, 0xf9, 0x06, 0x6b, - 0x14, 0xbf, 0xc5, 0x85, 0xa7, 0x7c, 0x92, 0xe5, 0xa5, 0x29, 0x9f, 0xd8, 0x29, 0xb4, 0x9e, 0x3a, - 0xee, 0xf9, 0x2c, 0xce, 0xf2, 0x42, 0xc9, 0x97, 0xb5, 0x05, 0x5f, 0xbe, 0x61, 0x44, 0x59, 0x72, - 0x73, 0x39, 0xa5, 0x54, 0x6e, 0x2e, 0xec, 0x9b, 0x3a, 0xc9, 0x44, 0xcd, 0x70, 0x2d, 0xaa, 0xa0, - 0xad, 0x5f, 0x6a, 0x50, 0x15, 0x06, 0x24, 0xf7, 0xa0, 0xda, 0x77, 0xcf, 0x22, 0xb2, 0x60, 0xa7, - 0xee, 0x02, 0x64, 0xaf, 0x90, 0x8f, 0xe5, 0x88, 0x36, 0x9b, 0x3c, 0xb7, 0x32, 0xfb, 0xa3, 0x7f, - 0xbc, 0xc6, 0xbd, 0x09, 0x8d, 0x6f, 0x22, 0x3f, 0xdc, 0x91, 0x53, 0x4b, 0xb2, 0xec, 0x2d, 0xaf, - 0xf1, 0x7f, 0x02, 0xc6, 0x80, 0x0b, 0xb7, 0x7c, 0x9d, 0x15, 0x9b, 0xcc, 0xb2, 0xc7, 0xda, 0x2b, - 0x5b, 0x7f, 0xd2, 0xa1, 0xfa, 0x1d, 0x4b, 0x22, 0xf2, 0x31, 0xd4, 0xd5, 0x48, 0x85, 0x94, 0x46, - 0x27, 0x5d, 0x8c, 0x43, 0x4b, 0xb3, 0x16, 0x3c, 0x95, 0xa1, 0x92, 0x5b, 0x31, 0xe7, 0xe9, 0x5e, - 0x15, 0xb3, 0xec, 0x95, 0x0d, 0xed, 0x89, 0x46, 0x3e, 0x02, 0x43, 0x3e, 0xd0, 0x25, 0xdd, 0x2c, - 0x37, 0x4a, 0xf6, 0xca, 0x13, 0x8d, 0x3c, 0x84, 0xc6, 0xf0, 0x2c, 0x9a, 0x05, 0xde, 0x90, 0x25, - 0x17, 0x8c, 0x94, 0xa6, 0x8b, 0xdd, 0xd2, 0xb7, 0xbd, 0x42, 0x36, 0x00, 0xa4, 0x0b, 0x1f, 0xfb, - 0x1e, 0x27, 0x75, 0x41, 0x3b, 0x98, 0x4d, 0xe5, 0xa2, 0x25, 0xdf, 0x96, 0x9c, 0xa5, 0x87, 0x7c, - 0x13, 0xe7, 0x67, 0xd0, 0xda, 0xc1, 0xb0, 0x72, 0x98, 0x6c, 0x9f, 0x44, 0x49, 0x4a, 0x96, 0x27, - 0x8c, 0xdd, 0x65, 0x84, 0xbd, 0x42, 0x9e, 0x80, 0x39, 0x4a, 0x2e, 0x25, 0xff, 0x5b, 0x2a, 0xdc, - 0x14, 0xfb, 0x5d, 0x71, 0xcb, 0xad, 0x1f, 0x2b, 0x60, 0x7c, 0x1b, 0x25, 0xe7, 0x2c, 0x21, 0x8f, - 0xc1, 0xc0, 0x8e, 0x56, 0xb9, 0x42, 0xde, 0xdd, 0x5e, 0xb5, 0xd1, 0x3d, 0xb0, 0x50, 0x29, 0x23, - 0x87, 0x9f, 0x4b, 0xd5, 0xe3, 0x1f, 0x7e, 0x52, 0x2f, 0xb2, 0x50, 0x41, 0x1f, 0x58, 0x1d, 0xa6, - 0x09, 0x73, 0xa6, 0x79, 0x17, 0xbf, 0xd0, 0x66, 0x76, 0xeb, 0xb2, 0x93, 0x1c, 0x2a, 0xe3, 0x3c, - 0x82, 0xea, 0x50, 0xde, 0x54, 0x30, 0x15, 0x7f, 0x8a, 0x74, 0x57, 0x33, 0x44, 0xbe, 0xf2, 0x3f, - 0x81, 0x21, 0x6b, 0x0c, 0x79, 0xcd, 0x85, 0x22, 0xac, 0xdb, 0x2e, 0xa3, 0x94, 0x80, 0x0d, 0xf5, - 0xa3, 0x59, 0x32, 0x61, 0x23, 0xbe, 0x64, 0xf9, 0xcc, 0x06, 0xf6, 0x0a, 0x79, 0x04, 0x86, 0x7c, - 0xb5, 0x72, 0xd1, 0x85, 0x17, 0x2c, 0x6f, 0x26, 0x83, 0x00, 0x2a, 0xda, 0x90, 0xb9, 0x4b, 0xb2, - 0x2e, 0xe4, 0xb1, 0xee, 0xeb, 0x28, 0xd4, 0x45, 0x9b, 0x32, 0x97, 0xf9, 0xa5, 0xe4, 0x4e, 0xb2, - 0xfb, 0x2f, 0x3f, 0x9e, 0x0d, 0x8d, 0x7c, 0x05, 0xad, 0x85, 0x42, 0x80, 0x60, 0xbe, 0xbc, 0xaa, - 0x36, 0x58, 0x16, 0x7e, 0xda, 0xfe, 0xf5, 0xab, 0x35, 0xed, 0xc7, 0x57, 0x6b, 0xda, 0xef, 0x5e, - 0xad, 0x69, 0x3f, 0xfc, 0x7e, 0x6d, 0xe5, 0xc4, 0xc0, 0xff, 0x94, 0x3f, 0xfb, 0x6b, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x8a, 0x43, 0x8b, 0x5f, 0x6e, 0x1e, 0x00, 0x00, + 0x97, 0xbf, 0xf0, 0x22, 0x95, 0x45, 0x96, 0xc9, 0x0f, 0xcc, 0x7c, 0xc0, 0x54, 0x4d, 0xcd, 0xca, + 0xdb, 0xd9, 0x4d, 0xf5, 0xac, 0x66, 0x3d, 0x35, 0x35, 0x8b, 0xd9, 0x4c, 0xdd, 0x73, 0x2f, 0x1e, + 0x64, 0x4b, 0x6a, 0x7b, 0xaa, 0x66, 0x45, 0x9c, 0xd7, 0x7d, 0x9c, 0x73, 0xee, 0x79, 0x11, 0xcc, + 0xf8, 0x64, 0x33, 0x4e, 0xa2, 0x34, 0x22, 0x7a, 0x7c, 0xd2, 0xb5, 0x9c, 0xd8, 0x97, 0xa0, 0xdd, + 0x85, 0xea, 0x9e, 0xcf, 0x53, 0x42, 0xa0, 0x3a, 0xf3, 0x3d, 0xde, 0xd1, 0xd6, 0x2b, 0x1b, 0x06, + 0xc5, 0x6f, 0x7b, 0x1f, 0xac, 0x91, 0xc3, 0xcf, 0x5f, 0x38, 0xc1, 0x8c, 0x91, 0x36, 0x54, 0x2e, + 0x9c, 0xa0, 0xa3, 0xad, 0x6b, 0x1b, 0x4d, 0x2a, 0x3e, 0xc9, 0x26, 0x98, 0x17, 0x4e, 0x30, 0x4e, + 0x2f, 0x63, 0xd6, 0xd1, 0xd7, 0xb5, 0x8d, 0xd5, 0xad, 0xb7, 0x37, 0xe3, 0x93, 0xcd, 0xa3, 0x88, + 0xa7, 0x7e, 0x38, 0xd9, 0x7c, 0xe1, 0x04, 0xa3, 0xcb, 0x98, 0xd1, 0xfa, 0x85, 0xfc, 0xb0, 0x0f, + 0xa1, 0x31, 0x4c, 0xdc, 0xdd, 0x59, 0xe8, 0xa6, 0x7e, 0x14, 0x8a, 0x1d, 0x43, 0x67, 0xca, 0x70, + 0x45, 0x8b, 0xe2, 0xb7, 0xc0, 0x39, 0xc9, 0x84, 0x77, 0x2a, 0xeb, 0x15, 0x81, 0x13, 0xdf, 0xa4, + 0x03, 0x75, 0x9f, 0xef, 0x44, 0xb3, 0x30, 0xed, 0x54, 0xd7, 0xb5, 0x0d, 0x93, 0x66, 0xa0, 0xfd, + 0x47, 0x1d, 0x6a, 0xff, 0x3a, 0x63, 0xc9, 0x25, 0xca, 0xa5, 0x69, 0x92, 0xad, 0x25, 0xbe, 0xc9, + 0x6d, 0xa8, 0x05, 0x4e, 0x38, 0xe1, 0x1d, 0x1d, 0x17, 0x93, 0x00, 0x79, 0x0f, 0x2c, 0xe7, 0x34, + 0x65, 0xc9, 0x78, 0xe6, 0x7b, 0x9d, 0xca, 0xba, 0xb6, 0x61, 0x50, 0x13, 0x11, 0xc7, 0xbe, 0x47, + 0xde, 0x05, 0xd3, 0x8b, 0xc6, 0x6e, 0x79, 0x2f, 0x2f, 0xc2, 0xbd, 0xc8, 0x87, 0x60, 0xce, 0x7c, + 0x6f, 0x1c, 0xf8, 0x3c, 0xed, 0xd4, 0xd6, 0xb5, 0x8d, 0xc6, 0x96, 0x29, 0x2e, 0x2b, 0x74, 0x47, + 0xeb, 0x33, 0xdf, 0x43, 0x25, 0x3e, 0x06, 0x93, 0x27, 0xee, 0xf8, 0x74, 0x16, 0xba, 0x1d, 0x03, + 0x99, 0x6e, 0x09, 0xa6, 0xd2, 0xad, 0x69, 0x9d, 0x4b, 0x40, 0x5c, 0x2b, 0x61, 0x17, 0x2c, 0xe1, + 0xac, 0x53, 0x97, 0x5b, 0x29, 0x90, 0x3c, 0x81, 0xc6, 0xa9, 0xe3, 0xb2, 0x74, 0x1c, 0x3b, 0x89, + 0x33, 0xed, 0x98, 0xc5, 0x42, 0xbb, 0x02, 0x7d, 0x24, 0xb0, 0x9c, 0xc2, 0x69, 0x0e, 0x90, 0xcf, + 0xa0, 0x85, 0x10, 0x1f, 0x9f, 0xfa, 0x41, 0xca, 0x92, 0x8e, 0x85, 0x32, 0xab, 0x28, 0x83, 0x98, + 0x51, 0xc2, 0x18, 0x6d, 0x4a, 0x26, 0x89, 0x21, 0xff, 0x08, 0xc0, 0xe6, 0xb1, 0x13, 0x7a, 0x63, + 0x27, 0x08, 0x3a, 0x80, 0x67, 0xb0, 0x24, 0x66, 0x3b, 0x08, 0xc8, 0x3b, 0xe2, 0x7c, 0x8e, 0x37, + 0x4e, 0x79, 0xa7, 0xb5, 0xae, 0x6d, 0x54, 0xa9, 0x21, 0xc0, 0x11, 0xb7, 0xb7, 0xc0, 0x42, 0x8f, + 0xc0, 0x1b, 0xdf, 0x07, 0xe3, 0x42, 0x00, 0xd2, 0x71, 0x1a, 0x5b, 0x2d, 0xb1, 0x65, 0xee, 0x34, + 0x54, 0x11, 0xed, 0x35, 0x30, 0xf7, 0x9c, 0x70, 0x92, 0x79, 0x9a, 0x30, 0x05, 0x0a, 0x58, 0x14, + 0xbf, 0xed, 0x1f, 0x74, 0x30, 0x28, 0xe3, 0xb3, 0x20, 0x25, 0x0f, 0x01, 0x84, 0xa2, 0xa7, 0x4e, + 0x9a, 0xf8, 0x73, 0xb5, 0x6a, 0xa1, 0x6a, 0x6b, 0xe6, 0x7b, 0xfb, 0x48, 0x22, 0x4f, 0xa0, 0x89, + 0xab, 0x67, 0xac, 0x7a, 0x71, 0x80, 0xfc, 0x7c, 0xb4, 0x81, 0x2c, 0x4a, 0xe2, 0x0e, 0x18, 0x68, + 0x5b, 0xe9, 0x5f, 0x2d, 0xaa, 0x20, 0x72, 0x1f, 0x56, 0xfd, 0x30, 0x15, 0xba, 0x77, 0xd3, 0xb1, + 0xc7, 0x78, 0x66, 0xfc, 0x56, 0x8e, 0xed, 0x31, 0x9e, 0x92, 0x4f, 0x41, 0x2a, 0x30, 0xdb, 0xb0, + 0x86, 0x1b, 0xae, 0xe6, 0x86, 0xe1, 0x72, 0x47, 0xe4, 0x51, 0x3b, 0x7e, 0x02, 0x0d, 0x71, 0xbf, + 0x4c, 0xc2, 0x40, 0x89, 0x26, 0xde, 0x46, 0xa9, 0x83, 0x82, 0x60, 0x50, 0xec, 0x42, 0x35, 0xc2, + 0xc1, 0xa4, 0x43, 0xe0, 0xb7, 0xdd, 0x87, 0xda, 0x61, 0xe2, 0xb1, 0xe4, 0x4a, 0x1f, 0x27, 0x50, + 0xf5, 0x18, 0x77, 0xf1, 0xf9, 0x99, 0x14, 0xbf, 0x0b, 0xbf, 0xaf, 0x94, 0xfc, 0xde, 0xfe, 0x1f, + 0x0d, 0x1a, 0xc3, 0x28, 0x49, 0xf7, 0x19, 0xe7, 0xce, 0x84, 0x91, 0xbb, 0x50, 0x8b, 0xc4, 0xb2, + 0x4a, 0xc3, 0x96, 0x38, 0x13, 0xee, 0x43, 0x25, 0x7e, 0xc9, 0x0e, 0xfa, 0xf5, 0x76, 0xb8, 0x0d, + 0x35, 0xf9, 0x62, 0xc4, 0x6b, 0xaa, 0x51, 0x09, 0x08, 0x5d, 0x47, 0xa7, 0xa7, 0x9c, 0x49, 0x5d, + 0xd6, 0xa8, 0x82, 0xae, 0x77, 0xab, 0x7f, 0x06, 0x10, 0xe7, 0xfb, 0x99, 0x5e, 0x60, 0x9f, 0x41, + 0x83, 0x3a, 0xa7, 0xe9, 0x4e, 0x14, 0xa6, 0x6c, 0x9e, 0x92, 0x55, 0xd0, 0x7d, 0x0f, 0x55, 0x64, + 0x50, 0xdd, 0xf7, 0xc4, 0xe1, 0x26, 0x49, 0x34, 0x8b, 0x51, 0x43, 0x2d, 0x2a, 0x01, 0x54, 0xa5, + 0xe7, 0x25, 0x78, 0x62, 0xa1, 0x4a, 0xcf, 0x4b, 0xc8, 0x5d, 0x68, 0xf0, 0xd0, 0x89, 0xf9, 0x59, + 0x94, 0x8a, 0xc3, 0x55, 0xf1, 0x70, 0x90, 0xa1, 0x46, 0xdc, 0xfe, 0x95, 0x06, 0xc6, 0x3e, 0x9b, + 0x9e, 0xb0, 0xe4, 0xb5, 0x5d, 0xde, 0x05, 0x13, 0x17, 0x1e, 0xfb, 0x9e, 0xda, 0xa8, 0x8e, 0xf0, + 0xc0, 0xbb, 0x72, 0xab, 0x3b, 0x60, 0x04, 0xcc, 0x11, 0xca, 0x97, 0x7e, 0xa6, 0x20, 0xa1, 0x1b, + 0x67, 0x3a, 0xf6, 0x98, 0xe3, 0x61, 0x88, 0x31, 0xa9, 0xe1, 0x4c, 0x7b, 0xcc, 0xf1, 0xc4, 0xd9, + 0x02, 0x87, 0xa7, 0xe3, 0x59, 0xec, 0x39, 0x29, 0xc3, 0xd0, 0x52, 0x15, 0x8e, 0xc3, 0xd3, 0x63, + 0xc4, 0x90, 0xc7, 0xf0, 0x96, 0x1b, 0xcc, 0xb8, 0x88, 0x6b, 0x7e, 0x78, 0x1a, 0x8d, 0xa3, 0x30, + 0xb8, 0x44, 0xfd, 0x9a, 0xf4, 0x96, 0x22, 0x0c, 0xc2, 0xd3, 0xe8, 0x30, 0x0c, 0x2e, 0xed, 0xbf, + 0x68, 0x50, 0x7b, 0x86, 0x6a, 0x78, 0x02, 0xf5, 0x29, 0x5e, 0x28, 0x7b, 0xbd, 0x77, 0x84, 0x86, + 0x91, 0xb6, 0x29, 0x6f, 0xca, 0xfb, 0x61, 0x9a, 0x5c, 0xd2, 0x8c, 0x4d, 0x48, 0xa4, 0xce, 0x49, + 0xc0, 0x52, 0xae, 0x3c, 0xa2, 0x24, 0x31, 0x92, 0x04, 0x25, 0xa1, 0xd8, 0xba, 0xbb, 0xd0, 0x2c, + 0x2f, 0x25, 0xd2, 0xc8, 0x39, 0xbb, 0x44, 0xdd, 0x55, 0xa9, 0xf8, 0x24, 0xeb, 0x50, 0xc3, 0x47, + 0x8a, 0x9a, 0x6b, 0x6c, 0x81, 0x58, 0x51, 0x8a, 0x50, 0x49, 0xf8, 0x5a, 0xff, 0x52, 0x13, 0xeb, + 0x94, 0x37, 0x28, 0xaf, 0x63, 0x5d, 0xbf, 0x8e, 0x14, 0x29, 0xad, 0x63, 0xff, 0x59, 0x83, 0xe6, + 0x77, 0x2c, 0x89, 0x8e, 0x92, 0x28, 0x8e, 0xb8, 0x13, 0x10, 0x1b, 0x0c, 0x79, 0xbb, 0x2b, 0xf6, + 0x57, 0x14, 0xc1, 0x23, 0xef, 0x83, 0x66, 0x5c, 0x5c, 0x5b, 0x51, 0xc8, 0x1a, 0xc0, 0xd4, 0x99, + 0xef, 0x31, 0x87, 0xb3, 0x81, 0x97, 0xb9, 0x4f, 0x81, 0x21, 0x5d, 0x30, 0xa7, 0xce, 0x7c, 0x34, + 0x0f, 0x47, 0x1c, 0xad, 0x5b, 0xa5, 0x39, 0x4c, 0xde, 0x07, 0x6b, 0xea, 0xcc, 0x85, 0x1f, 0x0f, + 0x3c, 0x65, 0xdd, 0x02, 0x41, 0x3e, 0x80, 0x4a, 0x3a, 0x0f, 0x31, 0x28, 0x88, 0x3c, 0x20, 0x72, + 0xf7, 0x68, 0x1e, 0x2a, 0x8f, 0xa7, 0x82, 0x96, 0x69, 0xc3, 0x2c, 0xb4, 0xd1, 0x86, 0x8a, 0xeb, + 0x7b, 0x98, 0x08, 0x2c, 0x2a, 0x3e, 0xed, 0x5f, 0x54, 0xe0, 0x96, 0x32, 0xc5, 0x99, 0x1f, 0x0f, + 0x53, 0xe1, 0x37, 0x1d, 0xa8, 0xe3, 0x73, 0x65, 0x89, 0xb2, 0x48, 0x06, 0x92, 0x2f, 0xc0, 0x40, + 0x17, 0xce, 0x0c, 0x7d, 0xb7, 0x50, 0x4b, 0x2e, 0x2e, 0x0d, 0xaf, 0x2c, 0xae, 0xd8, 0xc9, 0xe7, + 0x50, 0x7b, 0xc9, 0x92, 0x48, 0x86, 0x9f, 0xc6, 0xd6, 0xda, 0x55, 0x72, 0xc2, 0x00, 0x4a, 0x4c, + 0x32, 0xff, 0x1d, 0xb5, 0x77, 0x4f, 0x04, 0x9c, 0x69, 0x74, 0xc1, 0xbc, 0x4e, 0x1d, 0x4f, 0x54, + 0x36, 0x70, 0x46, 0xca, 0xd4, 0x65, 0xe6, 0xea, 0xea, 0xf6, 0xa0, 0x51, 0xba, 0x5e, 0xd9, 0xdf, + 0x5a, 0x52, 0xc3, 0x77, 0x17, 0xfd, 0xcd, 0xca, 0x5f, 0x42, 0xd9, 0x6d, 0x7b, 0x00, 0xc5, 0x65, + 0xff, 0x56, 0xe7, 0xb7, 0xff, 0x4b, 0x83, 0x5b, 0x3b, 0x51, 0x18, 0x32, 0xac, 0x21, 0xa4, 0xe9, + 0x0a, 0xbf, 0xd5, 0xae, 0xf5, 0xdb, 0x47, 0x50, 0xe3, 0x82, 0x59, 0xad, 0xfe, 0xf6, 0x15, 0xb6, + 0xa0, 0x92, 0x43, 0x84, 0x98, 0xa9, 0x33, 0x1f, 0xc7, 0x2c, 0xf4, 0xfc, 0x70, 0x82, 0x7e, 0x2e, + 0x2d, 0x70, 0x24, 0x31, 0xf6, 0xff, 0x6a, 0x60, 0x48, 0x97, 0x5f, 0x08, 0x77, 0xda, 0x62, 0xb8, + 0x7b, 0x1f, 0xac, 0x38, 0x61, 0x9e, 0xef, 0x66, 0xbb, 0x5a, 0xb4, 0x40, 0x88, 0x68, 0x7c, 0x1a, + 0x25, 0x2e, 0xc3, 0xe5, 0x4d, 0x2a, 0x01, 0x51, 0x92, 0x61, 0x4a, 0xc0, 0xa0, 0x25, 0x23, 0xa2, + 0x29, 0x10, 0x22, 0x5a, 0x09, 0x11, 0x1e, 0x3b, 0xae, 0x2c, 0x92, 0x2a, 0x54, 0x02, 0x22, 0x82, + 0x4a, 0xcb, 0xa1, 0xc5, 0x4c, 0xaa, 0x20, 0xfb, 0xff, 0x74, 0x68, 0xf6, 0xfc, 0x84, 0xb9, 0x29, + 0xf3, 0xfa, 0xde, 0x04, 0x19, 0x59, 0x98, 0xfa, 0xe9, 0xa5, 0x8a, 0xd6, 0x0a, 0xca, 0x93, 0xa9, + 0xbe, 0x58, 0x30, 0x4a, 0x5b, 0x54, 0xb0, 0xc6, 0x95, 0x00, 0xd9, 0x02, 0x90, 0x65, 0x06, 0xd6, + 0xb9, 0xd5, 0xeb, 0xeb, 0x5c, 0x0b, 0xd9, 0xc4, 0xa7, 0x50, 0x90, 0x94, 0xf1, 0x65, 0x24, 0x37, + 0xb0, 0x08, 0x9e, 0x09, 0x47, 0xc6, 0xec, 0x7c, 0xc2, 0x02, 0x74, 0x54, 0xcc, 0xce, 0x27, 0x2c, + 0xc8, 0x6b, 0xa2, 0xba, 0x3c, 0x8e, 0xf8, 0x26, 0x1f, 0x82, 0x1e, 0xc5, 0x78, 0x3f, 0xb5, 0x61, + 0xf9, 0x62, 0x9b, 0x87, 0x31, 0xd5, 0xa3, 0x58, 0x78, 0x81, 0x2c, 0xea, 0x3a, 0x96, 0x72, 0x6e, + 0x11, 0x1e, 0xb0, 0x1c, 0xa1, 0x8a, 0x62, 0xdf, 0x01, 0xfd, 0x30, 0x26, 0x75, 0xa8, 0x0c, 0xfb, + 0xa3, 0xf6, 0x8a, 0xf8, 0xe8, 0xf5, 0xf7, 0xda, 0x9a, 0xfd, 0x4a, 0x03, 0x6b, 0x7f, 0x96, 0x3a, + 0xc2, 0xa7, 0xf8, 0x4d, 0x46, 0x7d, 0x17, 0x4c, 0x9e, 0x3a, 0x09, 0xe6, 0x45, 0x5d, 0x86, 0x09, + 0x84, 0x47, 0x9c, 0x3c, 0x80, 0x1a, 0xf3, 0x26, 0x2c, 0x7b, 0xed, 0xed, 0xe5, 0x73, 0x52, 0x49, + 0x26, 0x1b, 0x60, 0x70, 0xf7, 0x8c, 0x4d, 0x9d, 0x4e, 0xb5, 0x60, 0x1c, 0x22, 0x46, 0xa6, 0x30, + 0xaa, 0xe8, 0x58, 0x83, 0x27, 0x51, 0x8c, 0x45, 0x69, 0x4d, 0xd5, 0xe0, 0x49, 0x14, 0x8b, 0x92, + 0x74, 0x0b, 0xfe, 0xc1, 0x9f, 0x84, 0x51, 0xc2, 0xc6, 0x7e, 0xe8, 0xb1, 0xf9, 0xd8, 0x8d, 0xc2, + 0xd3, 0xc0, 0x77, 0x53, 0xd4, 0xa5, 0x49, 0xdf, 0x96, 0xc4, 0x81, 0xa0, 0xed, 0x28, 0x92, 0xfd, + 0x21, 0x58, 0xcf, 0xd9, 0x25, 0x16, 0x84, 0x9c, 0xdc, 0x01, 0xfd, 0xfc, 0x42, 0xe5, 0x3a, 0x43, + 0x9c, 0xe0, 0xf9, 0x0b, 0xaa, 0x9f, 0x5f, 0xd8, 0x73, 0x30, 0x87, 0x2a, 0xd1, 0x93, 0x47, 0x22, + 0x24, 0x62, 0x68, 0x55, 0x0f, 0x0b, 0x2b, 0xef, 0x52, 0x8d, 0x41, 0x33, 0xba, 0xb0, 0x25, 0x1e, + 0x44, 0x29, 0x45, 0x02, 0xe5, 0x0a, 0xa7, 0x52, 0xae, 0x70, 0xb0, 0x58, 0x8b, 0x42, 0xa6, 0x5c, + 0x1c, 0xbf, 0xed, 0xff, 0xd6, 0xc1, 0xcc, 0x53, 0xd1, 0x47, 0x60, 0x4d, 0x33, 0x7b, 0xa8, 0x27, + 0x8b, 0xe5, 0x6c, 0x6e, 0x24, 0x5a, 0xd0, 0xd5, 0x5d, 0xaa, 0xcb, 0x77, 0x29, 0xde, 0x7c, 0xed, + 0x8d, 0x6f, 0xfe, 0x21, 0xdc, 0x72, 0x03, 0xe6, 0x84, 0xe3, 0xe2, 0xc9, 0x4a, 0xaf, 0x5c, 0x45, + 0xf4, 0x51, 0xfe, 0x6e, 0x55, 0xdc, 0xaa, 0x17, 0xe9, 0xe5, 0x3e, 0xd4, 0x3c, 0x16, 0xa4, 0x4e, + 0xb9, 0x3b, 0x39, 0x4c, 0x1c, 0x37, 0x60, 0x3d, 0x81, 0xa6, 0x92, 0x4a, 0x36, 0xc0, 0xcc, 0x2a, + 0x28, 0xd5, 0x93, 0x60, 0xf1, 0x9b, 0x29, 0x9b, 0xe6, 0xd4, 0x42, 0x97, 0x50, 0xd2, 0xa5, 0xfd, + 0x29, 0x54, 0x9e, 0xbf, 0x18, 0x5e, 0x67, 0xb7, 0x5c, 0xa3, 0x7a, 0x49, 0xa3, 0xdf, 0x83, 0xfe, + 0xfc, 0x45, 0x39, 0xd2, 0x36, 0xf3, 0x84, 0x28, 0xfa, 0x57, 0xbd, 0xe8, 0x5f, 0xbb, 0x60, 0xce, + 0x38, 0x4b, 0xf6, 0x59, 0xea, 0xa8, 0x27, 0x9f, 0xc3, 0x22, 0x31, 0x8a, 0x66, 0xcc, 0x8f, 0x42, + 0x95, 0x8c, 0x32, 0xd0, 0xfe, 0x43, 0x05, 0xea, 0xea, 0xe9, 0x8b, 0x35, 0x67, 0x79, 0x21, 0x28, + 0x3e, 0x8b, 0x18, 0xa2, 0x97, 0x63, 0x48, 0xb9, 0x53, 0xae, 0xbc, 0xb9, 0x53, 0x26, 0x5f, 0x43, + 0x33, 0x96, 0xb4, 0x72, 0xd4, 0x79, 0xa7, 0x2c, 0xa3, 0x7e, 0x51, 0xae, 0x11, 0x17, 0x80, 0x78, + 0x3f, 0xd8, 0x72, 0xa4, 0xce, 0x04, 0x5d, 0xa0, 0x49, 0xeb, 0x02, 0x1e, 0x39, 0x93, 0x6b, 0x62, + 0xcf, 0x4f, 0x08, 0x21, 0xa2, 0xe0, 0x8d, 0xe2, 0x4e, 0x13, 0xc3, 0x82, 0x08, 0x3b, 0xe5, 0x88, + 0xd0, 0x5a, 0x8c, 0x08, 0xef, 0x81, 0xe5, 0x46, 0xd3, 0xa9, 0x8f, 0xb4, 0x55, 0x99, 0xaa, 0x25, + 0x62, 0xc4, 0xed, 0x97, 0x50, 0x57, 0x97, 0x25, 0x0d, 0xa8, 0xf7, 0xfa, 0xbb, 0xdb, 0xc7, 0x7b, + 0x22, 0x26, 0x01, 0x18, 0x4f, 0x07, 0x07, 0xdb, 0xf4, 0xdf, 0xdb, 0x9a, 0x88, 0x4f, 0x83, 0x83, + 0x51, 0x5b, 0x27, 0x16, 0xd4, 0x76, 0xf7, 0x0e, 0xb7, 0x47, 0xed, 0x0a, 0x31, 0xa1, 0xfa, 0xf4, + 0xf0, 0x70, 0xaf, 0x5d, 0x25, 0x4d, 0x30, 0x7b, 0xdb, 0xa3, 0xfe, 0x68, 0xb0, 0xdf, 0x6f, 0xd7, + 0x04, 0xef, 0xb3, 0xfe, 0x61, 0xdb, 0x10, 0x1f, 0xc7, 0x83, 0x5e, 0xbb, 0x2e, 0xe8, 0x47, 0xdb, + 0xc3, 0xe1, 0xb7, 0x87, 0xb4, 0xd7, 0x36, 0xc5, 0xba, 0xc3, 0x11, 0x1d, 0x1c, 0x3c, 0x6b, 0x5b, + 0xf6, 0xa7, 0xd0, 0x28, 0x29, 0x4d, 0x48, 0xd0, 0xfe, 0x6e, 0x7b, 0x45, 0x6c, 0xf3, 0x62, 0x7b, + 0xef, 0xb8, 0xdf, 0xd6, 0xc8, 0x2a, 0x00, 0x7e, 0x8e, 0xf7, 0xb6, 0x0f, 0x9e, 0xb5, 0x75, 0xfb, + 0x5f, 0xc0, 0x3c, 0xf6, 0xbd, 0xa7, 0x41, 0xe4, 0x9e, 0x0b, 0x5f, 0x3b, 0x71, 0x38, 0x53, 0xc9, + 0x1b, 0xbf, 0x45, 0x76, 0x41, 0x3f, 0xe7, 0xca, 0xdc, 0x0a, 0xb2, 0x0f, 0xa0, 0x7e, 0xec, 0x7b, + 0x47, 0x8e, 0x7b, 0x2e, 0xba, 0xec, 0x13, 0x21, 0x3f, 0xe6, 0xfe, 0x4b, 0xa6, 0x02, 0xab, 0x85, + 0x98, 0xa1, 0xff, 0x92, 0x91, 0x7b, 0x60, 0x20, 0x90, 0x95, 0x59, 0xf8, 0x3c, 0xb2, 0x3d, 0xa9, + 0xa2, 0xd9, 0x69, 0x7e, 0x74, 0xec, 0xa0, 0xef, 0x42, 0x35, 0x76, 0xdc, 0x73, 0x15, 0x9f, 0x1a, + 0x4a, 0x44, 0x6c, 0x47, 0x91, 0x40, 0x1e, 0x82, 0xa9, 0x5c, 0x22, 0x5b, 0xb7, 0x51, 0xf2, 0x1d, + 0x9a, 0x13, 0x17, 0x8d, 0x55, 0x59, 0x32, 0xd6, 0xe7, 0x00, 0xc5, 0xc0, 0xe1, 0x8a, 0x82, 0xfb, + 0x36, 0xd4, 0x9c, 0xc0, 0x57, 0x97, 0xb7, 0xa8, 0x04, 0xec, 0x03, 0x68, 0x94, 0xc6, 0x14, 0xc2, + 0x53, 0x9c, 0x20, 0x18, 0x9f, 0xb3, 0x4b, 0x8e, 0xb2, 0x26, 0xad, 0x3b, 0x41, 0xf0, 0x9c, 0x5d, + 0x72, 0x72, 0x0f, 0x6a, 0x72, 0xc2, 0xa1, 0x2f, 0x35, 0xd2, 0x28, 0x4a, 0x25, 0xd1, 0xfe, 0x18, + 0x0c, 0xd9, 0x5d, 0x97, 0x1c, 0x55, 0xbb, 0x36, 0xd7, 0x7d, 0xa5, 0xce, 0x8c, 0xbd, 0x38, 0xf9, + 0x48, 0x4d, 0x52, 0xb8, 0x9c, 0xdb, 0x68, 0x45, 0xfd, 0x27, 0x99, 0xd4, 0x10, 0x05, 0x99, 0xed, + 0x1e, 0x98, 0x37, 0xce, 0xa6, 0x94, 0x02, 0xf4, 0x42, 0x01, 0x57, 0x4c, 0xab, 0xec, 0xff, 0x00, + 0x28, 0x26, 0x2e, 0xea, 0xdd, 0xc8, 0x55, 0xc4, 0xbb, 0x79, 0x0c, 0xa6, 0x7b, 0xe6, 0x07, 0x5e, + 0xc2, 0xc2, 0x85, 0x5b, 0x17, 0x33, 0x9a, 0x9c, 0x4e, 0xd6, 0xa1, 0x8a, 0x83, 0xa4, 0x4a, 0x11, + 0x37, 0xf3, 0x29, 0x12, 0x52, 0xec, 0x13, 0x68, 0xc9, 0x14, 0x4a, 0xd9, 0x7f, 0xce, 0x18, 0xbf, + 0xb1, 0x30, 0x5b, 0x03, 0xc8, 0xa3, 0x7c, 0x36, 0x12, 0x2b, 0x61, 0x84, 0x2b, 0x9f, 0xfa, 0x2c, + 0xf0, 0xb2, 0xdb, 0x28, 0xc8, 0xfe, 0x02, 0x9a, 0xd9, 0x1e, 0xaa, 0x31, 0xcf, 0x12, 0xb9, 0xd4, + 0xa6, 0xec, 0x47, 0x24, 0xcb, 0x41, 0xe4, 0xe5, 0x79, 0xdc, 0xfe, 0xad, 0x9e, 0x49, 0xaa, 0x1e, + 0x75, 0xa1, 0x34, 0xd4, 0x96, 0x4b, 0xc3, 0xc5, 0x32, 0x4b, 0xff, 0x49, 0x65, 0xd6, 0x97, 0x60, + 0x79, 0x58, 0x6b, 0xf8, 0x17, 0x59, 0x5c, 0xed, 0x2e, 0xd7, 0x15, 0xaa, 0x1a, 0xf1, 0x2f, 0x18, + 0x2d, 0x98, 0xc5, 0x59, 0xd2, 0xe8, 0x9c, 0x85, 0xfe, 0x4b, 0x6c, 0xc2, 0xc5, 0x85, 0x0b, 0x44, + 0x31, 0xd1, 0x90, 0xf5, 0x87, 0x9a, 0x68, 0x64, 0xc3, 0x19, 0xa3, 0x18, 0xce, 0x08, 0xad, 0xcd, + 0x62, 0xce, 0x92, 0x34, 0xab, 0x43, 0x25, 0x94, 0xd7, 0x73, 0x96, 0xe2, 0x75, 0xc2, 0x89, 0xfd, + 0x15, 0x58, 0xf9, 0x59, 0x44, 0x40, 0x3b, 0x38, 0x3c, 0xe8, 0xcb, 0xf0, 0x33, 0x38, 0xe8, 0xf5, + 0xff, 0xad, 0xad, 0x89, 0x90, 0x48, 0xfb, 0x2f, 0xfa, 0x74, 0xd8, 0x6f, 0xeb, 0x22, 0x74, 0xf5, + 0xfa, 0x7b, 0xfd, 0x51, 0xbf, 0x5d, 0xf9, 0xa6, 0x6a, 0xd6, 0xdb, 0x26, 0x35, 0xd9, 0x3c, 0x0e, + 0x7c, 0xd7, 0x4f, 0xed, 0x63, 0x30, 0xf7, 0x9d, 0xf8, 0xb5, 0x9e, 0xa2, 0xc8, 0x74, 0x33, 0x35, + 0x88, 0x50, 0x59, 0xe9, 0x3e, 0xd4, 0xd5, 0x93, 0x57, 0xde, 0xb4, 0x10, 0x0e, 0x32, 0x9a, 0xfd, + 0xff, 0x1a, 0xdc, 0xde, 0x8f, 0x2e, 0x58, 0x9e, 0xf8, 0x8f, 0x9c, 0xcb, 0x20, 0x72, 0xbc, 0x37, + 0x98, 0xee, 0x01, 0xdc, 0xe2, 0xd1, 0x2c, 0x71, 0xd9, 0x78, 0x69, 0x08, 0xd2, 0x92, 0xe8, 0x67, + 0xca, 0x05, 0x6d, 0x68, 0x79, 0x8c, 0xa7, 0x05, 0x57, 0x05, 0xb9, 0x1a, 0x02, 0x99, 0xf1, 0xe4, + 0xd5, 0x4b, 0xf5, 0x4d, 0xd5, 0x8b, 0xfd, 0x1b, 0x0d, 0x5a, 0xfd, 0x79, 0x1c, 0x25, 0x69, 0x76, + 0xcc, 0x1b, 0xdc, 0xff, 0x09, 0x18, 0x42, 0x6a, 0xc6, 0x95, 0x6b, 0x75, 0xc4, 0xc2, 0x0b, 0xd2, + 0x9b, 0x43, 0xa4, 0x53, 0xc5, 0x77, 0x7d, 0x19, 0xf7, 0x0e, 0xd4, 0x67, 0xa1, 0x3f, 0xcf, 0x86, + 0x44, 0x15, 0x6a, 0x08, 0x70, 0xc4, 0xed, 0xaf, 0xc1, 0x90, 0x6b, 0x94, 0xac, 0xdb, 0x80, 0xfa, + 0xf0, 0x78, 0x67, 0xa7, 0x3f, 0x1c, 0xb6, 0x35, 0xd2, 0x02, 0xab, 0x77, 0x7c, 0xb4, 0x37, 0xd8, + 0xd9, 0x1e, 0x29, 0x0b, 0xef, 0x6e, 0x0f, 0xf6, 0xfa, 0xbd, 0x76, 0xc5, 0xde, 0x01, 0x6b, 0x34, + 0x0f, 0x95, 0x78, 0x39, 0xbb, 0x6a, 0x37, 0x64, 0x57, 0x7d, 0x29, 0x60, 0x0f, 0xa1, 0x51, 0xaa, + 0xc1, 0xc8, 0x07, 0x50, 0x4d, 0xe7, 0xe1, 0xe2, 0x64, 0x36, 0xdb, 0x83, 0x22, 0x89, 0x7c, 0x00, + 0x4d, 0xd1, 0xf5, 0x39, 0x9c, 0xfb, 0x93, 0x90, 0x79, 0x6a, 0x45, 0xd1, 0x09, 0x6e, 0x2b, 0x94, + 0x7d, 0x17, 0x5a, 0xa2, 0xcd, 0xf6, 0xa7, 0x8c, 0xa7, 0xce, 0x34, 0xc6, 0x5a, 0x40, 0x85, 0xe0, + 0x2a, 0xd5, 0x53, 0x6e, 0x3f, 0x80, 0xe6, 0x11, 0x63, 0x09, 0x65, 0x3c, 0x8e, 0x42, 0x99, 0x14, + 0x95, 0xaa, 0x65, 0xbc, 0x57, 0x90, 0xfd, 0x3d, 0x58, 0xa2, 0x8a, 0x7e, 0xea, 0xa4, 0xee, 0xd9, + 0xcf, 0xa9, 0xb2, 0x1f, 0x40, 0x3d, 0x96, 0x26, 0x52, 0x35, 0x71, 0x13, 0x43, 0x8e, 0x32, 0x1b, + 0xcd, 0x88, 0xf6, 0xe7, 0x50, 0x39, 0x98, 0x4d, 0xcb, 0xff, 0x53, 0x54, 0x65, 0x9d, 0xb7, 0xd0, + 0x5f, 0xea, 0x8b, 0xfd, 0xa5, 0xfd, 0x1d, 0x34, 0xb2, 0xab, 0x0e, 0x3c, 0xfc, 0xb3, 0x01, 0x55, + 0x3d, 0xf0, 0x16, 0x34, 0x2f, 0x1b, 0x37, 0x16, 0x7a, 0x83, 0x4c, 0x47, 0x12, 0x58, 0x5c, 0x5b, + 0x0d, 0x26, 0xf2, 0xb5, 0x77, 0xa1, 0x99, 0x55, 0xba, 0x58, 0x54, 0x0a, 0xe3, 0x05, 0x3e, 0x0b, + 0x4b, 0x86, 0x35, 0x25, 0x62, 0xc4, 0x6f, 0x98, 0x21, 0xda, 0x9b, 0xb9, 0x63, 0x11, 0xa8, 0xba, + 0x91, 0x27, 0xdf, 0x60, 0x8d, 0xe2, 0xb7, 0xb8, 0xf0, 0x94, 0x4f, 0xb2, 0xbc, 0x34, 0xe5, 0x13, + 0x3b, 0x85, 0xd6, 0x53, 0xc7, 0x3d, 0x9f, 0xc5, 0x59, 0x5e, 0x28, 0xf9, 0xb2, 0xb6, 0xe0, 0xcb, + 0x37, 0x0c, 0x2e, 0x4b, 0x6e, 0x2e, 0x67, 0x97, 0xca, 0xcd, 0x85, 0x7d, 0x53, 0x27, 0x99, 0xa8, + 0xc9, 0xae, 0x45, 0x15, 0xb4, 0xf5, 0x4b, 0x0d, 0xaa, 0xc2, 0x80, 0xe4, 0x1e, 0x54, 0xfb, 0xee, + 0x59, 0x44, 0x16, 0xec, 0xd4, 0x5d, 0x80, 0xec, 0x15, 0xf2, 0xb1, 0x1c, 0xdc, 0x66, 0xf3, 0xe8, + 0x56, 0x66, 0x7f, 0xf4, 0x8f, 0xd7, 0xb8, 0x37, 0xa1, 0xf1, 0x4d, 0xe4, 0x87, 0x3b, 0x72, 0x96, + 0x49, 0x96, 0xbd, 0xe5, 0x35, 0xfe, 0x4f, 0xc0, 0x18, 0x70, 0xe1, 0x96, 0xaf, 0xb3, 0x62, 0xeb, + 0x59, 0xf6, 0x58, 0x7b, 0x65, 0xeb, 0x4f, 0x3a, 0x54, 0xbf, 0x63, 0x49, 0x44, 0x3e, 0x86, 0xba, + 0x1a, 0xb4, 0x90, 0xd2, 0x40, 0xa5, 0x8b, 0x71, 0x68, 0x69, 0x02, 0x83, 0xa7, 0x32, 0x54, 0x72, + 0x2b, 0xa6, 0x3f, 0xdd, 0xab, 0x62, 0x96, 0xbd, 0xb2, 0xa1, 0x3d, 0xd1, 0xc8, 0x47, 0x60, 0xc8, + 0x07, 0xba, 0xa4, 0x9b, 0xe5, 0xf6, 0xc9, 0x5e, 0x79, 0xa2, 0x91, 0x87, 0xd0, 0x18, 0x9e, 0x45, + 0xb3, 0xc0, 0x1b, 0xb2, 0xe4, 0x82, 0x91, 0xd2, 0xcc, 0xb1, 0x5b, 0xfa, 0xb6, 0x57, 0xc8, 0x06, + 0x80, 0x74, 0xe1, 0x63, 0xdf, 0xe3, 0xa4, 0x2e, 0x68, 0x07, 0xb3, 0xa9, 0x5c, 0xb4, 0xe4, 0xdb, + 0x92, 0xb3, 0xf4, 0x90, 0x6f, 0xe2, 0xfc, 0x0c, 0x5a, 0x3b, 0x18, 0x56, 0x0e, 0x93, 0xed, 0x93, + 0x28, 0x49, 0xc9, 0xf2, 0xdc, 0xb1, 0xbb, 0x8c, 0xb0, 0x57, 0xc8, 0x13, 0x30, 0x47, 0xc9, 0xa5, + 0xe4, 0x7f, 0x4b, 0x85, 0x9b, 0x62, 0xbf, 0x2b, 0x6e, 0xb9, 0xf5, 0x63, 0x05, 0x8c, 0x6f, 0xa3, + 0xe4, 0x9c, 0x25, 0xe4, 0x31, 0x18, 0xd8, 0xe7, 0x2a, 0x57, 0xc8, 0x7b, 0xde, 0xab, 0x36, 0xba, + 0x07, 0x16, 0x2a, 0x65, 0xe4, 0xf0, 0x73, 0xa9, 0x7a, 0xfc, 0x1b, 0x50, 0xea, 0x45, 0x16, 0x2a, + 0xe8, 0x03, 0xab, 0xc3, 0x34, 0x61, 0xce, 0x34, 0xef, 0xed, 0x17, 0x9a, 0xcf, 0x6e, 0x5d, 0x76, + 0x92, 0x43, 0x65, 0x9c, 0x47, 0x50, 0x1d, 0xca, 0x9b, 0x0a, 0xa6, 0xe2, 0xaf, 0x92, 0xee, 0x6a, + 0x86, 0xc8, 0x57, 0xfe, 0x27, 0x30, 0x64, 0x8d, 0x21, 0xaf, 0xb9, 0x50, 0x84, 0x75, 0xdb, 0x65, + 0x94, 0x12, 0xb0, 0xa1, 0x7e, 0x34, 0x4b, 0x26, 0x6c, 0xc4, 0x97, 0x2c, 0x9f, 0xd9, 0xc0, 0x5e, + 0x21, 0x8f, 0xc0, 0x90, 0xaf, 0x56, 0x2e, 0xba, 0xf0, 0x82, 0xe5, 0xcd, 0x64, 0x10, 0x40, 0x45, + 0x1b, 0x32, 0x77, 0x49, 0xd6, 0x85, 0x3c, 0xd6, 0x7d, 0x1d, 0x85, 0xba, 0x68, 0x53, 0xe6, 0x32, + 0xbf, 0x94, 0xdc, 0x49, 0x76, 0xff, 0xe5, 0xc7, 0xb3, 0xa1, 0x91, 0xaf, 0xa0, 0xb5, 0x50, 0x08, + 0x10, 0xcc, 0x97, 0x57, 0xd5, 0x06, 0xcb, 0xc2, 0x4f, 0xdb, 0xbf, 0x7e, 0xb5, 0xa6, 0xfd, 0xf8, + 0x6a, 0x4d, 0xfb, 0xdd, 0xab, 0x35, 0xed, 0x87, 0xdf, 0xaf, 0xad, 0x9c, 0x18, 0xf8, 0x4f, 0xf3, + 0x67, 0x7f, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xda, 0x61, 0x1a, 0x3e, 0x84, 0x1e, 0x00, 0x00, } diff --git a/worker/draft.go b/worker/draft.go index 8a3b45aaad3..af43b509572 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -47,16 +47,11 @@ import ( "golang.org/x/net/trace" ) -// uniqueKey is meant to be unique across all the replicas. -func uniqueKey() string { - return fmt.Sprintf("%02d-%d", groups().Node.Id, groups().Node.Rand.Uint64()) -} - type node struct { *conn.Node // Fields which are never changed after init. - applyCh chan []raftpb.Entry + applyCh chan []*pb.Proposal rollupCh chan uint64 // Channel to run posting list rollups. ctx context.Context gid uint32 @@ -90,7 +85,7 @@ func newNode(store *raftwal.DiskStorage, gid uint32, id uint64, myAddr string) * // We need a generous size for applyCh, because raft.Tick happens every // 10ms. If we restrict the size here, then Raft goes into a loop trying // to maintain quorum health. - applyCh: make(chan []raftpb.Entry, 1000), + applyCh: make(chan []*pb.Proposal, 1000), rollupCh: make(chan uint64, 3), elog: trace.NewEventLog("Dgraph", "ApplyCh"), closer: y.NewCloser(3), // Matches CLOSER:1 @@ -164,7 +159,7 @@ func detectPendingTxns(attr string) error { // We don't support schema mutations across nodes in a transaction. // Wait for all transactions to either abort or complete and all write transactions // involving the predicate are aborted until schema mutations are done. -func (n *node) applyMutations(proposal *pb.Proposal, index uint64) error { +func (n *node) applyMutations(proposal *pb.Proposal) error { tr := trace.New("Dgraph.Node", "ApplyMutations") defer tr.Finish() @@ -252,7 +247,7 @@ func (n *node) applyMutations(proposal *pb.Proposal, index uint64) error { // Since committed entries are serialized, updateSchemaIfMissing is not // needed, In future if schema needs to be changed, it would flow through // raft so there won't be race conditions between read and update schema - updateSchemaType(attr, storageType, index) + updateSchemaType(attr, storageType, proposal.Index) } } @@ -263,27 +258,35 @@ func (n *node) applyMutations(proposal *pb.Proposal, index uint64) error { tr.SetError() return dy.ErrConflict } + tr.LazyPrintf("Applying %d edges", len(m.Edges)) - span.Annotate([]otrace.Attribute{otrace.Int64Attribute("num", int64(len(m.Edges)))}, "Applying edges") + span.Annotatef(nil, "To apply: %d edges", len(m.Edges)) + var retries int for _, edge := range m.Edges { - err := posting.ErrRetry - for err == posting.ErrRetry { - err = runMutation(ctx, edge, txn) - } - if err != nil { - tr.SetError() - return err + for { + err := runMutation(ctx, edge, txn) + if err == nil { + break + } + if err != posting.ErrRetry { + tr.SetError() + return err + } + retries++ } } + if retries > 0 { + span.Annotatef(nil, "retries=true num=%d", retries) + } tr.LazyPrintf("Done applying %d edges", len(m.Edges)) return nil } -func (n *node) applyCommitted(proposal *pb.Proposal, index uint64) error { +func (n *node) applyCommitted(proposal *pb.Proposal) error { if proposal.Mutations != nil { // syncmarks for this shouldn't be marked done until it's comitted. n.elog.Printf("Applying mutations for key: %s", proposal.Key) - return n.applyMutations(proposal, index) + return n.applyMutations(proposal) } ctx := n.Ctx(proposal.Key) @@ -381,47 +384,35 @@ func (n *node) processApplyCh() { previous := make(map[string]*P) // This function must be run serially. - handle := func(entries []raftpb.Entry) { - for _, e := range entries { - switch { - case e.Type == raftpb.EntryConfChange: - // Already handled in the main Run loop. - case len(e.Data) == 0: - n.elog.Printf("Found empty data at index: %d", e.Index) - n.Applied.Done(e.Index) - default: - proposal := &pb.Proposal{} - if err := proposal.Unmarshal(e.Data); err != nil { - x.Fatalf("Unable to unmarshal proposal: %v %q\n", err, e.Data) - } - // We use the size as a double check to ensure that we're - // working with the same proposal as before. - psz := proposal.Size() - - var perr error - p, ok := previous[proposal.Key] - if ok && p.err == nil && p.size == psz { - n.elog.Printf("Proposal with key: %s already applied. Skipping index: %d.\n", - proposal.Key, e.Index) - previous[proposal.Key].seen = time.Now() // Update the ts. - // Don't break here. We still need to call the Done below. + handle := func(proposals []*pb.Proposal) { + for _, proposal := range proposals { + // We use the size as a double check to ensure that we're + // working with the same proposal as before. + psz := proposal.Size() + + var perr error + p, ok := previous[proposal.Key] + if ok && p.err == nil && p.size == psz { + n.elog.Printf("Proposal with key: %s already applied. Skipping index: %d.\n", + proposal.Key, proposal.Index) + previous[proposal.Key].seen = time.Now() // Update the ts. + // Don't break here. We still need to call the Done below. - } else { - perr = n.applyCommitted(proposal, e.Index) - if len(proposal.Key) > 0 { - p := &P{err: perr, size: psz, seen: time.Now()} - previous[proposal.Key] = p - } - if perr != nil { - glog.Errorf("Applying proposal. Error: %v. Proposal: %q.", perr, proposal) - } - n.elog.Printf("Applied proposal with key: %s, index: %d. Err: %v", - proposal.Key, e.Index, perr) + } else { + perr = n.applyCommitted(proposal) + if len(proposal.Key) > 0 { + p := &P{err: perr, size: psz, seen: time.Now()} + previous[proposal.Key] = p } - - n.Proposals.Done(proposal.Key, perr) - n.Applied.Done(e.Index) + if perr != nil { + glog.Errorf("Applying proposal. Error: %v. Proposal: %q.", perr, proposal) + } + n.elog.Printf("Applied proposal with key: %s, index: %d. Err: %v", + proposal.Key, proposal.Index, perr) } + + n.Proposals.Done(proposal.Key, perr) + n.Applied.Done(proposal.Index) } } @@ -728,6 +719,7 @@ func (n *node) Run() { } // Now schedule or apply committed entries. + var proposals []*pb.Proposal for _, entry := range rd.CommittedEntries { // Need applied watermarks for schema mutation also for read linearazibility // Applied watermarks needs to be emitted as soon as possible sequentially. @@ -742,11 +734,29 @@ func (n *node) Run() { // Not present in proposal map. n.Applied.Done(entry.Index) groups().triggerMembershipSync() + + } else if len(entry.Data) == 0 { + n.elog.Printf("Found empty data at index: %d", entry.Index) + n.Applied.Done(entry.Index) + + } else { + proposal := &pb.Proposal{} + if err := proposal.Unmarshal(entry.Data); err != nil { + x.Fatalf("Unable to unmarshal proposal: %v %q\n", err, entry.Data) + } + if pctx := n.Proposals.Get(proposal.Key); pctx != nil { + atomic.AddUint32(&pctx.Found, 1) + if span := otrace.FromContext(pctx.Ctx); span != nil { + span.Annotate(nil, "Proposal found in CommittedEntries") + } + } + proposal.Index = entry.Index + proposals = append(proposals, proposal) } } - // Send the whole lot to applyCh in one go, instead of sending entries one by one. - if len(rd.CommittedEntries) > 0 { - n.applyCh <- rd.CommittedEntries + // Send the whole lot to applyCh in one go, instead of sending proposals one by one. + if len(proposals) > 0 { + n.applyCh <- proposals } if tr != nil { diff --git a/worker/proposal.go b/worker/proposal.go index 935392268bd..ba79d6ea19f 100644 --- a/worker/proposal.go +++ b/worker/proposal.go @@ -18,6 +18,7 @@ package worker import ( "errors" + "fmt" "sync/atomic" "time" @@ -94,6 +95,11 @@ func (rl *rateLimiter) decr(retry int) { atomic.AddInt32(&rl.iou, int32(weight)) } +// uniqueKey is meant to be unique across all the replicas. +func uniqueKey() string { + return fmt.Sprintf("%02d-%d", groups().Node.Id, groups().Node.Rand.Uint64()) +} + var errInternalRetry = errors.New("Retry Raft proposal internally") var errUnableToServe = errors.New("Server unavailable. Please retry later") @@ -148,7 +154,7 @@ func (n *node) proposeAndWait(ctx context.Context, proposal *pb.Proposal) error proposal.Key = key propose := func(timeout time.Duration) error { - cctx, cancel := context.WithTimeout(ctx, timeout) + cctx, cancel := context.WithCancel(ctx) defer cancel() cctx, span := otrace.StartSpan(cctx, "node.propose") @@ -178,23 +184,34 @@ func (n *node) proposeAndWait(ctx context.Context, proposal *pb.Proposal) error tr.LazyPrintf("Waiting for the proposal.") } - select { - case err = <-che: - // We arrived here by a call to n.Proposals.Done(). - if tr, ok := trace.FromContext(ctx); ok { - tr.LazyPrintf("Done with error: %v", err) - } - return err - case <-ctx.Done(): - if tr, ok := trace.FromContext(ctx); ok { - tr.LazyPrintf("External context timed out with error: %v.", ctx.Err()) - } - return ctx.Err() - case <-cctx.Done(): - if tr, ok := trace.FromContext(ctx); ok { - tr.LazyPrintf("Internal context timed out with error: %v. Retrying...", cctx.Err()) + timer := time.NewTimer(timeout) + defer timer.Stop() + + for { + select { + case err = <-che: + // We arrived here by a call to n.Proposals.Done(). + if tr, ok := trace.FromContext(ctx); ok { + tr.LazyPrintf("Done with error: %v", err) + } + return err + case <-ctx.Done(): + if tr, ok := trace.FromContext(ctx); ok { + tr.LazyPrintf("External context timed out with error: %v.", ctx.Err()) + } + return ctx.Err() + case <-timer.C: + if atomic.LoadUint32(&pctx.Found) > 0 { + // We found the proposal in CommittedEntries. No need to retry. + } else { + cancel() + } + case <-cctx.Done(): + if tr, ok := trace.FromContext(ctx); ok { + tr.LazyPrintf("Internal context timed out with error: %v. Retrying...", cctx.Err()) + } + return errInternalRetry } - return errInternalRetry } }