in store/cluster_shard.go [145:173]
func (shard *Shard) getNewMasterNodeIndex(ctx context.Context, masterNodeIndex int, preferredNodeID string) int {
newMasterNodeIndex := -1
var newestOffset uint64
for i, node := range shard.Nodes {
// don't promote the current master node
if i == masterNodeIndex {
continue
}
clusterNodeInfo, err := node.GetClusterNodeInfo(ctx)
if err != nil {
logger.Get().With(
zap.Error(err),
zap.String("id", node.ID()),
zap.String("addr", node.Addr()),
).Warn("Skip the node due to failed to get cluster info")
continue
}
// If the preferredNodeID is not empty, we will use it as the new master node.
if preferredNodeID != "" && node.ID() == preferredNodeID {
newMasterNodeIndex = i
break
}
if clusterNodeInfo.Sequence >= newestOffset {
newMasterNodeIndex = i
newestOffset = clusterNodeInfo.Sequence
}
}
return newMasterNodeIndex
}