in swim/join_sender.go [249:280]
func (j *joinSender) SelectGroup(nodesJoined []string) []string {
var group []string
// if fully exhausted or first round, initialize this round's nodes
if len(j.roundPreferredNodes) == 0 && len(j.roundNonPreferredNodes) == 0 {
j.Init(nodesJoined)
}
numNodesLeft := j.size - len(nodesJoined)
cont := func() bool {
if len(group) == numNodesLeft*j.parallelismFactor {
return false
}
nodesAvailable := len(j.roundPreferredNodes) + len(j.roundNonPreferredNodes)
if nodesAvailable == 0 {
return false
}
return true
}
for cont() {
if len(j.roundPreferredNodes) > 0 {
group = append(group, util.TakeNode(&j.roundPreferredNodes, -1))
} else if len(j.roundNonPreferredNodes) > 0 {
group = append(group, util.TakeNode(&j.roundNonPreferredNodes, -1))
}
}
return group
}