redis-mutex 2.1.0 → 2.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 93509c7e322a8d7f8b8aab44e8b679b4943aaf21
4
+ data.tar.gz: 10570c618421703581ee0ea2cb74d6fca9b33b91
5
+ SHA512:
6
+ metadata.gz: 75ceb7ece788185aa6c8a0a32f6b36ad2a524775bb2e2e44f4751c61400fcc742d0f326e37f72857ebefd709e7e007da384522093f04e65eabe6d2dd3ca1ab5f
7
+ data.tar.gz: 50541e94bd60a2af29a2b835b6a909ec160b62590f104db0f61454e16e026d0e7dd678cb9b3ee7c8fe3cc5683f6eb05e3394f96030774ee1006ca0cc75ce4751
data/lib/redis/mutex.rb CHANGED
@@ -45,12 +45,16 @@ class Redis
45
45
  def try_lock
46
46
  now = Time.now.to_f
47
47
  @expires_at = now + @expire # Extend in each blocking loop
48
- return true if setnx(@expires_at) # Success, the lock has been acquired
49
- return false if get.to_f > now # Check if the lock is still effective
48
+
49
+ loop do
50
+ return true if setnx(@expires_at) # Success, the lock has been acquired
51
+ end until old_value = get # Repeat if unlocked before get
52
+
53
+ return false if old_value.to_f > now # Check if the lock is still effective
50
54
 
51
55
  # The lock has expired but wasn't released... BAD!
52
- return true if getset(@expires_at).to_f <= now # Success, we acquired the previously expired lock
53
- return false # Dammit, it seems that someone else was even faster than us to remove the expired lock!
56
+ return true if getset(@expires_at).to_f <= now # Success, we acquired the previously expired lock
57
+ return false # Dammit, it seems that someone else was even faster than us to remove the expired lock!
54
58
  end
55
59
 
56
60
  # Returns true if resource is locked. Note that nil.to_f returns 0.0
data/redis-mutex.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "redis-mutex"
14
14
  gem.require_paths = ["lib"]
15
- gem.version = '2.1.0' # retrieve this value by: Gem.loaded_specs['redis-mutex'].version.to_s
15
+ gem.version = '2.1.1' # retrieve this value by: Gem.loaded_specs['redis-mutex'].version.to_s
16
16
 
17
17
  gem.add_runtime_dependency "redis-classy", "~> 1.2"
18
18
  gem.add_development_dependency "rspec"
@@ -171,4 +171,46 @@ describe Redis::Mutex do
171
171
  t2.join
172
172
  end
173
173
  end
174
+
175
+ describe 'stress test' do
176
+ LOOP_NUM = 1000
177
+
178
+ def run(id)
179
+ print "invoked worker #{id}...\n"
180
+ Redis::Classy.db.client.reconnect
181
+ mutex = Redis::Mutex.new(:test_lock, :expire => 1, :block => 10, :sleep => 0.01)
182
+ result = 0
183
+ LOOP_NUM.times do |i|
184
+ mutex.with_lock do
185
+ result += 1
186
+ sleep rand/100
187
+ end
188
+ end
189
+ print "result for worker #{id}: #{result} successful locks\n"
190
+ exit!(result == LOOP_NUM)
191
+ end
192
+
193
+ it 'runs without hiccups' do
194
+ begin
195
+ STDOUT.sync = true
196
+ puts "\nrunning stress tests..."
197
+ if pid1 = fork
198
+ # Parent
199
+ if pid2 = fork
200
+ # Parent
201
+ Process.waitall
202
+ else
203
+ # Child 2
204
+ run(2)
205
+ end
206
+ else
207
+ # Child 1
208
+ run(1)
209
+ end
210
+ STDOUT.flush
211
+ rescue NotImplementedError
212
+ puts $!
213
+ end
214
+ end
215
+ end
174
216
  end
metadata CHANGED
@@ -1,80 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-mutex
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 2.1.0
4
+ version: 2.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kenn Ejima
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-11 00:00:00.000000000 Z
11
+ date: 2013-06-20 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- version_requirements: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.2'
20
- none: false
21
- prerelease: false
22
14
  name: redis-classy
23
15
  requirement: !ruby/object:Gem::Requirement
24
16
  requirements:
25
17
  - - ~>
26
18
  - !ruby/object:Gem::Version
27
19
  version: '1.2'
28
- none: false
29
20
  type: :runtime
30
- - !ruby/object:Gem::Dependency
21
+ prerelease: false
31
22
  version_requirements: !ruby/object:Gem::Requirement
32
23
  requirements:
33
- - - ! '>='
24
+ - - ~>
34
25
  - !ruby/object:Gem::Version
35
- version: '0'
36
- none: false
37
- prerelease: false
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
38
28
  name: rspec
39
29
  requirement: !ruby/object:Gem::Requirement
40
30
  requirements:
41
- - - ! '>='
31
+ - - '>='
42
32
  - !ruby/object:Gem::Version
43
33
  version: '0'
44
- none: false
45
34
  type: :development
46
- - !ruby/object:Gem::Dependency
35
+ prerelease: false
47
36
  version_requirements: !ruby/object:Gem::Requirement
48
37
  requirements:
49
- - - ! '>='
38
+ - - '>='
50
39
  - !ruby/object:Gem::Version
51
40
  version: '0'
52
- none: false
53
- prerelease: false
41
+ - !ruby/object:Gem::Dependency
54
42
  name: bundler
55
43
  requirement: !ruby/object:Gem::Requirement
56
44
  requirements:
57
- - - ! '>='
45
+ - - '>='
58
46
  - !ruby/object:Gem::Version
59
47
  version: '0'
60
- none: false
61
48
  type: :development
62
- - !ruby/object:Gem::Dependency
49
+ prerelease: false
63
50
  version_requirements: !ruby/object:Gem::Requirement
64
51
  requirements:
65
- - - ! '>='
52
+ - - '>='
66
53
  - !ruby/object:Gem::Version
67
54
  version: '0'
68
- none: false
69
- prerelease: false
55
+ - !ruby/object:Gem::Dependency
70
56
  name: rake
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - ! '>='
59
+ - - '>='
74
60
  - !ruby/object:Gem::Version
75
61
  version: '0'
76
- none: false
77
62
  type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
78
69
  description: Distrubuted mutex using Redis
79
70
  email:
80
71
  - kenn.ejima@gmail.com
@@ -97,33 +88,26 @@ files:
97
88
  - spec/spec_helper.rb
98
89
  homepage: http://github.com/kenn/redis-mutex
99
90
  licenses: []
91
+ metadata: {}
100
92
  post_install_message:
101
93
  rdoc_options: []
102
94
  require_paths:
103
95
  - lib
104
96
  required_ruby_version: !ruby/object:Gem::Requirement
105
97
  requirements:
106
- - - ! '>='
98
+ - - '>='
107
99
  - !ruby/object:Gem::Version
108
100
  version: '0'
109
- segments:
110
- - 0
111
- hash: -4158529389064232866
112
- none: false
113
101
  required_rubygems_version: !ruby/object:Gem::Requirement
114
102
  requirements:
115
- - - ! '>='
103
+ - - '>='
116
104
  - !ruby/object:Gem::Version
117
105
  version: '0'
118
- segments:
119
- - 0
120
- hash: -4158529389064232866
121
- none: false
122
106
  requirements: []
123
107
  rubyforge_project:
124
- rubygems_version: 1.8.24
108
+ rubygems_version: 2.0.3
125
109
  signing_key:
126
- specification_version: 3
110
+ specification_version: 4
127
111
  summary: Distrubuted mutex using Redis
128
112
  test_files:
129
113
  - spec/redis_mutex_spec.rb