// rebalance removes dead shards from the ring. func (ring *Ring) rebalance() { defer ring.mx.Unlock() ring.mx.Lock() ring.hash = consistenthash.New(ring.nreplicas, nil) for name, shard := range ring.shards { if shard.IsUp() { ring.hash.Add(name) } } }
func NewRing(opt *RingOptions) *Ring { const nreplicas = 100 ring := &Ring{ opt: opt, nreplicas: nreplicas, hash: consistenthash.New(nreplicas, nil), shards: make(map[string]*ringShard), } ring.commandable.process = ring.process for name, addr := range opt.Addrs { clopt := opt.clientOptions() clopt.Addr = addr ring.addClient(name, NewClient(clopt)) } go ring.heartbeat() return ring }