|
@@ -52,13 +52,6 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- if snapshot != nil {
|
|
|
- // Load the snapshot data into the store
|
|
|
- if err := n.restoreFromSnapshot(snapshot.Data, forceNewCluster); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
// Read logs to fully catch up store
|
|
|
var raftNode api.RaftMember
|
|
|
if err := raftNode.Unmarshal(waldata.Metadata); err != nil {
|
|
@@ -66,6 +59,13 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error {
|
|
|
}
|
|
|
n.Config.ID = raftNode.RaftID
|
|
|
|
|
|
+ if snapshot != nil {
|
|
|
+ // Load the snapshot data into the store
|
|
|
+ if err := n.restoreFromSnapshot(snapshot.Data, forceNewCluster); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
ents, st := waldata.Entries, waldata.HardState
|
|
|
|
|
|
// All members that are no longer part of the cluster must be added to
|
|
@@ -88,14 +88,14 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error {
|
|
|
// discard the previously uncommitted entries
|
|
|
for i, ent := range ents {
|
|
|
if ent.Index > st.Commit {
|
|
|
- log.G(ctx).Infof("discarding %d uncommitted WAL entries ", len(ents)-i)
|
|
|
+ log.G(ctx).Infof("discarding %d uncommitted WAL entries", len(ents)-i)
|
|
|
ents = ents[:i]
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// force append the configuration change entries
|
|
|
- toAppEnts := createConfigChangeEnts(getIDs(snapshot, ents), uint64(n.Config.ID), st.Term, st.Commit)
|
|
|
+ toAppEnts := createConfigChangeEnts(getIDs(snapshot, ents), n.Config.ID, st.Term, st.Commit)
|
|
|
|
|
|
// All members that are being removed as part of the
|
|
|
// force-new-cluster process must be added to the
|
|
@@ -230,13 +230,15 @@ func (n *Node) restoreFromSnapshot(data []byte, forceNewCluster bool) error {
|
|
|
|
|
|
oldMembers := n.cluster.Members()
|
|
|
|
|
|
- if !forceNewCluster {
|
|
|
- for _, member := range snapshot.Membership.Members {
|
|
|
+ for _, member := range snapshot.Membership.Members {
|
|
|
+ if forceNewCluster && member.RaftID != n.Config.ID {
|
|
|
+ n.cluster.RemoveMember(member.RaftID)
|
|
|
+ } else {
|
|
|
if err := n.registerNode(&api.RaftMember{RaftID: member.RaftID, NodeID: member.NodeID, Addr: member.Addr}); err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- delete(oldMembers, member.RaftID)
|
|
|
}
|
|
|
+ delete(oldMembers, member.RaftID)
|
|
|
}
|
|
|
|
|
|
for _, removedMember := range snapshot.Membership.Removed {
|