diff options
author | antirez <antirez@gmail.com> | 2015-12-15 16:08:00 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2015-12-15 16:08:00 +0100 |
commit | 8f8c3992ac86993d50a2694f746464b5833a62af (patch) | |
tree | 364b5aa70aed442d161d8f3d6b08b1a1fb9675cf /src/redis-trib.rb | |
parent | 9df1ae8808ae52506e348065c241c5367fd88c07 (diff) | |
download | redis-8f8c3992ac86993d50a2694f746464b5833a62af.tar.gz |
Cluster: allows abbreviated node IDs with rebalance --weight option.
Diffstat (limited to 'src/redis-trib.rb')
-rwxr-xr-x | src/redis-trib.rb | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/redis-trib.rb b/src/redis-trib.rb index 4449973c6..285b955e2 100755 --- a/src/redis-trib.rb +++ b/src/redis-trib.rb @@ -316,6 +316,7 @@ class RedisTrib xputs msg end + # Return the node with the specified ID or Nil. def get_node_by_name(name) @nodes.each{|n| return n if n.info[:name] == name.downcase @@ -323,6 +324,21 @@ class RedisTrib return nil 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 # in the cluster. If there are multiple masters with the same smaller # number of replicas, one at random is returned. @@ -347,7 +363,7 @@ class RedisTrib keys = 0 @nodes.each{|n| 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." masters += 1 keys += n.r.dbsize @@ -900,12 +916,12 @@ class RedisTrib weights = {} opt['weight'].each{|w| fields = w.split("=") - node = get_node_by_name(fields[0]) + node = get_node_by_abbreviated_name(fields[0]) if !node || !node.has_flag?("master") puts "*** No such master node #{fields[0]}" exit 1 end - weights[fields[0]] = fields[1].to_f + weights[node.info[:name]] = fields[1].to_f } if opt['weight'] useempty = opt['use-empty-masters'] |