Skip to content

Commit 8b15ac3

Browse files
committed
Merge remote-tracking branch 'stipple/distributed'
2 parents b3cdd32 + 8996224 commit 8b15ac3

File tree

4 files changed

+154
-10
lines changed

4 files changed

+154
-10
lines changed

lib/resque/worker.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,19 @@ def self.working
3535

3636
names.map! { |name| "worker:#{name}" }
3737

38-
reportedly_working = redis.mapped_mget(*names).reject do |key, value|
39-
value.nil? || value.empty?
38+
reportedly_working = begin
39+
redis.mapped_mget(*names).reject do |key, value|
40+
value.nil? || value.empty?
41+
end
42+
rescue Redis::Distributed::CannotDistribute
43+
result = {}
44+
names.each do |name|
45+
value = redis.get name
46+
result[name] = value unless value.nil? || value.empty?
47+
end
48+
result
4049
end
50+
4151
reportedly_working.keys.map do |key|
4252
find key.sub("worker:", '')
4353
end.compact

test/redis-test-cluster.conf

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# Redis configuration file example
2+
3+
# By default Redis does not run as a daemon. Use 'yes' if you need it.
4+
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
5+
daemonize yes
6+
7+
# When run as a daemon, Redis write a pid file in /var/run/redis.pid by default.
8+
# You can specify a custom pid file location here.
9+
pidfile ./test/redis-test-cluster.pid
10+
11+
# Accept connections on the specified port, default is 6379
12+
port 9737
13+
14+
# If you want you can bind a single interface, if the bind option is not
15+
# specified all the interfaces will listen for connections.
16+
#
17+
# bind 127.0.0.1
18+
19+
# Close the connection after a client is idle for N seconds (0 to disable)
20+
timeout 300
21+
22+
# Save the DB on disk:
23+
#
24+
# save <seconds> <changes>
25+
#
26+
# Will save the DB if both the given number of seconds and the given
27+
# number of write operations against the DB occurred.
28+
#
29+
# In the example below the behaviour will be to save:
30+
# after 900 sec (15 min) if at least 1 key changed
31+
# after 300 sec (5 min) if at least 10 keys changed
32+
# after 60 sec if at least 10000 keys changed
33+
save 900 1
34+
save 300 10
35+
save 60 10000
36+
37+
# The filename where to dump the DB
38+
dbfilename dump-cluster.rdb
39+
40+
# For default save/load DB in/from the working directory
41+
# Note that you must specify a directory not a file name.
42+
dir ./test/
43+
44+
# Set server verbosity to 'debug'
45+
# it can be one of:
46+
# debug (a lot of information, useful for development/testing)
47+
# notice (moderately verbose, what you want in production probably)
48+
# warning (only very important / critical messages are logged)
49+
loglevel debug
50+
51+
# Specify the log file name. Also 'stdout' can be used to force
52+
# the demon to log on the standard output. Note that if you use standard
53+
# output for logging but daemonize, logs will be sent to /dev/null
54+
logfile stdout
55+
56+
# Set the number of databases. The default database is DB 0, you can select
57+
# a different one on a per-connection basis using SELECT <dbid> where
58+
# dbid is a number between 0 and 'databases'-1
59+
databases 16
60+
61+
################################# REPLICATION #################################
62+
63+
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
64+
# another Redis server. Note that the configuration is local to the slave
65+
# so for example it is possible to configure the slave to save the DB with a
66+
# different interval, or to listen to another port, and so on.
67+
68+
# slaveof <masterip> <masterport>
69+
70+
################################## SECURITY ###################################
71+
72+
# Require clients to issue AUTH <PASSWORD> before processing any other
73+
# commands. This might be useful in environments in which you do not trust
74+
# others with access to the host running redis-server.
75+
#
76+
# This should stay commented out for backward compatibility and because most
77+
# people do not need auth (e.g. they run their own servers).
78+
79+
# requirepass foobared
80+
81+
################################### LIMITS ####################################
82+
83+
# Set the max number of connected clients at the same time. By default there
84+
# is no limit, and it's up to the number of file descriptors the Redis process
85+
# is able to open. The special value '0' means no limts.
86+
# Once the limit is reached Redis will close all the new connections sending
87+
# an error 'max number of clients reached'.
88+
89+
# maxclients 128
90+
91+
# Don't use more memory than the specified amount of bytes.
92+
# When the memory limit is reached Redis will try to remove keys with an
93+
# EXPIRE set. It will try to start freeing keys that are going to expire
94+
# in little time and preserve keys with a longer time to live.
95+
# Redis will also try to remove objects from free lists if possible.
96+
#
97+
# If all this fails, Redis will start to reply with errors to commands
98+
# that will use more memory, like SET, LPUSH, and so on, and will continue
99+
# to reply to most read-only commands like GET.
100+
#
101+
# WARNING: maxmemory can be a good idea mainly if you want to use Redis as a
102+
# 'state' server or cache, not as a real DB. When Redis is used as a real
103+
# database the memory usage will grow over the weeks, it will be obvious if
104+
# it is going to use too much memory in the long run, and you'll have the time
105+
# to upgrade. With maxmemory after the limit is reached you'll start to get
106+
# errors for write operations, and this may even lead to DB inconsistency.
107+
108+
# maxmemory <bytes>
109+
110+
############################### ADVANCED CONFIG ###############################
111+
112+
# Glue small output buffers together in order to send small replies in a
113+
# single TCP packet. Uses a bit more CPU but most of the times it is a win
114+
# in terms of number of queries per second. Use 'yes' if unsure.
115+
glueoutputbuf yes

test/resque_test.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
Resque.push(:people, { 'name' => 'chris' })
88
Resque.push(:people, { 'name' => 'bob' })
99
Resque.push(:people, { 'name' => 'mark' })
10+
@original_redis = Resque.redis
11+
end
12+
13+
teardown do
14+
Resque.redis = @original_redis
1015
end
1116

1217
test "can set a namespace through a url-like string" do
@@ -201,7 +206,7 @@
201206
end
202207

203208
test "keeps track of resque keys" do
204-
assert_equal ["queue:people", "queues"], Resque.keys
209+
assert_equal ["queue:people", "queues"].sort, Resque.keys.sort
205210
end
206211

207212
test "badly wants a class name, too" do
@@ -238,7 +243,11 @@
238243
assert_equal 3, stats[:queues]
239244
assert_equal 3, stats[:processed]
240245
assert_equal 1, stats[:failed]
241-
assert_equal [Resque.redis.respond_to?(:server) ? 'localhost:9736' : 'redis://localhost:9736/0'], stats[:servers]
246+
if ENV.key? 'RESQUE_DISTRIBUTED'
247+
assert_equal [Resque.redis.respond_to?(:server) ? 'localhost:9736, localhost:9737' : 'redis://localhost:9736/0, redis://localhost:9737/0'], stats[:servers]
248+
else
249+
assert_equal [Resque.redis.respond_to?(:server) ? 'localhost:9736' : 'redis://localhost:9736/0'], stats[:servers]
250+
end
242251
end
243252

244253
test "decode bad json" do

test/test_helper.rb

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,26 @@
3939
exit_code = Test::Unit::AutoRunner.run
4040
end
4141

42-
pid = `ps -A -o pid,command | grep [r]edis-test`.split(" ")[0]
42+
processes = `ps -A -o pid,command | grep [r]edis-test`.split("\n")
43+
pids = processes.map { |process| process.split(" ")[0] }
4344
puts "Killing test redis server..."
44-
`rm -f #{dir}/dump.rdb`
45-
Process.kill("KILL", pid.to_i)
45+
`rm -f #{dir}/dump.rdb #{dir}/dump-cluster.rdb`
46+
pids.each { |pid| Process.kill("KILL", pid.to_i) }
4647
exit exit_code
4748
end
4849

49-
puts "Starting redis for testing at localhost:9736..."
50-
`redis-server #{dir}/redis-test.conf`
51-
Resque.redis = 'localhost:9736'
50+
if ENV.key? 'RESQUE_DISTRIBUTED'
51+
require 'redis/distributed'
52+
puts "Starting redis for testing at localhost:9736 and localhost:9737..."
53+
`redis-server #{dir}/redis-test.conf`
54+
`redis-server #{dir}/redis-test-cluster.conf`
55+
r = Redis::Distributed.new(['redis://localhost:9736', 'redis://localhost:9737'])
56+
Resque.redis = Redis::Namespace.new :resque, :redis => r
57+
else
58+
puts "Starting redis for testing at localhost:9736..."
59+
`redis-server #{dir}/redis-test.conf`
60+
Resque.redis = 'localhost:9736'
61+
end
5262

5363

5464
##

0 commit comments

Comments
 (0)