| 1497 | } |
| 1498 | |
| 1499 | func (c *ClusterClient) loadState(ctx context.Context) (*clusterState, error) { |
| 1500 | if c.opt.ClusterSlots != nil { |
| 1501 | slots, err := c.opt.ClusterSlots(ctx) |
| 1502 | if err != nil { |
| 1503 | return nil, err |
| 1504 | } |
| 1505 | return newClusterState(c.nodes, slots, "") |
| 1506 | } |
| 1507 | |
| 1508 | addrs, err := c.nodes.Addrs() |
| 1509 | if err != nil { |
| 1510 | return nil, err |
| 1511 | } |
| 1512 | |
| 1513 | var firstErr error |
| 1514 | |
| 1515 | for _, idx := range rand.Perm(len(addrs)) { |
| 1516 | addr := addrs[idx] |
| 1517 | |
| 1518 | node, err := c.nodes.GetOrCreate(addr) |
| 1519 | if err != nil { |
| 1520 | if firstErr == nil { |
| 1521 | firstErr = err |
| 1522 | } |
| 1523 | continue |
| 1524 | } |
| 1525 | |
| 1526 | slots, err := node.Client.ClusterSlots(ctx).Result() |
| 1527 | if err != nil { |
| 1528 | if firstErr == nil { |
| 1529 | firstErr = err |
| 1530 | } |
| 1531 | continue |
| 1532 | } |
| 1533 | |
| 1534 | return newClusterState(c.nodes, slots, addr) |
| 1535 | } |
| 1536 | |
| 1537 | /* |
| 1538 | * No node is connectable. It's possible that all nodes' IP has changed. |
| 1539 | * Clear activeAddrs to let client be able to re-connect using the initial |
| 1540 | * setting of the addresses (e.g. [redis-cluster-0:6379, redis-cluster-1:6379]), |
| 1541 | * which might have chance to resolve domain name and get updated IP address. |
| 1542 | */ |
| 1543 | c.nodes.mu.Lock() |
| 1544 | c.nodes.activeAddrs = nil |
| 1545 | c.nodes.mu.Unlock() |
| 1546 | |
| 1547 | return nil, firstErr |
| 1548 | } |
| 1549 | |
| 1550 | func (c *ClusterClient) Pipeline() Pipeliner { |
| 1551 | pipe := Pipeline{ |