]>
git.saurik.com Git - redis.git/blob - src/redis-trib.rb
6 ClusterHashSlots
= 4096
17 puts
"Invalid node name #{addr}"
32 xputs
"Connecting to node #{self}: "
34 @r = Redis
.new(:host => @ost, :port => @port)
38 puts
"Sorry, can't connect to node #{self}"
47 if !info
["cluster_enabled"] || info
["cluster_enabled"].to_i
== 0
48 puts
"Error: Node #{self} is not configured as a cluster node."
54 if !
(@r.cluster("info").split("\r\n").index("cluster_known_nodes:1")) ||
56 puts
"Error: Node #{self} is not empty. Either the node already knows other nodes (check with nodes-info) or contains some key in database 0."
77 @r.cluster("addslots",*new
)
82 # We want to display the hash slots assigned to this node
83 # as ranges, like in: "1-5,8,9,20-35,30"
85 # Note: this could be easily written without side effects,
86 # we use 'slots' just to split the computation into steps.
88 # First step: we want an increasing array of integers
89 # for instance: [1,2,3,4,5,8,9,20,21,22,23,24,25,30]
90 slots
= @slots.keys
.sort
92 # As we want to aggregate adiacent slots we convert all the
93 # slot integers into ranges (with just one element)
94 # So we have something like [1..1,2..2, ... and so forth.
97 # Finally we group ranges with adiacent elements.
98 slots
= slots
.reduce([]) {|a
,b
|
99 if !a
.empty
? && b
.first
== (a
[-1].last
)+
1
100 a
[0..-2] +
[(a
[-1].first
)..(b
.last
)]
106 # Now our task is easy, we just convert ranges with just one
107 # element into a number, and a real range into a start-end format.
108 # Finally we join the array using the comma as separator.
109 slots
= slots
.map
{|x
|
110 x
.count
== 1 ? x
.first
.to_s
: "#{x.first}-#{x.last}"
113 "#{self.to_s.ljust(25)} slots:#{slots}"
139 def check_arity(req_args
, num_args
)
140 if ((req_args
> 0 and num_args !
= req_args
) ||
141 (req_args
< 0 and num_args
< req_args
.abs
))
142 puts
"Wrong number of arguments for specified sub command"
152 puts
"Creating cluster"
154 node
= ClusterNode
.new(n
)
155 node
.connect(:abort => true)
160 puts
"Performing hash slots allocation on #{@nodes.length} nodes..."
163 yes_or_die
"Can I set the above configuration?"
165 puts
"** Nodes configuration updated"
166 puts
"** Sending CLUSTER MEET messages to join the cluster"
172 puts
"Performing Cluster Check (node #{ARGV[1]})"
173 node
= ClusterNode
.new(ARGV[1])
174 node
.connect(:abort => true)
176 node
.add_slots(10..15)
177 node
.add_slots(30..30)
184 slots_per_node
= ClusterHashSlots
/@nodes.length
187 first
= i
*slots_per_node
188 last
= first+slots_per_node-1
189 last
= ClusterHashSlots-1
if i
== @nodes.length-1
190 n
.add_slots first
..last
195 def flush_nodes_config
208 # We use a brute force approach to make sure the node will meet
209 # each other, that is, sending CLUSTER MEET messages to all the nodes
210 # about the very same node.
211 # Thanks to gossip this information should propagate across all the
212 # cluster in a matter of seconds.
215 if !first
then first
= n
.info
; next; end # Skip the first node
216 n
.r
.cluster("meet",first
[:host],first
[:port])
221 print
"#{msg} (type 'yes' to accept): "
223 if !
(STDIN.gets
.chomp
.downcase
== "yes")
231 "create" => ["create_cluster", -2, "host1:port host2:port ... hostN:port"],
232 "check" => ["check_cluster", 2, "host:port"]
237 puts
"Usage: redis-trib <command> <arguments ...>"
240 puts
" #{k.ljust(20)} #{v[2]}"
247 cmd_spec
= COMMANDS
[ARGV[0].downcase
]
249 puts
"Unknown redis-trib subcommand '#{ARGV[0]}'"
252 rt
.check_arity(cmd_spec
[1],ARGV.length
)