redis-lock 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/redis-lock.rb +1 -1
- data/lib/redis-lock/version.rb +2 -2
- data/lib/redis/lock.rb +10 -19
- data/redis-lock.gemspec +1 -0
- data/spec/redis_spec.rb +8 -8
- metadata +14 -19
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 1a7d5931088efd38747ab5b9c34d9ad2fd67fcdc
|
|
4
|
+
data.tar.gz: eccb2bdfa1a0b705b4927ba88857a3965e479307
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: a48d69c32bd5eb05d13bbb6b12239c26dbf81d679760e811e770078450232e22a9385e699f61ddb850554a085aaade1eca2fb9a52875af4c44e9f43f5f1e569b
|
|
7
|
+
data.tar.gz: c1b857647f101f6be722eeebaf474dc9cf7d984f49760e7b9edd4afc819475ec8d185602aaba128aac6c1b1b1f11bc99e4c3633096b165be611a318d8698ac5d
|
data/lib/redis-lock.rb
CHANGED
data/lib/redis-lock/version.rb
CHANGED
data/lib/redis/lock.rb
CHANGED
|
@@ -34,7 +34,7 @@ class Redis
|
|
|
34
34
|
current_lock_key = lock_key(key)
|
|
35
35
|
expiration_value = lock_expiration(timeout)
|
|
36
36
|
attempt_counter = 0
|
|
37
|
-
|
|
37
|
+
while attempt_counter < max_attempts
|
|
38
38
|
if self.setnx(current_lock_key, expiration_value)
|
|
39
39
|
return true
|
|
40
40
|
else
|
|
@@ -44,24 +44,15 @@ class Redis
|
|
|
44
44
|
return true if compare_value == current_lock
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if e.message == "Unable to acquire lock for #{key}."
|
|
51
|
-
attempt_counter += 1
|
|
52
|
-
if attempt_counter == max_attempts
|
|
53
|
-
raise
|
|
54
|
-
else
|
|
55
|
-
sleep 1
|
|
56
|
-
retry
|
|
57
|
-
end
|
|
58
|
-
else
|
|
59
|
-
raise
|
|
60
|
-
end
|
|
47
|
+
|
|
48
|
+
attempt_counter += 1
|
|
49
|
+
sleep 1 if attempt_counter < max_attempts
|
|
61
50
|
end
|
|
51
|
+
|
|
52
|
+
raise RedisLockException.new("Unable to acquire lock for #{key}.")
|
|
62
53
|
end
|
|
63
54
|
|
|
64
|
-
# Unlock a previously locked key if it has not expired and the current process was the one that locked it.
|
|
55
|
+
# Unlock a previously locked key if it has not expired and the current process/thread was the one that locked it.
|
|
65
56
|
#
|
|
66
57
|
# Example:
|
|
67
58
|
#
|
|
@@ -71,8 +62,8 @@ class Redis
|
|
|
71
62
|
current_lock_key = lock_key(key)
|
|
72
63
|
lock_value = self.get(current_lock_key)
|
|
73
64
|
return true unless lock_value
|
|
74
|
-
lock_timeout,
|
|
75
|
-
if (lock_timeout.to_i > Time.now.to_i) && (
|
|
65
|
+
lock_timeout, lock_process, lock_thread = lock_value.split('-')
|
|
66
|
+
if (lock_timeout.to_i > Time.now.to_i) && (lock_process.to_i == Process.pid) && lock_thread.to_i == Thread.current.object_id
|
|
76
67
|
self.del(current_lock_key)
|
|
77
68
|
return true
|
|
78
69
|
else
|
|
@@ -83,7 +74,7 @@ class Redis
|
|
|
83
74
|
private
|
|
84
75
|
|
|
85
76
|
def lock_expiration(timeout)
|
|
86
|
-
"#{Time.now.to_i + timeout + 1}-#{Process.pid}"
|
|
77
|
+
"#{Time.now.to_i + timeout + 1}-#{Process.pid}-#{Thread.current.object_id}"
|
|
87
78
|
end
|
|
88
79
|
|
|
89
80
|
def lock_key(key)
|
data/redis-lock.gemspec
CHANGED
|
@@ -11,6 +11,7 @@ Gem::Specification.new do |gem|
|
|
|
11
11
|
gem.description = %q{Pessimistic locking for ruby redis}
|
|
12
12
|
gem.summary = %q{Pessimistic locking for ruby redis}
|
|
13
13
|
gem.homepage = "https://github.com/PatrickTulskie/redis-lock"
|
|
14
|
+
gem.license = "MIT"
|
|
14
15
|
|
|
15
16
|
gem.files = `git ls-files`.split($/)
|
|
16
17
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/spec/redis_spec.rb
CHANGED
|
@@ -44,26 +44,26 @@ describe 'redis' do
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "should raise an exception if unable to acquire lock" do
|
|
47
|
-
@redis.lock('test_key',
|
|
48
|
-
lambda { @redis.lock('test_key',
|
|
47
|
+
@redis.lock('test_key', 1000)
|
|
48
|
+
lambda { @redis.lock('test_key', 1000, 1) }.should raise_exception("Unable to acquire lock for test_key.")
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
it "should execute a block during a lock_for_update transaction" do
|
|
52
|
-
@redis.lock_for_update('test_key',
|
|
52
|
+
@redis.lock_for_update('test_key', 1000) { @redis.set('test_key', 'awesome') }
|
|
53
53
|
@redis.get('test_key').should == 'awesome'
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "should unlock at the end of a lock_for_update" do
|
|
57
|
-
@redis.lock_for_update('test_key',
|
|
57
|
+
@redis.lock_for_update('test_key', 1000) { @redis.set('test_key', 'awesome') }
|
|
58
58
|
@redis.get('lock:test_key').should be_nil
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
it "should keep trying to lock a key" do
|
|
62
62
|
time = DateTime.now
|
|
63
|
-
@redis.lock('test_key',
|
|
64
|
-
lambda { @redis.lock('test_key',
|
|
65
|
-
# Should have spent
|
|
66
|
-
DateTime.now.should >= time + Rational(
|
|
63
|
+
@redis.lock('test_key', 1000)
|
|
64
|
+
lambda { @redis.lock('test_key', 1000, 2) }.should raise_exception("Unable to acquire lock for test_key.")
|
|
65
|
+
# Should have spent 1 second trying to lock
|
|
66
|
+
DateTime.now.should >= time + Rational(1, 86400)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
end
|
metadata
CHANGED
|
@@ -1,46 +1,41 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: redis-lock
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.2.0
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Patrick Tulskie
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2014-06-04 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: redis
|
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
16
|
requirements:
|
|
19
|
-
- -
|
|
17
|
+
- - ">="
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
21
19
|
version: '0'
|
|
22
20
|
type: :runtime
|
|
23
21
|
prerelease: false
|
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
23
|
requirements:
|
|
27
|
-
- -
|
|
24
|
+
- - ">="
|
|
28
25
|
- !ruby/object:Gem::Version
|
|
29
26
|
version: '0'
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
|
31
28
|
name: rspec
|
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
|
33
|
-
none: false
|
|
34
30
|
requirements:
|
|
35
|
-
- -
|
|
31
|
+
- - ">="
|
|
36
32
|
- !ruby/object:Gem::Version
|
|
37
33
|
version: '0'
|
|
38
34
|
type: :development
|
|
39
35
|
prerelease: false
|
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
-
none: false
|
|
42
37
|
requirements:
|
|
43
|
-
- -
|
|
38
|
+
- - ">="
|
|
44
39
|
- !ruby/object:Gem::Version
|
|
45
40
|
version: '0'
|
|
46
41
|
description: Pessimistic locking for ruby redis
|
|
@@ -50,7 +45,7 @@ executables: []
|
|
|
50
45
|
extensions: []
|
|
51
46
|
extra_rdoc_files: []
|
|
52
47
|
files:
|
|
53
|
-
- .gitignore
|
|
48
|
+
- ".gitignore"
|
|
54
49
|
- Gemfile
|
|
55
50
|
- Gemfile.lock
|
|
56
51
|
- LICENSE.txt
|
|
@@ -63,28 +58,28 @@ files:
|
|
|
63
58
|
- spec/redis_spec.rb
|
|
64
59
|
- spec/spec_helper.rb
|
|
65
60
|
homepage: https://github.com/PatrickTulskie/redis-lock
|
|
66
|
-
licenses:
|
|
61
|
+
licenses:
|
|
62
|
+
- MIT
|
|
63
|
+
metadata: {}
|
|
67
64
|
post_install_message:
|
|
68
65
|
rdoc_options: []
|
|
69
66
|
require_paths:
|
|
70
67
|
- lib
|
|
71
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
72
|
-
none: false
|
|
73
69
|
requirements:
|
|
74
|
-
- -
|
|
70
|
+
- - ">="
|
|
75
71
|
- !ruby/object:Gem::Version
|
|
76
72
|
version: '0'
|
|
77
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
|
-
none: false
|
|
79
74
|
requirements:
|
|
80
|
-
- -
|
|
75
|
+
- - ">="
|
|
81
76
|
- !ruby/object:Gem::Version
|
|
82
77
|
version: '0'
|
|
83
78
|
requirements: []
|
|
84
79
|
rubyforge_project:
|
|
85
|
-
rubygems_version:
|
|
80
|
+
rubygems_version: 2.2.2
|
|
86
81
|
signing_key:
|
|
87
|
-
specification_version:
|
|
82
|
+
specification_version: 4
|
|
88
83
|
summary: Pessimistic locking for ruby redis
|
|
89
84
|
test_files:
|
|
90
85
|
- spec/redis_spec.rb
|