mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: Move raft node start to just before newRaftNode
This commit is contained in:
parent
08935247a8
commit
e75dfde4cb
@ -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),
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user