Skip to content

Commit 9ed46cc

Browse files
committed
Use SET NX/EX for master locking instead of Lua script
1 parent d7bd3c5 commit 9ed46cc

File tree

3 files changed

+11
-22
lines changed

3 files changed

+11
-22
lines changed

lib/resque/scheduler/lock/resilient.rb

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module Scheduler
66
module Lock
77
class Resilient < Base
88
def acquire!
9-
evalsha(:acquire, [key], [value]).to_i == 1
9+
Resque.redis.set(key, value, nx: true, ex: timeout) == 'OK'
1010
end
1111

1212
def locked?
@@ -17,7 +17,6 @@ def timeout=(seconds)
1717
if locked?
1818
@timeout = seconds
1919
@locked_sha = nil
20-
@acquire_sha = nil
2120
end
2221
@timeout
2322
end
@@ -57,21 +56,6 @@ def locked_sha(refresh = false)
5756
return 0
5857
EOF
5958
end
60-
61-
def acquire_sha(refresh = false)
62-
@acquire_sha = nil if refresh
63-
64-
@acquire_sha ||=
65-
Resque.data_store.redis.script(:load, <<-EOF.gsub(/^ {14}/, ''))
66-
if redis.call('SETNX', KEYS[1], ARGV[1]) == 1
67-
then
68-
redis.call('EXPIRE', KEYS[1], #{timeout})
69-
return 1
70-
else
71-
return 0
72-
end
73-
EOF
74-
end
7559
end
7660
end
7761
end

lib/resque/scheduler/locking.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
# were missed when it starts up again.
5151

5252
require_relative 'lock'
53+
require 'rubygems/version'
5354

5455
module Resque
5556
module Scheduler
@@ -59,7 +60,11 @@ def master_lock
5960
end
6061

6162
def supports_lua?
62-
redis_master_version >= 2.5
63+
redis_master_version >= Gem::Version.new('2.5')
64+
end
65+
66+
def supports_resilient_lock?
67+
redis_master_version >= Gem::Version.new('2.6.2')
6368
end
6469

6570
def master?
@@ -83,7 +88,7 @@ def release_master_lock
8388
private
8489

8590
def build_master_lock
86-
if supports_lua?
91+
if supports_resilient_lock?
8792
Resque::Scheduler::Lock::Resilient.new(master_lock_key)
8893
else
8994
Resque::Scheduler::Lock::Basic.new(master_lock_key)
@@ -97,7 +102,7 @@ def master_lock_key
97102
end
98103

99104
def redis_master_version
100-
Resque.data_store.redis.info['redis_version'].to_f
105+
Gem::Version.new(Resque.data_store.redis.info['redis_version'])
101106
end
102107
end
103108
end

test/scheduler_locking_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,9 @@ def lock_is_not_held(lock)
204204
context 'Resque::Scheduler::Lock::Resilient' do
205205
include LockTestHelper
206206

207-
if !Resque::Scheduler.supports_lua?
207+
if !Resque::Scheduler.supports_resilient_lock?
208208
puts '*** Skipping Resque::Scheduler::Lock::Resilient ' \
209-
'tests, as they require Redis >= 2.5.'
209+
'tests, as they require Redis >= 2.6.2.'
210210
else
211211
setup do
212212
@lock = Resque::Scheduler::Lock::Resilient.new('test_resilient_lock')

0 commit comments

Comments
 (0)