redis_queued_locks 0.0.17 → 0.0.19

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb745a97296f4661f7a68d7719d7bdb894521348d6aa25b92b23b4fcffce56cd
4
- data.tar.gz: e12566b1c653ad97bf973887d4511482c628d8ec27fd265901d1d4bfba9c112b
3
+ metadata.gz: c77f863ddb9f33c75a636ea12281ce1f4df1215d50f43b113b5be5f79b679526
4
+ data.tar.gz: 9585690846e55b141e089d26ac160f6481297cfa6f43d21df1403411903221be
5
5
  SHA512:
6
- metadata.gz: c3e6f4c421c8e6fb9b3933c01ebcd23d5762f0bdb0581333e2d85ab478a8002d8bce360bfabaab29d819c92a4f148e6562d0fa426e5999b0fc2d1c9b59f3eaa7
7
- data.tar.gz: 42a5800757191ea80797c7462b765c5dd4187771ce73c6c9af70f6653dea5599710d8569b5a2fc1a0c30cb0b3483abfac557bd888a7f4bcbde4ac4a7de308021
6
+ metadata.gz: 9e132a1464d92aa59539d5489d5b7d777399de6c38f313cbad063b819e0e32503591532eb010f5c6b87da41096172e9dde8f5fa2fc84623ca2256b84cd3fa98d
7
+ data.tar.gz: ea8dc9808a5c16697e5606ce8394c987ceb8df4f561fbf06250bd7669188665f56825a582e9c82240a52b6376767eedda9afeed588f960498fb32070466c512c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.0.19] - 2024-03-12
4
+ ### Added
5
+ - An ability to set the invocation time period to the block of code invoked under
6
+ the obtained lock;
7
+
8
+ ## [0.0.18] - 2024-03-04
9
+ ### Changed
10
+ - Semantic results for methods returning `{ ok: true/false, result: Any }` hash objects.
11
+ Now these objects are represented as `RedisQueuedLocks::Data` objects inherited from `Hash`;
12
+
3
13
  ## [0.0.17] - 2024-02-29
4
14
  ### Added
5
15
  - `RedisQueuedLocks::Client#locks` - list of obtained locks;
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RedisQueuedLocks · [![Gem Version](https://badge.fury.io/rb/redis_queued_locks.svg)](https://badge.fury.io/rb/redis_queued_locks)
1
+ # RedisQueuedLocks
2
2
 
3
3
  Distributed locks with "lock acquisition queue" capabilities based on the Redis Database.
4
4
 
@@ -167,6 +167,7 @@ def lock(
167
167
  ttl: config[:default_lock_ttl],
168
168
  queue_ttl: config[:default_queue_ttl],
169
169
  timeout: config[:try_to_lock_timeout],
170
+ timed: false,
170
171
  retry_count: config[:retry_count],
171
172
  retry_delay: config[:retry_delay],
172
173
  retry_jitter: config[:retry_jitter],
@@ -185,6 +186,8 @@ def lock(
185
186
  - Lifetime of the acuier's lock request. In seconds.
186
187
  - `timeout` - `[Integer,NilClass]`
187
188
  - Time period whe should try to acquire the lock (in seconds). Nil means "without timeout".
189
+ - `timed` - `[Boolean]`
190
+ - Limit the invocation time period of the passed block of code by the lock's TTL.
188
191
  - `retry_count` - `[Integer,NilClass]`
189
192
  - How many times we should try to acquire a lock. Nil means "infinite retries".
190
193
  - `retry_delay` - `[Integer]`
@@ -244,6 +247,7 @@ Return value:
244
247
  #### #lock! - exceptional lock obtaining
245
248
 
246
249
  - fails when (and with):
250
+ - (`RedisQueuedLocks::LockAlreadyObtainedError`) when `fail_fast` is `true` and lock is already obtained;
247
251
  - (`RedisQueuedLocks::LockAcquiermentTimeoutError`) `timeout` limit reached before lock is obtained;
248
252
  - (`RedisQueuedLocks::LockAcquiermentRetryLimitError`) `retry_count` limit reached before lock is obtained;
249
253
 
@@ -8,7 +8,7 @@ module RedisQueuedLocks::Acquier::Release
8
8
  # @param redis [RedisClient]
9
9
  # @param lock_key [String]
10
10
  # @param lock_key_queue [String]
11
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
11
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
12
12
  #
13
13
  # @api private
14
14
  # @since 0.1.0
@@ -18,14 +18,14 @@ module RedisQueuedLocks::Acquier::Release
18
18
  transact.call('EXPIRE', lock_key, '0')
19
19
  end
20
20
 
21
- { ok: true, result: }
21
+ RedisQueuedLocks::Data[ok: true, result:]
22
22
  end
23
23
 
24
24
  # Release all locks: clear all lock queus and expire all locks.
25
25
  #
26
26
  # @param redis [RedisClient]
27
27
  # @param batch_size [Integer]
28
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
28
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
29
29
  #
30
30
  # @api private
31
31
  # @since 0.1.0
@@ -55,6 +55,6 @@ module RedisQueuedLocks::Acquier::Release
55
55
 
56
56
  rel_keys = result.count { |red_res| red_res == 0 }
57
57
 
58
- { ok: true, result: { rel_keys: rel_keys } }
58
+ RedisQueuedLocks::Data[ok: true, result: { rel_keys: rel_keys }]
59
59
  end
60
60
  end
@@ -130,13 +130,13 @@ module RedisQueuedLocks::Acquier::Try
130
130
  case
131
131
  when fail_fast && inter_result == :fail_fast_no_try
132
132
  # Step 7.a: lock is still acquired and we should exit from the logic as soon as possible
133
- { ok: false, result: inter_result }
133
+ RedisQueuedLocks::Data[ok: false, result: inter_result]
134
134
  when inter_result == :lock_is_still_acquired || inter_result == :acquier_is_not_first_in_queue
135
135
  # Step 7.b: lock is still acquired by another process => failed to acquire
136
- { ok: false, result: inter_result }
136
+ RedisQueuedLocks::Data[ok: false, result: inter_result]
137
137
  when result == nil || (result.is_a?(::Array) && result.empty?)
138
138
  # Step 7.c: lock is already acquired durign the acquire race => failed to acquire
139
- { ok: false, result: :lock_is_acquired_during_acquire_race }
139
+ RedisQueuedLocks::Data[ok: false, result: :lock_is_acquired_during_acquire_race]
140
140
  when result.is_a?(::Array) && result.size == 3 # NOTE: 3 is a count of redis lock commands
141
141
  # TODO:
142
142
  # => (!) analyze the command result and do actions with the depending on it;
@@ -147,10 +147,13 @@ module RedisQueuedLocks::Acquier::Try
147
147
  # 3. pexpire should return 1 (expiration time is successfully applied)
148
148
 
149
149
  # Step 7.d: locked! :) let's go! => successfully acquired
150
- { ok: true, result: { lock_key: lock_key, acq_id: acquier_id, ts: timestamp, ttl: ttl } }
150
+ RedisQueuedLocks::Data[
151
+ ok: true,
152
+ result: { lock_key: lock_key, acq_id: acquier_id, ts: timestamp, ttl: ttl }
153
+ ]
151
154
  else
152
155
  # Ste 7.3: unknown behaviour :thinking:
153
- { ok: false, result: :unknown }
156
+ RedisQueuedLocks::Data[ok: false, result: :unknown]
154
157
  end
155
158
  # rubocop:enable Lint/DuplicateBranch
156
159
  end
@@ -170,6 +173,6 @@ module RedisQueuedLocks::Acquier::Try
170
173
  "Step ~ [СМЕРТЬ ПРОЦЕССА]: [#{acquier_id} :: #{lock_key_queue}] РЕЗУЛЬТАТ: #{result}"
171
174
  )
172
175
 
173
- { ok: true, result: result }
176
+ RedisQueuedLocks::Data[ok: true, result: result]
174
177
  end
175
178
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ module RedisQueuedLocks::Acquier::YieldExpire
6
+ # @param redis [RedisClient] Redis connection manager.
7
+ # @param lock_key [String] Lock key to be expired.
8
+ # @param timed [Boolean] Should the lock be wrapped by Tiemlout with with lock's ttl
9
+ # @param ttl_shift [Float] Lock's TTL shifting. Should affect block's ttl. In millisecodns.
10
+ # @param ttl [Integer,NilClass] Lock's time to live (in ms). Nil means "without timeout".
11
+ # @param block [Block] Custom logic that should be invoked unter the obtained lock.
12
+ # @return [Any,NilClass] nil is returned no block parametr is provided.
13
+ #
14
+ # @api private
15
+ # @since 0.1.0
16
+ def yield_with_expire(redis, lock_key, timed, ttl_shift, ttl, &block)
17
+ if block_given?
18
+ if timed && ttl != nil
19
+ timeout = ((ttl - ttl_shift) / 1000.0).yield_self { |time| (time < 0) ? 0.0 : time }
20
+ yield_with_timeout(timeout, lock_key, ttl, &block)
21
+ else
22
+ yield
23
+ end
24
+ end
25
+ ensure
26
+ redis.call('EXPIRE', lock_key, '0')
27
+ end
28
+
29
+ private
30
+
31
+ # @param timeout [Float]
32
+ # @parma lock_key [String]
33
+ # @param lock_ttl [Integer,NilClass]
34
+ # @param block [Blcok]
35
+ # @return [Any]
36
+ #
37
+ # @api private
38
+ # @since 0.1.0
39
+ def yield_with_timeout(timeout, lock_key, lock_ttl, &block)
40
+ ::Timeout.timeout(timeout, &block)
41
+ rescue ::Timeout::Error
42
+ raise(RedisQueuedLocks::TimedLockTimeoutError, <<~ERROR_MESSAGE)
43
+ Passed <timed> block of code exceeded the lock TTL (lock: "#{lock_key}", ttl: #{lock_ttl})
44
+ ERROR_MESSAGE
45
+ end
46
+ end
@@ -6,7 +6,7 @@
6
6
  module RedisQueuedLocks::Acquier
7
7
  require_relative 'acquier/try'
8
8
  require_relative 'acquier/delay'
9
- require_relative 'acquier/expire'
9
+ require_relative 'acquier/yield_expire'
10
10
  require_relative 'acquier/release'
11
11
 
12
12
  # @since 0.1.0
@@ -14,7 +14,7 @@ module RedisQueuedLocks::Acquier
14
14
  # @since 0.1.0
15
15
  extend Delay
16
16
  # @since 0.1.0
17
- extend Expire
17
+ extend YieldExpire
18
18
  # @since 0.1.0
19
19
  extend Release
20
20
 
@@ -44,6 +44,8 @@ module RedisQueuedLocks::Acquier
44
44
  # Lifetime of the acuier's lock request. In seconds.
45
45
  # @option timeout [Integer]
46
46
  # Time period whe should try to acquire the lock (in seconds).
47
+ # @option timed [Boolean]
48
+ # Limit the invocation time period of the passed block of code by the lock's TTL.
47
49
  # @option retry_count [Integer,NilClass]
48
50
  # How many times we should try to acquire a lock. Nil means "infinite retries".
49
51
  # @option retry_delay [Integer]
@@ -63,7 +65,7 @@ module RedisQueuedLocks::Acquier
63
65
  # already obtained.
64
66
  # @param [Block]
65
67
  # A block of code that should be executed after the successfully acquired lock.
66
- # @return [Hash<Symbol,Any>,yield]
68
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
67
69
  # - Format: { ok: true/false, result: Any }
68
70
  # - If block is given the result of block's yeld will be returned.
69
71
  #
@@ -80,6 +82,7 @@ module RedisQueuedLocks::Acquier
80
82
  ttl:,
81
83
  queue_ttl:,
82
84
  timeout:,
85
+ timed:,
83
86
  retry_count:,
84
87
  retry_delay:,
85
88
  retry_jitter:,
@@ -119,7 +122,7 @@ module RedisQueuedLocks::Acquier
119
122
  acq_dequeue = -> { dequeue_from_lock_queue(redis, lock_key_queue, acquier_id) }
120
123
 
121
124
  # Step 2: try to lock with timeout
122
- with_timeout(timeout, lock_key, raise_errors, on_timeout: acq_dequeue) do
125
+ with_acq_timeout(timeout, lock_key, raise_errors, on_timeout: acq_dequeue) do
123
126
  acq_start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
124
127
 
125
128
  # Step 2.1: caclically try to obtain the lock
@@ -140,6 +143,7 @@ module RedisQueuedLocks::Acquier
140
143
 
141
144
  # Step X: save the intermediate results to the result observer
142
145
  acq_process[:result] = result
146
+ acq_process[:acq_end_time] = acq_end_time
143
147
 
144
148
  # Step 2.1: analyze an acquirement attempt
145
149
  if ok
@@ -212,7 +216,9 @@ module RedisQueuedLocks::Acquier
212
216
  # Step 3.a: acquired successfully => run logic or return the result of acquirement
213
217
  if block_given?
214
218
  begin
215
- yield_with_expire(redis, lock_key, &block)
219
+ yield_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
220
+ ttl_shift = ((yield_time - acq_process[:acq_end_time]) * 1000).ceil(2)
221
+ yield_with_expire(redis, lock_key, timed, ttl_shift, ttl, &block)
216
222
  ensure
217
223
  acq_process[:rel_time] = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
218
224
  acq_process[:hold_time] = (
@@ -232,7 +238,7 @@ module RedisQueuedLocks::Acquier
232
238
  end
233
239
  end
234
240
  else
235
- { ok: true, result: acq_process[:lock_info] }
241
+ RedisQueuedLocks::Data[ok: true, result: acq_process[:lock_info]]
236
242
  end
237
243
  else
238
244
  if acq_process[:result] != :retry_limit_reached &&
@@ -245,7 +251,7 @@ module RedisQueuedLocks::Acquier
245
251
  acq_process[:result] = :timeout_reached
246
252
  end
247
253
  # Step 3.b: lock is not acquired (acquier is dequeued by timeout callback)
248
- { ok: false, result: acq_process[:result] }
254
+ RedisQueuedLocks::Data[ok: false, result: acq_process[:result]]
249
255
  end
250
256
  end
251
257
  # rubocop:enable Metrics/MethodLength, Metrics/BlockNesting
@@ -257,10 +263,14 @@ module RedisQueuedLocks::Acquier
257
263
  # It is safe because the lock obtain logic is transactional and
258
264
  # watches the original lock for changes.
259
265
  #
260
- # @param redis [RedisClient] Redis connection client.
261
- # @param lock_name [String] The lock name that should be released.
262
- # @param isntrumenter [#notify] See RedisQueuedLocks::Instrument::ActiveSupport for example.
263
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Hash<Symbil,Numeric|String> }
266
+ # @param redis [RedisClient]
267
+ # Redis connection client.
268
+ # @param lock_name [String]
269
+ # The lock name that should be released.
270
+ # @param isntrumenter [#notify]
271
+ # See RedisQueuedLocks::Instrument::ActiveSupport for example.
272
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
273
+ # Format: { ok: true/false, result: Hash<Symbil,Numeric|String> }
264
274
  #
265
275
  # @api private
266
276
  # @since 0.1.0
@@ -283,17 +293,24 @@ module RedisQueuedLocks::Acquier
283
293
  })
284
294
  end
285
295
 
286
- { ok: true, result: { rel_time: rel_time, rel_key: lock_key, rel_queue: lock_key_queue } }
296
+ RedisQueuedLocks::Data[
297
+ ok: true,
298
+ result: { rel_time: rel_time, rel_key: lock_key, rel_queue: lock_key_queue }
299
+ ]
287
300
  end
288
301
 
289
302
  # Release all locks:
290
303
  # - 1. clear all lock queus: drop them all from Redis database by the lock queue pattern;
291
304
  # - 2. delete all locks: drop lock keys from Redis by the lock key pattern;
292
305
  #
293
- # @param redis [RedisClient] Redis connection client.
294
- # @param batch_size [Integer] The number of lock keys that should be released in a time.
295
- # @param isntrumenter [#notify] See RedisQueuedLocks::Instrument::ActiveSupport for example.
296
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Hash<Symbol,Numeric> }
306
+ # @param redis [RedisClient]
307
+ # Redis connection client.
308
+ # @param batch_size [Integer]
309
+ # The number of lock keys that should be released in a time.
310
+ # @param isntrumenter [#notify]
311
+ # See RedisQueuedLocks::Instrument::ActiveSupport for example.
312
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
313
+ # Format: { ok: true/false, result: Hash<Symbol,Numeric> }
297
314
  #
298
315
  # @api private
299
316
  # @since 0.1.0
@@ -312,7 +329,10 @@ module RedisQueuedLocks::Acquier
312
329
  })
313
330
  end
314
331
 
315
- { ok: true, result: { rel_key_cnt: result[:rel_keys], rel_time: rel_time } }
332
+ RedisQueuedLocks::Data[
333
+ ok: true,
334
+ result: { rel_key_cnt: result[:rel_keys], rel_time: rel_time }
335
+ ]
316
336
  end
317
337
 
318
338
  # @param redis_client [RedisClient]
@@ -512,7 +532,7 @@ module RedisQueuedLocks::Acquier
512
532
  #
513
533
  # @api private
514
534
  # @since 0.1.0
515
- def with_timeout(timeout, lock_key, raise_errors, on_timeout: nil, &block)
535
+ def with_acq_timeout(timeout, lock_key, raise_errors, on_timeout: nil, &block)
516
536
  ::Timeout.timeout(timeout, &block)
517
537
  rescue ::Timeout::Error
518
538
  on_timeout.call unless on_timeout == nil
@@ -71,6 +71,8 @@ class RedisQueuedLocks::Client
71
71
  # Lifetime of the acuier's lock request. In seconds.
72
72
  # @option timeout [Integer,NilClass]
73
73
  # Time period whe should try to acquire the lock (in seconds). Nil means "without timeout".
74
+ # @option timed [Boolean]
75
+ # Limit the invocation time period of the passed block of code by the lock's TTL.
74
76
  # @option retry_count [Integer,NilClass]
75
77
  # How many times we should try to acquire a lock. Nil means "infinite retries".
76
78
  # @option retry_delay [Integer]
@@ -92,7 +94,7 @@ class RedisQueuedLocks::Client
92
94
  # by another process while the lock request queue was initially empty;
93
95
  # @param block [Block]
94
96
  # A block of code that should be executed after the successfully acquired lock.
95
- # @return [Hash<Symbol,Any>,yield]
97
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
96
98
  # - Format: { ok: true/false, result: Symbol/Hash }.
97
99
  # - If block is given the result of block's yeld will be returned.
98
100
  #
@@ -103,6 +105,7 @@ class RedisQueuedLocks::Client
103
105
  ttl: config[:default_lock_ttl],
104
106
  queue_ttl: config[:default_queue_ttl],
105
107
  timeout: config[:try_to_lock_timeout],
108
+ timed: false,
106
109
  retry_count: config[:retry_count],
107
110
  retry_delay: config[:retry_delay],
108
111
  retry_jitter: config[:retry_jitter],
@@ -121,6 +124,7 @@ class RedisQueuedLocks::Client
121
124
  ttl:,
122
125
  queue_ttl:,
123
126
  timeout:,
127
+ timed:,
124
128
  retry_count:,
125
129
  retry_delay:,
126
130
  retry_jitter:,
@@ -141,6 +145,7 @@ class RedisQueuedLocks::Client
141
145
  ttl: config[:default_lock_ttl],
142
146
  queue_ttl: config[:default_queue_ttl],
143
147
  timeout: config[:try_to_lock_timeout],
148
+ timed: false,
144
149
  retry_count: config[:retry_count],
145
150
  retry_delay: config[:retry_delay],
146
151
  retry_jitter: config[:retry_jitter],
@@ -153,6 +158,7 @@ class RedisQueuedLocks::Client
153
158
  ttl:,
154
159
  queue_ttl:,
155
160
  timeout:,
161
+ timed:,
156
162
  retry_count:,
157
163
  retry_delay:,
158
164
  retry_jitter:,
@@ -163,8 +169,10 @@ class RedisQueuedLocks::Client
163
169
  )
164
170
  end
165
171
 
166
- # @param lock_name [String] The lock name that should be released.
167
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Symbol/Hash }.
172
+ # @param lock_name [String]
173
+ # The lock name that should be released.
174
+ # @return [RedisQueuedLocks::Data, Hash<Symbol,Any>]
175
+ # Format: { ok: true/false, result: Symbol/Hash }.
168
176
  #
169
177
  # @api public
170
178
  # @since 0.1.0
@@ -219,7 +227,8 @@ class RedisQueuedLocks::Client
219
227
  end
220
228
 
221
229
  # @option batch_size [Integer]
222
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Symbol/Hash }.
230
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
231
+ # Format: { ok: true/false, result: Symbol/Hash }.
223
232
  #
224
233
  # @api public
225
234
  # @since 0.1.0
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ # NOTE: wiill be rewritten with Ruby's 3.2 "Data" class;
4
+ class RedisQueuedLocks::Data < Hash
5
+ end
@@ -20,4 +20,8 @@ module RedisQueuedLocks
20
20
  # @api public
21
21
  # @since 0.1.0
22
22
  LockAcquiermentRetryLimitError = Class.new(Error)
23
+
24
+ # @api pulic
25
+ # @since 0.1.0
26
+ TimedLockTimeoutError = Class.new(Error)
23
27
  end
@@ -5,6 +5,6 @@ module RedisQueuedLocks
5
5
  #
6
6
  # @api public
7
7
  # @since 0.0.1
8
- # @version 0.0.17
9
- VERSION = '0.0.17'
8
+ # @version 0.0.19
9
+ VERSION = '0.0.19'
10
10
  end
@@ -10,6 +10,7 @@ require 'securerandom'
10
10
  module RedisQueuedLocks
11
11
  require_relative 'redis_queued_locks/version'
12
12
  require_relative 'redis_queued_locks/errors'
13
+ require_relative 'redis_queued_locks/data'
13
14
  require_relative 'redis_queued_locks/debugger'
14
15
  require_relative 'redis_queued_locks/resource'
15
16
  require_relative 'redis_queued_locks/acquier'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_queued_locks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-29 00:00:00.000000000 Z
11
+ date: 2024-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client
@@ -57,10 +57,11 @@ files:
57
57
  - lib/redis_queued_locks.rb
58
58
  - lib/redis_queued_locks/acquier.rb
59
59
  - lib/redis_queued_locks/acquier/delay.rb
60
- - lib/redis_queued_locks/acquier/expire.rb
61
60
  - lib/redis_queued_locks/acquier/release.rb
62
61
  - lib/redis_queued_locks/acquier/try.rb
62
+ - lib/redis_queued_locks/acquier/yield_expire.rb
63
63
  - lib/redis_queued_locks/client.rb
64
+ - lib/redis_queued_locks/data.rb
64
65
  - lib/redis_queued_locks/debugger.rb
65
66
  - lib/redis_queued_locks/debugger/interface.rb
66
67
  - lib/redis_queued_locks/errors.rb
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @api private
4
- # @since 0.1.0
5
- module RedisQueuedLocks::Acquier::Expire
6
- # @param redis [RedisClient] Redis connection manager.
7
- # @param lock_key [String] Lock key to be expired.
8
- # @param block [Block] Custom logic that should be invoked unter the obtained lock.
9
- # @return [Any,NilClass] nil is returned no block parametr is provided.
10
- #
11
- # @api private
12
- # @since 0.1.0
13
- def yield_with_expire(redis, lock_key, &block)
14
- yield if block_given?
15
- ensure
16
- redis.call('EXPIRE', lock_key, '0')
17
- end
18
- end