module Redis::Cluster::SlotLoader

Load and hashify slot info for Redis Cluster Client

Public Instance Methods

fetch_slot_info(node) click to toggle source
# File lib/redis/cluster/slot_loader.rb, line 24
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
load(nodes) click to toggle source
# File lib/redis/cluster/slot_loader.rb, line 12
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
parse_slot_info(arr, default_ip:) click to toggle source
# File lib/redis/cluster/slot_loader.rb, line 31
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
stringify_node_key(arr, default_ip) click to toggle source
# File lib/redis/cluster/slot_loader.rb, line 37
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