module Redis::Cluster::SlotLoader
def fetch_slot_info(node)
def fetch_slot_info(node) hash_with_default_arr = Hash.new { |h, k| h[k] = [] } node.call(%i[cluster slots]) .flat_map { |arr| parse_slot_info(arr, default_ip: node.host) } .each_with_object(hash_with_default_arr) { |arr, h| h[arr[0]] << arr[1] } end
def load(nodes)
def load(nodes) errors = nodes.map do |node| begin return fetch_slot_info(node) rescue CannotConnectError, ConnectionError, CommandError => error error end end raise InitialSetupError, errors end
def parse_slot_info(arr, default_ip:)
def parse_slot_info(arr, default_ip:) first_slot, last_slot = arr[0..1] slot_range = (first_slot..last_slot).freeze arr[2..-1].map { |addr| [stringify_node_key(addr, default_ip), slot_range] } end
def stringify_node_key(arr, default_ip)
def stringify_node_key(arr, default_ip) ip, port = arr ip = default_ip if ip.empty? # When cluster is down NodeKey.build_from_host_port(ip, port) end