summaryrefslogtreecommitdiff
path: root/src/redis-trib.rb
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-12-15 16:08:00 +0100
committerantirez <antirez@gmail.com>2015-12-15 16:08:00 +0100
commit8f8c3992ac86993d50a2694f746464b5833a62af (patch)
tree364b5aa70aed442d161d8f3d6b08b1a1fb9675cf /src/redis-trib.rb
parent9df1ae8808ae52506e348065c241c5367fd88c07 (diff)
downloadredis-8f8c3992ac86993d50a2694f746464b5833a62af.tar.gz
Cluster: allows abbreviated node IDs with rebalance --weight option.
Diffstat (limited to 'src/redis-trib.rb')
-rwxr-xr-xsrc/redis-trib.rb22
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']