Do not bootstrap if node is online candidate #525

Merged
fyrchik merged 1 commit from dstepanov-yadro/frostfs-node:fix/bootstrap-single into master 2023-07-18 10:51:03 +00:00
3 changed files with 16 additions and 7 deletions

View file

@ -337,7 +337,8 @@ type internals struct {
apiVersion version.Version
healthStatus *atomic.Int32
// is node under maintenance
isMaintenance atomic.Bool
isMaintenance atomic.Bool
isOnlineCandidate bool
}
// starts node's maintenance.

View file

@ -227,6 +227,10 @@ func bootstrapNode(c *cfg) {
c.log.Info(logs.FrostFSNodeNodeIsUnderMaintenanceSkipInitialBootstrap)
return
}
if c.isOnlineCandidate {
c.log.Info(logs.NetmapNodeAlreadyInCandidateListOnlineSkipInitialBootstrap)
return
}
err := c.bootstrap()
fatalOnErrDetails("bootstrap error", err)
}
@ -258,7 +262,8 @@ func initNetmapState(c *cfg) {
epoch, err := c.cfgNetmap.wrapper.Epoch()
fatalOnErrDetails("could not initialize current epoch number", err)
ni, err := c.netmapInitLocalNodeState(epoch)
var ni *netmapSDK.NodeInfo
ni, c.isOnlineCandidate, err = c.netmapInitLocalNodeState(epoch)
fatalOnErrDetails("could not init network state", err)
stateWord := nodeState(ni)
@ -291,27 +296,29 @@ func nodeState(ni *netmapSDK.NodeInfo) string {
return "undefined"
}
func (c *cfg) netmapInitLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, error) {
func (c *cfg) netmapInitLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, bool, error) {
nmNodes, err := c.cfgNetmap.wrapper.GetCandidates()
if err != nil {
return nil, err
return nil, false, err
}
var candidate *netmapSDK.NodeInfo
isOnlineCandidate := false
for i := range nmNodes {
if bytes.Equal(nmNodes[i].PublicKey(), c.binPublicKey) {
candidate = &nmNodes[i]
isOnlineCandidate = candidate.IsOnline()
break
}
}
node, err := c.netmapLocalNodeState(epoch)
if err != nil {
return nil, err
return nil, false, err
}
if candidate == nil {
return node, nil
return node, false, nil
}
nmState := nodeState(node)
@ -323,7 +330,7 @@ func (c *cfg) netmapInitLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, error
zap.String("netmap", nmState),
zap.String("candidate", candidateState))
}
return candidate, nil
return candidate, isOnlineCandidate, nil
}
func (c *cfg) netmapLocalNodeState(epoch uint64) (*netmapSDK.NodeInfo, error) {

View file

@ -493,4 +493,5 @@ const (
ShardDeleteCantDeleteFromWriteCache = "can't delete object from write cache"
FrostFSNodeNodeIsUnderMaintenanceSkipInitialBootstrap = "the node is under maintenance, skip initial bootstrap"
EngineCouldNotChangeShardModeToDisabled = "could not change shard mode to disabled"
NetmapNodeAlreadyInCandidateListOnlineSkipInitialBootstrap = "the node is already in candidate list with online state, skip initial bootstrap"
)