fix(master): fix chooseZoneNormal when multi zones and each one only has a node

Signed-off-by: liubingxing <liubbingxing@gmail.com>
This commit is contained in:
liubingxing 2025-04-02 18:19:00 +08:00 committed by 梁曟風
parent cde83bd84f
commit ec394572c8

View File

@ -2173,16 +2173,25 @@ func (c *Cluster) chooseZoneNormal(zones []*Zone, excludeNodeSets []uint64, excl
defer c.zoneIdxMux.Unlock()
for i := 0; i < replicaNum; i++ {
zone := zones[c.lastZoneIdxForNode]
c.lastZoneIdxForNode = (c.lastZoneIdxForNode + 1) % len(zones)
selectedHosts, selectedPeers, err := zone.getAvailNodeHosts(nodeType, excludeNodeSets, excludeHosts, 1)
if err != nil {
log.LogErrorf("action[chooseZoneNormal] error [%v]", err)
return nil, nil, err
}
// try all zone from zones list to get the available hosts
for j := 0; j < len(zones); j++ {
zone := zones[c.lastZoneIdxForNode]
c.lastZoneIdxForNode = (c.lastZoneIdxForNode + 1) % len(zones)
selectedHosts, selectedPeers, err := zone.getAvailNodeHosts(nodeType, excludeNodeSets, excludeHosts, 1)
if err != nil {
// no zone available
if j == len(zones)-1 {
log.LogErrorf("action[chooseZoneNormal] error [%v]", err)
return nil, nil, err
}
continue
}
hosts = append(hosts, selectedHosts...)
peers = append(peers, selectedPeers...)
hosts = append(hosts, selectedHosts...)
peers = append(peers, selectedPeers...)
// if get the available hosts, choose zone for next replica
break
}
}
return