Commit a54d9805 authored by antirez's avatar antirez
Browse files

Merge branch 'unstable' of github.com:antirez/redis into unstable

parents 1087227d 4e17be0e
...@@ -9,19 +9,13 @@ WARNING: are you a possible Redis contributor? ...@@ -9,19 +9,13 @@ WARNING: are you a possible Redis contributor?
us, and *how* exactly this can be implemented to have good changes us, and *how* exactly this can be implemented to have good changes
of a merge. Otherwise it is probably wasted work! Thank you of a merge. Otherwise it is probably wasted work! Thank you
DISKSTORE TODO
==============
* Fix FLUSHALL/FLUSHDB: the queue of pending reads/writes should be handled. API CHANGES
* Check that 00/00 and ff/ff exist at startup, otherwise exit with error. ===========
* Implement sync flush option, where data is written synchronously on disk when a command is executed.
* Implement MULTI/EXEC as transaction abstract API to diskstore.c, with transaction_start, transaction_end, and a journal to recover.
* Stop BGSAVE thread on shutdown and any other condition where the child is killed during normal bgsave.
* Fix RANDOMKEY to really do something interesting
* Fix DBSIZE to really do something interesting
* Add a DEBUG command to check if an entry is or not in memory currently
* dscache.c near 236, kobj = createStringObject... we could use static obj. * Turn commands into variadic versions when it makes sense, that is, when
the variable number of arguments represent values, and there is no conflict
with the return value of the command.
APPEND ONLY FILE APPEND ONLY FILE
================ ================
...@@ -61,3 +55,15 @@ KNOWN BUGS ...@@ -61,3 +55,15 @@ KNOWN BUGS
or alike) too many time passes? We should prevent expires while the or alike) too many time passes? We should prevent expires while the
AOF is loading. AOF is loading.
DISKSTORE TODO
==============
* Fix FLUSHALL/FLUSHDB: the queue of pending reads/writes should be handled.
* Check that 00/00 and ff/ff exist at startup, otherwise exit with error.
* Implement sync flush option, where data is written synchronously on disk when a command is executed.
* Implement MULTI/EXEC as transaction abstract API to diskstore.c, with transaction_start, transaction_end, and a journal to recover.
* Stop BGSAVE thread on shutdown and any other condition where the child is killed during normal bgsave.
* Fix RANDOMKEY to really do something interesting
* Fix DBSIZE to really do something interesting
* Add a DEBUG command to check if an entry is or not in memory currently
* dscache.c near 236, kobj = createStringObject... we could use static obj.
...@@ -943,6 +943,7 @@ void clusterCron(void) { ...@@ -943,6 +943,7 @@ void clusterCron(void) {
node->flags &= ~REDIS_NODE_PFAIL; node->flags &= ~REDIS_NODE_PFAIL;
} else if (node->flags & REDIS_NODE_FAIL && !node->numslaves) { } else if (node->flags & REDIS_NODE_FAIL && !node->numslaves) {
node->flags &= ~REDIS_NODE_FAIL; node->flags &= ~REDIS_NODE_FAIL;
clusterUpdateState();
} }
} else { } else {
/* Timeout reached. Set the noad se possibly failing if it is /* Timeout reached. Set the noad se possibly failing if it is
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'rubygems' require 'rubygems'
require 'redis' require 'redis'
ClusterHashSlots = 4096
def xputs(s) def xputs(s)
printf s printf s
STDOUT.flush STDOUT.flush
...@@ -17,6 +19,8 @@ class ClusterNode ...@@ -17,6 +19,8 @@ class ClusterNode
end end
@host = s[0] @host = s[0]
@port = s[1] @port = s[1]
@slots = {}
@dirty = false
end end
def to_s def to_s
...@@ -51,12 +55,55 @@ class ClusterNode ...@@ -51,12 +55,55 @@ class ClusterNode
end end
end end
def add_slots(slots)
slots.each{|s|
@slots[s] = :new
}
@dirty = true
end
def flush_node_config
return if !@dirty
new = []
@slots.each{|s,val|
if val == :new
new << s
@slots[s] = true
end
}
@r.cluster("addslots",*new)
@dirty = false
end
def info
slots = @slots.map{|k,v| k}.reduce{|a,b|
a = [(a..a)] if !a.is_a?(Array)
if b == (a[-1].last)+1
a[-1] = (a[-1].first)..b
a
else
a << (b..b)
end
}.map{|x|
(x.first == x.last) ? x.first.to_s : "#{x.first}-#{x.last}"
}.join(",")
"#{self.to_s.ljust(25)} slots:#{slots}"
end
def is_dirty?
@dirty
end
def r def r
@r @r
end end
end end
class RedisTrib class RedisTrib
def initialize
@nodes = []
end
def check_arity(req_args, num_args) def check_arity(req_args, num_args)
if ((req_args > 0 and num_args != req_args) || if ((req_args > 0 and num_args != req_args) ||
(req_args < 0 and num_args < req_args.abs)) (req_args < 0 and num_args < req_args.abs))
...@@ -72,7 +119,52 @@ class RedisTrib ...@@ -72,7 +119,52 @@ class RedisTrib
node.connect node.connect
node.assert_cluster node.assert_cluster
node.assert_empty node.assert_empty
@nodes << node
} }
puts "Performing hash slots allocation on #{@nodes.length} nodes..."
alloc_slots
show_nodes
yes_or_die "Can I set the above configuration?"
flush_nodes_config
puts "** Nodes configuration updated"
puts "Sending CLUSTER MEET messages to join the cluster"
join_cluster
end
def alloc_slots
slots_per_node = ClusterHashSlots/@nodes.length
i = 0
@nodes.each{|n|
first = i*slots_per_node
last = first+slots_per_node-1
last = ClusterHashSlots-1 if i == @nodes.length-1
n.add_slots first..last
i += 1
}
end
def flush_nodes_config
@nodes.each{|n|
n.flush_node_config
}
end
def show_nodes
@nodes.each{|n|
puts n.info
}
end
def join_cluster
end
def yes_or_die(msg)
print "#{msg} (type 'yes' to accept): "
STDOUT.flush
if !(STDIN.gets.chomp.downcase == "yes")
puts "Aborting..."
exit 1
end
end end
end end
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment