| 660 | } |
| 661 | |
| 662 | func (c *clusterNodes) Addrs() ([]string, error) { |
| 663 | var addrs []string |
| 664 | |
| 665 | c.mu.RLock() |
| 666 | closed := c.closed //nolint:ifshort |
| 667 | if !closed { |
| 668 | if len(c.activeAddrs) > 0 { |
| 669 | addrs = make([]string, len(c.activeAddrs)) |
| 670 | copy(addrs, c.activeAddrs) |
| 671 | } else { |
| 672 | addrs = make([]string, len(c.addrs)) |
| 673 | copy(addrs, c.addrs) |
| 674 | } |
| 675 | } |
| 676 | c.mu.RUnlock() |
| 677 | |
| 678 | if closed { |
| 679 | return nil, pool.ErrClosed |
| 680 | } |
| 681 | if len(addrs) == 0 { |
| 682 | return nil, errClusterNoNodes |
| 683 | } |
| 684 | return addrs, nil |
| 685 | } |
| 686 | |
| 687 | func (c *clusterNodes) NextGeneration() uint32 { |
| 688 | return atomic.AddUint32(&c.generation, 1) |