redis-lock 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|