Cluster: allows abbreviated node IDs with rebalance --weight option.

This commit is contained in:
antirez 2015-12-15 16:08:00 +01:00
parent 9df1ae8808
commit 8f8c3992ac

View File

@ -316,6 +316,7 @@ class RedisTrib
xputs msg xputs msg
end end
# Return the node with the specified ID or Nil.
def get_node_by_name(name) def get_node_by_name(name)
@nodes.each{|n| @nodes.each{|n|
return n if n.info[:name] == name.downcase return n if n.info[:name] == name.downcase
@ -323,6 +324,21 @@ class RedisTrib
return nil return nil
end end
# Like get_node_by_name but the specified name can be just the first
# part of the node ID as long as the prefix in unique across the
# cluster.
def get_node_by_abbreviated_name(name)
l = name.length
candidates = []
@nodes.each{|n|
if n.info[:name][0...l] == name.downcase
candidates << n
end
}
return nil if candidates.length != 1
candidates[0]
end
# This function returns the master that has the least number of replicas # This function returns the master that has the least number of replicas
# in the cluster. If there are multiple masters with the same smaller # in the cluster. If there are multiple masters with the same smaller
# number of replicas, one at random is returned. # number of replicas, one at random is returned.
@ -347,7 +363,7 @@ class RedisTrib
keys = 0 keys = 0
@nodes.each{|n| @nodes.each{|n|
if n.has_flag?("master") if n.has_flag?("master")
puts "#{n} -> #{n.r.dbsize} keys | #{n.slots.length} slots | "+ puts "#{n} (#{n.info[:name][0...8]}...) -> #{n.r.dbsize} keys | #{n.slots.length} slots | "+
"#{n.info[:replicas].length} slaves." "#{n.info[:replicas].length} slaves."
masters += 1 masters += 1
keys += n.r.dbsize keys += n.r.dbsize
@ -900,12 +916,12 @@ class RedisTrib
weights = {} weights = {}
opt['weight'].each{|w| opt['weight'].each{|w|
fields = w.split("=") fields = w.split("=")
node = get_node_by_name(fields[0]) node = get_node_by_abbreviated_name(fields[0])
if !node || !node.has_flag?("master") if !node || !node.has_flag?("master")
puts "*** No such master node #{fields[0]}" puts "*** No such master node #{fields[0]}"
exit 1 exit 1
end end
weights[fields[0]] = fields[1].to_f weights[node.info[:name]] = fields[1].to_f
} if opt['weight'] } if opt['weight']
useempty = opt['use-empty-masters'] useempty = opt['use-empty-masters']