| 756 | } |
| 757 | |
| 758 | func (c *Ring) cmdsInfo(ctx context.Context) (map[string]*CommandInfo, error) { |
| 759 | // note: `c.List()` return a shadow copy of `[]*ringShard`. |
| 760 | shards := c.sharding.List() |
| 761 | var firstErr error |
| 762 | for _, shard := range shards { |
| 763 | cmdsInfo, err := shard.Client.Command(ctx).Result() |
| 764 | if err == nil { |
| 765 | return cmdsInfo, nil |
| 766 | } |
| 767 | if firstErr == nil { |
| 768 | firstErr = err |
| 769 | } |
| 770 | } |
| 771 | if firstErr == nil { |
| 772 | return nil, errRingShardsDown |
| 773 | } |
| 774 | return nil, firstErr |
| 775 | } |
| 776 | |
| 777 | func (c *Ring) cmdShard(cmd Cmder) (*ringShard, error) { |
| 778 | // TODO: populate cmdsInfoCache lazily (via cmdsInfoCache.Get) so that |