in store/cluster.go [42:78]
func NewCluster(name string, nodes []string, replicas int) (*Cluster, error) {
if len(nodes) == 0 {
return nil, errors.New("cluster nodes should NOT be empty")
}
if replicas < 0 {
return nil, errors.New("replicas should NOT be less than 0")
}
if replicas == 0 {
replicas = 1
}
if len(nodes)%replicas != 0 {
return nil, errors.New("cluster nodes should be divisible by replicas")
}
shardCount := len(nodes) / replicas
shards := make([]*Shard, 0)
slotRanges := CalculateSlotRanges(shardCount)
for i := 0; i < shardCount; i++ {
shard := NewShard()
shard.Nodes = make([]Node, 0)
for j := 0; j < replicas; j++ {
addr := nodes[i*replicas+j]
role := RoleMaster
if j != 0 {
role = RoleSlave
}
node := NewClusterNode(addr, "")
node.SetRole(role)
shard.Nodes = append(shard.Nodes, node)
}
shard.SlotRanges = append(shard.SlotRanges, slotRanges[i])
shards = append(shards, shard)
}
cluster := &Cluster{Name: name, Shards: shards}
cluster.Version.Store(1)
return cluster, nil
}