diff --git a/cmd/frostfs-node/config.go b/cmd/frostfs-node/config.go index 31b1a793..47f84827 100644 --- a/cmd/frostfs-node/config.go +++ b/cmd/frostfs-node/config.go @@ -343,8 +343,8 @@ type internals struct { apiVersion version.Version healthStatus *atomic.Int32 // is node under maintenance - isMaintenance atomic.Bool - isOnlineCandidate bool + isMaintenance atomic.Bool + alreadyBootstraped bool } // starts node's maintenance. diff --git a/cmd/frostfs-node/netmap.go b/cmd/frostfs-node/netmap.go index 96b866b1..60a59940 100644 --- a/cmd/frostfs-node/netmap.go +++ b/cmd/frostfs-node/netmap.go @@ -227,7 +227,7 @@ func bootstrapNode(c *cfg) { c.log.Info(logs.FrostFSNodeNodeIsUnderMaintenanceSkipInitialBootstrap) return } - if c.isOnlineCandidate { + if c.alreadyBootstraped { c.log.Info(logs.NetmapNodeAlreadyInCandidateListOnlineSkipInitialBootstrap) return } @@ -263,7 +263,7 @@ func initNetmapState(c *cfg) { fatalOnErrDetails("could not initialize current epoch number", err) var ni *netmapSDK.NodeInfo - ni, c.isOnlineCandidate, err = c.netmapInitLocalNodeState(epoch) + ni, c.alreadyBootstraped, err = c.netmapInitLocalNodeState(epoch) fatalOnErrDetails("could not init network state", err) stateWord := nodeState(ni) @@ -282,6 +282,13 @@ func initNetmapState(c *cfg) { c.handleLocalNodeInfo(ni) } +func sameNodeInfo(a, b *netmapSDK.NodeInfo) bool { + // Suboptimal, but we do this once on the node startup. + rawA := a.Marshal() + rawB := b.Marshal() + return bytes.Equal(rawA, rawB) +} + func nodeState(ni *netmapSDK.NodeInfo) string { if ni != nil { switch { @@ -303,11 +310,11 @@ func (c *cfg) netmapInitLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, bool, } var candidate *netmapSDK.NodeInfo - isOnlineCandidate := false + alreadyBootstraped := false for i := range nmNodes { if bytes.Equal(nmNodes[i].PublicKey(), c.binPublicKey) { candidate = &nmNodes[i] - isOnlineCandidate = candidate.IsOnline() + alreadyBootstraped = candidate.IsOnline() && sameNodeInfo(&c.cfgNodeInfo.localInfo, candidate) break } } @@ -330,7 +337,7 @@ func (c *cfg) netmapInitLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, bool, zap.String("netmap", nmState), zap.String("candidate", candidateState)) } - return candidate, isOnlineCandidate, nil + return candidate, alreadyBootstraped, nil } func (c *cfg) netmapLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, error) {