@@ -57,12 +57,33 @@ func (d *peerMsgHandler) HandleRaftReady() {
5757 if err != nil {
5858 panic (err )
5959 }
60- // if this node is just joining a group with a snapshot from leader, also restore
61- // the region state including version/conf numbering
60+
61+ kvWB := engine_util. WriteBatch {}
6262 if snapshotRet != nil {
63- d .ctx .storeMeta .regionRanges .ReplaceOrInsert (& regionItem {region : snapshotRet .Region })
64- // assert d.Region() == this one
63+ // if this node is just joining a group with a snapshot from leader, also restore
64+ // the region state including version/conf numbering
65+ d .SetRegion (snapshotRet .Region )
66+
67+ d .ctx .storeMeta .regions [d .regionId ] = d .Region ()
68+ d .ctx .storeMeta .regionRanges .ReplaceOrInsert (& regionItem {region : d .Region ()})
69+
70+ d .peer .peerCache = map [uint64 ]* metapb.Peer {}
71+ for _ , p := range d .Region ().Peers {
72+ d .insertPeerCache (p )
73+ }
74+
75+ }
76+
77+ // The peer can be just started after restoring snapshot, or just started but without any
78+ // need of snapshot, in case system reuses peer id (which it really should not be doing).
79+ // Persist the region info and set it as normal here.
80+ if d .RaftGroup .Raft .IsMember (d .PeerId ()) {
81+ kvWB .SetMeta (meta .RegionStateKey (d .regionId ), & rspb.RegionLocalState {
82+ State : rspb .PeerState_Normal ,
83+ Region : d .Region (),
84+ })
6585 }
86+
6687 applied := d .peerStorage .applyState .AppliedIndex
6788 // send messages here:
6889 for _ , m := range rd .Messages {
@@ -75,8 +96,11 @@ func (d *peerMsgHandler) HandleRaftReady() {
7596 }
7697
7798 // apply the committed entries to the state machine
78- kvWB := engine_util.WriteBatch {}
7999 for _ , m := range rd .CommittedEntries {
100+ if m .Index <= d .peerStorage .applyState .AppliedIndex {
101+ log .Infof ("Node %v see stale index %v <= %v" , d .PeerId (), m .Index , d .peerStorage .applyState .AppliedIndex )
102+ continue
103+ }
80104 log .Infof ("%v applying index %v, region %v" , d .Tag , m .Index , d .Region ())
81105 if m .EntryType == pb .EntryType_EntryConfChange {
82106 var cc pb.ConfChange
@@ -121,7 +145,7 @@ func (d *peerMsgHandler) HandleRaftReady() {
121145 }
122146 }
123147 if idx < 0 {
124- panic ( idx )
148+ log . Panicf ( "%v:%v, looking for %v" , d . Tag , d . Region (), cc . NodeId )
125149 }
126150 if cc .NodeId == d .PeerId () {
127151 // Don't increase the conf number here. Otherwise when getting restarted,
@@ -152,6 +176,9 @@ func (d *peerMsgHandler) HandleRaftReady() {
152176 }
153177 }
154178
179+ // finally, advance applied state
180+ d .peerStorage .applyState .AppliedIndex = m .Index
181+ kvWB .SetMeta (meta .ApplyStateKey (d .Region ().Id ), d .peerStorage .applyState )
155182 } else if len (m .Data ) > 0 {
156183 var r raft_cmdpb.RaftCmdRequest
157184 err := r .Unmarshal (m .Data )
@@ -161,10 +188,6 @@ func (d *peerMsgHandler) HandleRaftReady() {
161188
162189 log .Debug ("Node %v processing index %v, term %v" , d .PeerId (), m .Index , m .Term )
163190
164- if m .Index <= d .peerStorage .applyState .AppliedIndex {
165- log .Debug ("Node %v see stale index %v <= %v" , d .PeerId (), m .Index , d .peerStorage .applyState .AppliedIndex )
166- continue
167- }
168191 for _ , cmd := range r .Requests {
169192 switch cmd .CmdType {
170193 case raft_cmdpb .CmdType_Put :
@@ -422,6 +445,7 @@ func (d *peerMsgHandler) proposeRaftCommand(msg *raft_cmdpb.RaftCmdRequest, cb *
422445 case raft_cmdpb .AdminCmdType_ChangePeer :
423446 // There can be at most one pending peer adding/removing, so we check if this is done.
424447 changeReq := msg .AdminRequest .ChangePeer
448+ log .Infof ("Issuing conf change request: %v" , changeReq )
425449 switch changeReq .ChangeType {
426450 case pb .ConfChangeType_AddNode :
427451 if d .RaftGroup .Raft .IsMember (changeReq .Peer .Id ) {
@@ -447,7 +471,6 @@ func (d *peerMsgHandler) proposeRaftCommand(msg *raft_cmdpb.RaftCmdRequest, cb *
447471 }
448472 cb .Done (resp )
449473 case pb .ConfChangeType_RemoveNode :
450- log .Infof ("Getting remove node request: %v" , changeReq )
451474 if ! d .RaftGroup .Raft .IsMember (changeReq .Peer .Id ) {
452475 // done
453476 log .Infof ("Done with node request :%v" , changeReq )
@@ -706,7 +729,7 @@ func (d *peerMsgHandler) checkSnapshot(msg *rspb.RaftMessage) (*snap.SnapKey, er
706729 }
707730 }
708731 if ! contains {
709- log .Infof ("%s %s doesn't contains peer %d, skip" , d .Tag , snapRegion , peerID )
732+ log .Infof ("%s %s doesn't contain peer %d, skip" , d .Tag , snapRegion , peerID )
710733 return & key , nil
711734 }
712735 meta := d .ctx .storeMeta
0 commit comments