redis_queued_locks 0.0.5 → 0.0.6

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: 1044ea4b8236b241132017ea9b9f2f8ac280c584be1158a9e7b52b15aa58d4ef
4
- data.tar.gz: 5e6dc2141b05055f3641d88c9c181521ed6ad94100f6007573628e6aef7cee17
3
+ metadata.gz: 9e98a72e1519c54d21a6273176a7d8a3bd9fa3033b7f30ca73fdca5a4335341d
4
+ data.tar.gz: b2cf62db6016bd456a379feb3703989cc4a481f2eed4103c5c27a60bec624d46
5
5
  SHA512:
6
- metadata.gz: 8d8c0ac83545d663f0d558dc258364348a100e34c9636bf9663d8c021154c38c660ee626019f08bc5607c4ce01fc731a49c1fae3f5dc6e28d3a5d2ea41292d02
7
- data.tar.gz: 1bbc2cfc740ff6eb3fa6e458dc5ed9dd4509885427eaf7e5eb8c2e74a605652dc9c39586d7282442befb1f199d0b84ff3ac573dfa43bfcc86bcb117f165e70ca
6
+ metadata.gz: d90c848b5fb00614c3f61719d470d7a2dae008d3b6349c395674fe7bf262feea09795dafc74756a16426f499652e9cb0dcb4eef8b0dc9e2c1cc8abff2a1345d1
7
+ data.tar.gz: ccc6e73175a2c41988303e3ea73feeacf95833b8d318dc1318c91f800d656ea157aeca62d7eba491ca489253a01ba4489f6a4c254c32f54ef3a540c9312ca179
data/CHANGELOG.md CHANGED
@@ -1,7 +1,14 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.0.6] - 2024-02-27
4
+ ### Changed
5
+ - Major documentation updates;
6
+ - `RedisQueuedLock#release_lock!` now returns detaield semantic result;
7
+ - `RediSQueuedLock#release_all_locks!` now returns detailed semantic result;
8
+
3
9
  ## [0.0.5] - 2024-02-26
4
- - Minor update with documentation and configuration updates inside.
10
+ ### Changed
11
+ - Minor gem update with documentation and configuration updates inside.
5
12
 
6
13
  ## [0.0.4] - 2024-02-26
7
14
  ### Changed
data/README.md CHANGED
@@ -127,7 +127,7 @@ end
127
127
 
128
128
  ---
129
129
 
130
- #### lock - obtain a lock
130
+ #### #lock - obtain a lock
131
131
 
132
132
  ```ruby
133
133
  def lock(
@@ -186,9 +186,8 @@ Return value:
186
186
  ```
187
187
  - for failed lock obtaining:
188
188
  ```ruby
189
- { ok: false, result: :acquier_is_not_first_in_queue }
190
- { ok: false, result: :lock_is_still_acquired }
191
- { ok: false, result: :lock_is_acquired_during_acquire_race }
189
+ { ok: false, result: :timeout_reached }
190
+ { ok: false, result: :retry_count_reached }
192
191
  { ok: false, result: :unknown }
193
192
  ```
194
193
 
@@ -197,9 +196,9 @@ Return value:
197
196
 
198
197
  #### #lock! - exceptional lock obtaining
199
198
 
200
- - fails when:
201
- - `timeout` limit reached before lock is obtained;
202
- - `retry_count` limit reached before lock is obtained;
199
+ - fails when (and with):
200
+ - (`RedisQueuedLocks::LockAcquiermentTimeoutError`) `timeout` limit reached before lock is obtained;
201
+ - (`RedisQueuedLocks::LockAcquiermentRetryLimitError`) `retry_count` limit reached before lock is obtained;
203
202
 
204
203
  ```ruby
205
204
  def lock!(
@@ -233,7 +232,18 @@ def unlock(lock_name)
233
232
  - the lock name that should be released.
234
233
 
235
234
  Return:
236
- - `[Hash<Symbol,Any>]` - Format: `{ ok: true/false, result: Symbol/Hash }`;
235
+ - `[Hash<Symbol,Any>]` - Format: `{ ok: true/false, result: Hash<Symbol,Numeric|String> }`;
236
+
237
+ ```ruby
238
+ {
239
+ ok: true,
240
+ result: {
241
+ rel_time: 0.02, # time spent to lock release (in seconds)
242
+ rel_key: "rql:lock:your_lock_name", # released lock key
243
+ rel_queue: "rql:lock_queue:your_lock_name" # released lock key queue
244
+ }
245
+ }
246
+ ```
237
247
 
238
248
  ---
239
249
 
@@ -250,7 +260,17 @@ def clear_locks(batch_size: config[:lock_release_batch_size])
250
260
  - batch of cleared locks and lock queus unde the one pipelined redis command;
251
261
 
252
262
  Return:
253
- - `[Hash<Symbol,Any>]` - Format: `{ ok: true/false, result: Symbol/Hash }`;
263
+ - `[Hash<Symbol,Any>]` - Format: `{ ok: true/false, result: Hash<Symbol,Numeric> }`;
264
+
265
+ ```ruby
266
+ {
267
+ ok: true,
268
+ result: {
269
+ rel_time: 3.07, # time spent to release all locks and related lock queues
270
+ rel_key_cnt: 100_500 # released redis keys (released locks + released lock queues)
271
+ }
272
+ }
273
+ ```
254
274
 
255
275
  ---
256
276
 
@@ -60,7 +60,7 @@ module RedisQueuedLocks::Acquier
60
60
  #
61
61
  # @api private
62
62
  # @since 0.1.0
63
- # rubocop:disable Metrics/MethodLength
63
+ # rubocop:disable Metrics/MethodLength, Metrics/BlockNesting
64
64
  def acquire_lock!(
65
65
  redis,
66
66
  lock_name,
@@ -147,6 +147,7 @@ module RedisQueuedLocks::Acquier
147
147
  if retry_count != nil && acq_process[:tries] >= retry_count
148
148
  # NOTE: reached the retry limit => quit from the loop
149
149
  acq_process[:should_try] = false
150
+ acq_process[:result] = :retry_limit_reached
150
151
  # NOTE: reached the retry limit => dequeue from the lock queue
151
152
  acq_dequeue.call
152
153
  # NOTE: check and raise an error
@@ -154,10 +155,11 @@ module RedisQueuedLocks::Acquier
154
155
  Failed to acquire the lock "#{lock_key}"
155
156
  for the given retry_count limit (#{retry_count} times).
156
157
  ERROR_MESSAGE
157
- elsif delay_execution(retry_delay, retry_jitter)
158
+ else
158
159
  # NOTE:
159
160
  # delay the exceution in order to prevent chaotic attempts
160
161
  # and to allow other processes and threads to obtain the lock too.
162
+ delay_execution(retry_delay, retry_jitter)
161
163
  end
162
164
  end
163
165
  end
@@ -191,12 +193,18 @@ module RedisQueuedLocks::Acquier
191
193
  { ok: true, result: acq_process[:lock_info] }
192
194
  end
193
195
  else
194
- # Step 3.b: lock is not acquired:
195
- # => drop itslef from the queue and return the reason of the failed acquirement
196
+ unless acq_process[:result] == :retry_limit_reached
197
+ # NOTE: we have only two situations if lock is not acquired:
198
+ # - time limit is reached
199
+ # - retry count limit is reached
200
+ # In other cases the lock obtaining time and tries count are infinite.
201
+ acq_process[:result] = :timeout_reached
202
+ end
203
+ # Step 3.b: lock is not acquired (acquier is dequeued by timeout callback)
196
204
  { ok: false, result: acq_process[:result] }
197
205
  end
198
206
  end
199
- # rubocop:enable Metrics/MethodLength
207
+ # rubocop:enable Metrics/MethodLength, Metrics/BlockNesting
200
208
 
201
209
  # Release the concrete lock:
202
210
  # - 1. clear lock queue: al; related processes released
@@ -208,7 +216,7 @@ module RedisQueuedLocks::Acquier
208
216
  # @param redis [RedisClient] Redis connection client.
209
217
  # @param lock_name [String] The lock name that should be released.
210
218
  # @param isntrumenter [#notify] See RedisQueuedLocks::Instrument::ActiveSupport for example.
211
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
219
+ # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Hash<Symbil,Numeric|String> }
212
220
  #
213
221
  # @api private
214
222
  # @since 0.1.0
@@ -231,7 +239,7 @@ module RedisQueuedLocks::Acquier
231
239
  })
232
240
  end
233
241
 
234
- { ok: true, result: result }
242
+ { ok: true, result: { rel_time: rel_time, rel_key: lock_key, rel_queue: lock_key_queue } }
235
243
  end
236
244
 
237
245
  # Release all locks:
@@ -241,7 +249,7 @@ module RedisQueuedLocks::Acquier
241
249
  # @param redis [RedisClient] Redis connection client.
242
250
  # @param batch_size [Integer] The number of lock keys that should be released in a time.
243
251
  # @param isntrumenter [#notify] See RedisQueuedLocks::Instrument::ActiveSupport for example.
244
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
252
+ # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Hash<Symbol,Numeric> }
245
253
  #
246
254
  # @api private
247
255
  # @since 0.1.0
@@ -260,7 +268,7 @@ module RedisQueuedLocks::Acquier
260
268
  })
261
269
  end
262
270
 
263
- { ok: true, result: result }
271
+ { ok: true, result: { rel_key_cnt: result[:rel_keys], rel_time: rel_time } }
264
272
  end
265
273
 
266
274
  private
@@ -5,6 +5,6 @@ module RedisQueuedLocks
5
5
  #
6
6
  # @api public
7
7
  # @since 0.0.1
8
- # @version 0.0.5
9
- VERSION = '0.0.5'
8
+ # @version 0.0.6
9
+ VERSION = '0.0.6'
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_queued_locks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov