From e75dfde4cb3a6aeb6bef00b8d7f80c8ab66811de Mon Sep 17 00:00:00 2001 From: Marek Siarkowicz Date: Wed, 7 Jul 2021 21:16:38 +0200 Subject: [PATCH] etcdserver: Move raft node start to just before newRaftNode --- server/etcdserver/raft.go | 46 +++++++++++++++---------------------- server/etcdserver/server.go | 8 +++---- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/server/etcdserver/raft.go b/server/etcdserver/raft.go index 41144587f..74715de2d 100644 --- a/server/etcdserver/raft.go +++ b/server/etcdserver/raft.go @@ -421,7 +421,7 @@ func (r *raftNode) advanceTicks(ticks int) { } } -func startNode(cfg config.ServerConfig, cl *membership.RaftCluster, ids []types.ID) *boostrapRaft { +func boostrapRaftFromCluster(cfg config.ServerConfig, cl *membership.RaftCluster, ids []types.ID) *boostrapRaft { member := cl.MemberByName(cfg.Name) metadata := pbutil.MustMarshal( &pb.Metadata{ @@ -452,29 +452,20 @@ func startNode(cfg config.ServerConfig, cl *membership.RaftCluster, ids []types. zap.String("cluster-id", cl.ID().String()), ) s := raft.NewMemoryStorage() - c := raftConfig(cfg, uint64(id), s) - var n raft.Node - if len(peers) == 0 { - n = raft.RestartNode(c) - } else { - n = raft.StartNode(c, peers) - } - raftStatusMu.Lock() - raftStatus = n.Status - raftStatusMu.Unlock() return &boostrapRaft{ lg: cfg.Logger, heartbeat: time.Duration(cfg.TickMs) * time.Millisecond, id: id, cl: cl, - node: n, + config: raftConfig(cfg, uint64(id), s), + peers: peers, storage: s, wal: w, } } -func restartNode(cfg config.ServerConfig, snapshot *raftpb.Snapshot) *boostrapRaft { +func boostrapRaftFromWal(cfg config.ServerConfig, snapshot *raftpb.Snapshot) *boostrapRaft { var walsnap walpb.Snapshot if snapshot != nil { walsnap.Index, walsnap.Term = snapshot.Metadata.Index, snapshot.Metadata.Term @@ -495,23 +486,18 @@ func restartNode(cfg config.ServerConfig, snapshot *raftpb.Snapshot) *boostrapRa } s.SetHardState(st) s.Append(ents) - c := raftConfig(cfg, uint64(id), s) - n := raft.RestartNode(c) - raftStatusMu.Lock() - raftStatus = n.Status - raftStatusMu.Unlock() return &boostrapRaft{ lg: cfg.Logger, heartbeat: time.Duration(cfg.TickMs) * time.Millisecond, id: id, cl: cl, - node: n, + config: raftConfig(cfg, uint64(id), s), storage: s, wal: w, } } -func restartAsStandaloneNode(cfg config.ServerConfig, snapshot *raftpb.Snapshot) *boostrapRaft { +func boostrapRaftFromWalStandalone(cfg config.ServerConfig, snapshot *raftpb.Snapshot) *boostrapRaft { var walsnap walpb.Snapshot if snapshot != nil { walsnap.Index, walsnap.Term = snapshot.Metadata.Index, snapshot.Metadata.Term @@ -566,16 +552,12 @@ func restartAsStandaloneNode(cfg config.ServerConfig, snapshot *raftpb.Snapshot) } s.SetHardState(st) s.Append(ents) - c := raftConfig(cfg, uint64(id), s) - - n := raft.RestartNode(c) - raftStatus = n.Status return &boostrapRaft{ lg: cfg.Logger, heartbeat: time.Duration(cfg.TickMs) * time.Millisecond, id: id, cl: cl, - node: n, + config: raftConfig(cfg, uint64(id), s), storage: s, wal: w, } @@ -599,19 +581,29 @@ type boostrapRaft struct { lg *zap.Logger heartbeat time.Duration + peers []raft.Peer + config *raft.Config id types.ID cl *membership.RaftCluster - node raft.Node storage *raft.MemoryStorage wal *wal.WAL } func (b *boostrapRaft) newRaftNode(ss *snap.Snapshotter) *raftNode { + var n raft.Node + if len(b.peers) == 0 { + n = raft.RestartNode(b.config) + } else { + n = raft.StartNode(b.config, b.peers) + } + raftStatusMu.Lock() + raftStatus = n.Status + raftStatusMu.Unlock() return newRaftNode( raftNodeConfig{ lg: b.lg, isIDRemoved: func(id uint64) bool { return b.cl.IsIDRemoved(types.ID(id)) }, - Node: b.node, + Node: n, heartbeat: b.heartbeat, raftStorage: b.storage, storage: NewStorage(b.wal, ss), diff --git a/server/etcdserver/server.go b/server/etcdserver/server.go index a08419096..aebe8554a 100644 --- a/server/etcdserver/server.go +++ b/server/etcdserver/server.go @@ -465,7 +465,7 @@ func bootstrapExistingClusterNoWAL(cfg config.ServerConfig, prt http.RoundTrippe cl.SetID(types.ID(0), existingCluster.ID()) cl.SetStore(st) cl.SetBackend(buckets.NewMembershipStore(cfg.Logger, be)) - br := startNode(cfg, cl, nil) + br := boostrapRaftFromCluster(cfg, cl, nil) cl.SetID(br.id, existingCluster.ID()) return &boostrapResult{ raft: br, @@ -505,7 +505,7 @@ func boostrapNewClusterNoWAL(cfg config.ServerConfig, prt http.RoundTripper, st } cl.SetStore(st) cl.SetBackend(buckets.NewMembershipStore(cfg.Logger, be)) - br := startNode(cfg, cl, cl.MemberIDs()) + br := boostrapRaftFromCluster(cfg, cl, cl.MemberIDs()) cl.SetID(br.id, cl.ID()) return &boostrapResult{ remotes: nil, @@ -588,9 +588,9 @@ func boostrapWithWAL(cfg config.ServerConfig, st v2store.Store, be backend.Backe r := &boostrapResult{} if !cfg.ForceNewCluster { - r.raft = restartNode(cfg, snapshot) + r.raft = boostrapRaftFromWal(cfg, snapshot) } else { - r.raft = restartAsStandaloneNode(cfg, snapshot) + r.raft = boostrapRaftFromWalStandalone(cfg, snapshot) } r.raft.cl.SetStore(st)