in store/cluster_shard.go [181:207]
func (shard *Shard) promoteNewMaster(ctx context.Context, masterNodeID, preferredNodeID string) (string, error) {
if len(shard.Nodes) <= 1 {
return "", consts.ErrShardNoReplica
}
oldMasterNodeIndex := -1
for i, node := range shard.Nodes {
if node.IsMaster() {
oldMasterNodeIndex = i
break
}
}
if oldMasterNodeIndex == -1 {
return "", consts.ErrOldMasterNodeNotFound
}
if masterNodeID != "" && shard.Nodes[oldMasterNodeIndex].ID() != masterNodeID {
return "", consts.ErrNodeIsNotMaster
}
newMasterNodeIndex := shard.getNewMasterNodeIndex(ctx, oldMasterNodeIndex, preferredNodeID)
if newMasterNodeIndex == -1 {
return "", consts.ErrShardNoMatchNewMaster
}
shard.Nodes[oldMasterNodeIndex].SetRole(RoleSlave)
shard.Nodes[newMasterNodeIndex].SetRole(RoleMaster)
preferredNewMasterNode := shard.Nodes[newMasterNodeIndex]
return preferredNewMasterNode.ID(), nil
}