redlock 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 679d1c44fcda7a2eaa70bdfe38c30e4ee79e417bef0b3ce064aceaf0a9cc0bbb
4
- data.tar.gz: 48b6a41c4cc27b8ff8878647dd494a6b87e3b17e540b75d8699e32d4ee982aa5
3
+ metadata.gz: 13a2ef1c0096e1135a1996719fbeb679234b639e0debecba4fa6d72f3fcd174a
4
+ data.tar.gz: e8e247b8be0ded9272f04addfbcbc6b99c1c6ad4429f344c74d61101af7e1682
5
5
  SHA512:
6
- metadata.gz: a31815a7da2fa6f5c3af35734294cdb34fdfba19dc12eaf25abe950db65be1356afc397ff29a73823d267d99d0069f86651385c1e262da6ced7541345212abda
7
- data.tar.gz: cd4e41fe60732180b4b5f3d848715954074f8a063c1513c89e73a37311d5d4c0d8fbe1bbd92b063955324929f07bf59232040de104bfeb14d18837d297910d59
6
+ metadata.gz: 81bf9233769810cc1a3f08a6927dc5ffddfa5c31ed158071daf1ad2ffc8303060094dbd78aa4af4185148b49878e36fcf54483a41378277e3bb306dd45c483e6
7
+ data.tar.gz: b0f198c408d7281c8d1d45ef57ce612a964571bf728969601ecfd448f6e482c83567cef66d94fab6bcf722909bd19ef3120ad2ae56171dc83fae815ad81111a9
@@ -168,13 +168,17 @@ module Redlock
168
168
 
169
169
  def lock(resource, val, ttl, allow_new_lock)
170
170
  recover_from_script_flush do
171
- @redis.call('EVALSHA', Scripts::LOCK_SCRIPT_SHA, 1, resource, val, ttl, allow_new_lock)
171
+ @redis.with { |conn|
172
+ conn.call('EVALSHA', Scripts::LOCK_SCRIPT_SHA, 1, resource, val, ttl, allow_new_lock)
173
+ }
172
174
  end
173
175
  end
174
176
 
175
177
  def unlock(resource, val)
176
178
  recover_from_script_flush do
177
- @redis.call('EVALSHA', Scripts::UNLOCK_SCRIPT_SHA, 1, resource, val)
179
+ @redis.with { |conn|
180
+ conn.call('EVALSHA', Scripts::UNLOCK_SCRIPT_SHA, 1, resource, val)
181
+ }
178
182
  end
179
183
  rescue
180
184
  # Nothing to do, unlocking is just a best-effort attempt.
@@ -182,7 +186,9 @@ module Redlock
182
186
 
183
187
  def get_remaining_ttl(resource)
184
188
  recover_from_script_flush do
185
- @redis.call('EVALSHA', Scripts::PTTL_SCRIPT_SHA, 1, resource)
189
+ @redis.with { |conn|
190
+ conn.call('EVALSHA', Scripts::PTTL_SCRIPT_SHA, 1, resource)
191
+ }
186
192
  end
187
193
  rescue RedisClient::ConnectionError
188
194
  nil
@@ -1,3 +1,3 @@
1
1
  module Redlock
2
- VERSION = '2.0.0'
2
+ VERSION = '2.0.1'
3
3
  end
data/spec/client_spec.rb CHANGED
@@ -5,7 +5,21 @@ require 'connection_pool'
5
5
  RSpec.describe Redlock::Client do
6
6
  # It is recommended to have at least 3 servers in production
7
7
  let(:lock_manager_opts) { { retry_count: 3 } }
8
- let(:lock_manager) { Redlock::Client.new(Redlock::Client::DEFAULT_REDIS_URLS, lock_manager_opts) }
8
+ let(:redis_urls_or_clients) {
9
+ urls = Redlock::Client::DEFAULT_REDIS_URLS
10
+ if rand(0..1).zero?
11
+ RSpec.configuration.reporter.message "variant: client urls"
12
+ urls
13
+ else
14
+ RSpec.configuration.reporter.message "variant: client objects"
15
+ urls.map {|url|
16
+ ConnectionPool.new { RedisClient.new(url: url) }
17
+ }
18
+ end
19
+ }
20
+ let(:lock_manager) {
21
+ Redlock::Client.new(redis_urls_or_clients, lock_manager_opts)
22
+ }
9
23
  let(:redis_client) { RedisClient.new(url: "redis://#{redis1_host}:#{redis1_port}") }
10
24
  let(:resource_key) { SecureRandom.hex(3) }
11
25
  let(:ttl) { 1000 }
@@ -37,9 +51,10 @@ RSpec.describe Redlock::Client do
37
51
 
38
52
  it 'accepts ConnectionPool objects' do
39
53
  pool = ConnectionPool.new { RedisClient.new(url: "redis://#{redis1_host}:#{redis1_port}") }
40
- redlock = Redlock::Client.new([pool])
54
+ _redlock = Redlock::Client.new([pool])
41
55
 
42
56
  lock_info = lock_manager.lock(resource_key, ttl)
57
+ expect(lock_info).to be_a(Hash)
43
58
  expect(resource_key).to_not be_lockable(lock_manager, ttl)
44
59
  lock_manager.unlock(lock_info)
45
60
  end
@@ -48,7 +63,7 @@ RSpec.describe Redlock::Client do
48
63
  redis_client.call('SCRIPT', 'FLUSH')
49
64
 
50
65
  pool = ConnectionPool.new { RedisClient.new(url: "redis://#{redis1_host}:#{redis1_port}") }
51
- redlock = Redlock::Client.new([pool])
66
+ _redlock = Redlock::Client.new([pool])
52
67
 
53
68
  raw_info = redis_client.call('INFO')
54
69
  number_of_cached_scripts = raw_info[/number_of_cached_scripts\:\d+/].split(':').last
@@ -197,7 +212,7 @@ RSpec.describe Redlock::Client do
197
212
  2000
198
213
  end
199
214
 
200
- lock_manager = Redlock::Client.new(Redlock::Client::DEFAULT_REDIS_URLS, retry_count: 1, retry_delay: retry_delay)
215
+ lock_manager = Redlock::Client.new(redis_urls_or_clients, retry_count: 1, retry_delay: retry_delay)
201
216
  another_lock_info = lock_manager.lock(resource_key, ttl)
202
217
 
203
218
  expect(lock_manager).to receive(:sleep) do |sleep|
@@ -272,7 +287,9 @@ RSpec.describe Redlock::Client do
272
287
  context 'when script cache has been flushed' do
273
288
  before(:each) do
274
289
  @manipulated_instance = lock_manager.instance_variable_get(:@servers).first
275
- @manipulated_instance.instance_variable_get(:@redis).call('SCRIPT', 'FLUSH')
290
+ @manipulated_instance.instance_variable_get(:@redis).with { |conn|
291
+ conn.call('SCRIPT', 'FLUSH')
292
+ }
276
293
  end
277
294
 
278
295
  it 'does not raise a RedisClient::CommandError: NOSCRIPT error' do
@@ -475,7 +492,7 @@ RSpec.describe Redlock::Client do
475
492
 
476
493
  # Replace redis with unreachable instance
477
494
  redis_instance = lock_manager.instance_variable_get(:@servers).first
478
- old_redis = redis_instance.instance_variable_get(:@redis)
495
+ _old_redis = redis_instance.instance_variable_get(:@redis)
479
496
  redis_instance.instance_variable_set(:@redis, unreachable_redis)
480
497
 
481
498
  expect {
data/spec/testing_spec.rb CHANGED
@@ -11,7 +11,7 @@ RSpec.describe Redlock::Client do
11
11
  describe '(testing mode)' do
12
12
  describe 'try_lock_instances' do
13
13
  context 'when testing with bypass mode' do
14
- before { lock_manager.testing_mode = :bypass }
14
+ before { Redlock::Client.testing_mode = :bypass }
15
15
 
16
16
  it 'bypasses the redis servers' do
17
17
  expect(lock_manager).to_not receive(:try_lock_instances_without_testing)
@@ -22,7 +22,7 @@ RSpec.describe Redlock::Client do
22
22
  end
23
23
 
24
24
  context 'when testing with fail mode' do
25
- before { lock_manager.testing_mode = :fail }
25
+ before { Redlock::Client.testing_mode = :fail }
26
26
 
27
27
  it 'fails' do
28
28
  expect(lock_manager).to_not receive(:try_lock_instances_without_testing)
@@ -33,7 +33,7 @@ RSpec.describe Redlock::Client do
33
33
  end
34
34
 
35
35
  context 'when testing is disabled' do
36
- before { lock_manager.testing_mode = nil }
36
+ before { Redlock::Client.testing_mode = nil }
37
37
 
38
38
  it 'works as usual' do
39
39
  expect(lock_manager).to receive(:try_lock_instances_without_testing)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redlock
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leandro Moreira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-09 00:00:00.000000000 Z
11
+ date: 2023-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client
@@ -96,22 +96,22 @@ dependencies:
96
96
  name: rspec
97
97
  requirement: !ruby/object:Gem::Requirement
98
98
  requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: 3.0.0
102
99
  - - "~>"
103
100
  - !ruby/object:Gem::Version
104
101
  version: '3'
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 3.0.0
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ">="
110
- - !ruby/object:Gem::Version
111
- version: 3.0.0
112
109
  - - "~>"
113
110
  - !ruby/object:Gem::Version
114
111
  version: '3'
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: 3.0.0
115
115
  description: Distributed lock using Redis written in Ruby. Highly inspired by https://github.com/antirez/redlock-rb.
116
116
  email:
117
117
  - leandro.ribeiro.moreira@gmail.com
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  requirements: []
161
- rubygems_version: 3.0.3.1
161
+ rubygems_version: 3.2.3
162
162
  signing_key:
163
163
  specification_version: 4
164
164
  summary: Distributed lock using Redis written in Ruby.