( addrs map[string]string, existing *ringShards, )
| 387 | } |
| 388 | |
| 389 | func (c *ringSharding) newRingShards( |
| 390 | addrs map[string]string, existing *ringShards, |
| 391 | ) (shards *ringShards, created, unused map[string]*ringShard) { |
| 392 | shards = &ringShards{m: make(map[string]*ringShard, len(addrs))} |
| 393 | created = make(map[string]*ringShard) // indexed by addr |
| 394 | unused = make(map[string]*ringShard) // indexed by addr |
| 395 | |
| 396 | if existing != nil { |
| 397 | for _, shard := range existing.list { |
| 398 | unused[shard.addr] = shard |
| 399 | } |
| 400 | } |
| 401 | |
| 402 | for name, addr := range addrs { |
| 403 | if shard, ok := unused[addr]; ok { |
| 404 | shards.m[name] = shard |
| 405 | delete(unused, addr) |
| 406 | } else { |
| 407 | shard := newRingShard(c.opt, addr) |
| 408 | shards.m[name] = shard |
| 409 | created[addr] = shard |
| 410 | |
| 411 | for _, fn := range c.onNewNode { |
| 412 | fn(shard.Client) |
| 413 | } |
| 414 | } |
| 415 | } |
| 416 | |
| 417 | for _, shard := range shards.m { |
| 418 | shards.list = append(shards.list, shard) |
| 419 | } |
| 420 | |
| 421 | return |
| 422 | } |
| 423 | |
| 424 | // Warning: External exposure of `c.shards.list` may cause data races. |
| 425 | // So keep internal or implement deep copy if exposed. |
no test coverage detected