redis_queued_locks 0.0.16 → 0.0.18

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: 524740cce42224df4610bce35ced68e38f0fceb13ba233fe9c2f4ceac76fa49a
4
- data.tar.gz: f3cb8b791292ba1c98b9b97c2a23b413edf74a3a5a25cebba5c7e3900f5705fd
3
+ metadata.gz: '0993079d1a7cca97094c741d65c4ef1e8a5694184212b6597960e0b3c91d83cb'
4
+ data.tar.gz: 22535e254fa22db6bfb0225f391e3d4606ad680bb401034fcbdfcd8e93a1fc5c
5
5
  SHA512:
6
- metadata.gz: 732ffd5fe549d093f8bc4ef6edd1db9751aa951b0cd0f75d3ba63b8facc7a5bea1d31c88527ae2ae1c3bd4bfc5e686a447ab3907d18f37c1756167d306c929aa
7
- data.tar.gz: f6b95308ec0653068de4816ce47a45f2470000079d468a54950f4a4bfc10c2689778108a265d3be097811d0da31b16678d14aa284903066e9c889201cc412abb
6
+ metadata.gz: 7db77251aefc59a83a9727d756774f5eb6b30a156fd058d69ec5170d252cc8fb875b2f213da2e15a4bdf9f5565565aa5ca699545ac0a83dcbc333fbed8c7aec1
7
+ data.tar.gz: 659c47a6aaa421ade9c7ffaea000a7133c1ba72f5ab0a2e66bc56f5ad72f84f4d9525fc86024e5d52b8196a6dfc7b0a714100462915a91405c97c3b3d77d3e26
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.0.18] - 2024-03-04
4
+ ### Changed
5
+ - Semantic results for methods returning `{ ok: true/false, result: Any }` hash objects.
6
+ Now these objects are represented as `RedisQueuedLocks::Data` objects inherited from `Hash`;
7
+
8
+ ## [0.0.17] - 2024-02-29
9
+ ### Added
10
+ - `RedisQueuedLocks::Client#locks` - list of obtained locks;
11
+ - `RedisQueuedLocks::Client#queues` - list of existing lock request queus;
12
+ - `RedisQueuedLocks::Client#keys` - get list of taken locks and queues;
13
+
3
14
  ## [0.0.16] - 2024-02-29
4
15
  ### Fixed
5
16
  - Execution delay formula returns the value "in seconds" (should be "in milliseconds");
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
 
@@ -21,6 +21,10 @@ Each lock request is put into the request queue and processed in order of their
21
21
  - [queued?](#queued)
22
22
  - [unlock](#unlock---release-a-lock)
23
23
  - [clear_locks](#clear_locks---release-all-locks-and-lock-queues)
24
+ - [extend_lock_ttl](#extend_lock_ttl)
25
+ - [locks](#locks---get-list-of-obtained-locks)
26
+ - [queues](#queues---get-list-of-lock-request-queues)
27
+ - [keys](#keys---get-list-of-taken-locks-and-queues)
24
28
  - [Instrumentation](#instrumentation)
25
29
  - [Instrumentation Events](#instrumentation-events)
26
30
  - [Roadmap](#roadmap)
@@ -104,10 +108,15 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config|
104
108
  config.default_queue_ttl = 15
105
109
 
106
110
  # (default: 100)
107
- # - how many items will be released at a time in RedisQueuedLocks::Client#clear_locks logic;
108
- # - affects the performancs capabilites (redis, rubyvm);
111
+ # - how many items will be released at a time in RedisQueuedLocks::Client#clear_locks logic (uses SCAN);
112
+ # - affects the performancs of your Redis and Ruby Application (configure thoughtfully);
109
113
  config.lock_release_batch_size = 100
110
114
 
115
+ # (default: 500)
116
+ # - how many items should be extracted from redis during the #locks, #queues and #keys operations (uses SCAN);
117
+ # - affects the performance of your Redis and Ruby Application (configure thoughtfully;)
118
+ config.key_extraction_batch_size = 500
119
+
111
120
  # (default: RedisQueuedLocks::Instrument::VoidNotifier)
112
121
  # - instrumentation layer;
113
122
  # - you can provde your own instrumenter with `#notify(event, payload = {})`
@@ -138,6 +147,10 @@ end
138
147
  - [queued?](#queued)
139
148
  - [unlock](#unlock---release-a-lock)
140
149
  - [clear_locks](#clear_locks---release-all-locks-and-lock-queues)
150
+ - [extend_lock_ttl](#extend_lock_ttl)
151
+ - [locks](#locks---get-list-of-obtained-locks)
152
+ - [queues](#queues---get-list-of-lock-request-queues)
153
+ - [keys](#keys---get-list-of-taken-locks-and-queues)
141
154
 
142
155
  ---
143
156
 
@@ -231,6 +244,7 @@ Return value:
231
244
  #### #lock! - exceptional lock obtaining
232
245
 
233
246
  - fails when (and with):
247
+ - (`RedisQueuedLocks::LockAlreadyObtainedError`) when `fail_fast` is `true` and lock is already obtained;
234
248
  - (`RedisQueuedLocks::LockAcquiermentTimeoutError`) `timeout` limit reached before lock is obtained;
235
249
  - (`RedisQueuedLocks::LockAcquiermentRetryLimitError`) `retry_count` limit reached before lock is obtained;
236
250
 
@@ -393,6 +407,94 @@ Return:
393
407
 
394
408
  ---
395
409
 
410
+ #### #extend_lock_ttl
411
+
412
+ - soon
413
+
414
+ ---
415
+
416
+ #### #locks - get list of obtained locks
417
+
418
+ - uses redis `SCAN` under the hood;
419
+ - accepts `scan_size:`/`Integer` option (`config[:key_extraction_batch_size]` by default);
420
+ - returns `Set<String>`
421
+
422
+ ```ruby
423
+ rql.locks # or rql.locks(scan_size: 123)
424
+
425
+ =>
426
+ #<Set:
427
+ {"rql:lock:locklock75",
428
+ "rql:lock:locklock9",
429
+ "rql:lock:locklock108",
430
+ "rql:lock:locklock7",
431
+ "rql:lock:locklock48",
432
+ "rql:lock:locklock104",
433
+ "rql:lock:locklock13",
434
+ "rql:lock:locklock62",
435
+ "rql:lock:locklock80",
436
+ "rql:lock:locklock28",
437
+ ...}>
438
+ ```
439
+
440
+ ---
441
+
442
+ #### #queues - get list of lock request queues
443
+
444
+ - uses redis `SCAN` under the hood;
445
+ - accepts `scan_size:`/`Integer` option (`config[:key_extraction_batch_size]` by default);
446
+ - returns `Set<String>`
447
+
448
+ ```ruby
449
+ rql.queues # or rql.queues(scan_size: 123)
450
+
451
+ =>
452
+ #<Set:
453
+ {"rql:lock_queue:locklock75",
454
+ "rql:lock_queue:locklock9",
455
+ "rql:lock_queue:locklock108",
456
+ "rql:lock_queue:locklock7",
457
+ "rql:lock_queue:locklock48",
458
+ "rql:lock_queue:locklock104",
459
+ "rql:lock_queue:locklock13",
460
+ "rql:lock_queue:locklock62",
461
+ "rql:lock_queue:locklock80",
462
+ "rql:lock_queue:locklock28",
463
+ ...}>
464
+ ```
465
+
466
+ ---
467
+
468
+ #### #keys - get list of taken locks and queues
469
+
470
+ - uses redis `SCAN` under the hood;
471
+ - accepts `scan_size:`/`Integer` option (`config[:key_extraction_batch_size]` by default);
472
+ - returns `Set<String>`
473
+
474
+ ```ruby
475
+ rql.keys # or rql.keys(scan_size: 123)
476
+
477
+ =>
478
+ #<Set:
479
+ {"rql:lock_queue:locklock75",
480
+ "rql:lock_queue:locklock9",
481
+ "rql:lock:locklock9",
482
+ "rql:lock_queue:locklock108",
483
+ "rql:lock_queue:locklock7",
484
+ "rql:lock:locklock7",
485
+ "rql:lock_queue:locklock48",
486
+ "rql:lock_queue:locklock104",
487
+ "rql:lock:locklock104",
488
+ "rql:lock_queue:locklock13",
489
+ "rql:lock_queue:locklock62",
490
+ "rql:lock_queue:locklock80",
491
+ "rql:lock:locklock80",
492
+ "rql:lock_queue:locklock28",
493
+ ...}>
494
+ ```
495
+
496
+ ---
497
+
396
498
  ## Instrumentation
397
499
 
398
500
  An instrumentation layer is incapsulated in `instrumenter` object stored in [config](#configuration) (`RedisQueuedLocks::Client#config[:instrumenter]`).
@@ -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
@@ -37,6 +37,7 @@ module RedisQueuedLocks::Acquier::Release
37
37
  RedisQueuedLocks::Resource::LOCK_QUEUE_PATTERN,
38
38
  count: batch_size
39
39
  ) do |lock_queue|
40
+ # TODO: reduce unnecessary iterations
40
41
  pipeline.call('ZREMRANGEBYSCORE', lock_queue, '-inf', '+inf')
41
42
  pipeline.call('EXPIRE', RedisQueuedLocks::Resource.lock_key_from_queue(lock_queue), '0')
42
43
  end
@@ -47,12 +48,13 @@ module RedisQueuedLocks::Acquier::Release
47
48
  RedisQueuedLocks::Resource::LOCK_PATTERN,
48
49
  count: batch_size
49
50
  ) do |lock_key|
51
+ # TODO: reduce unnecessary iterations
50
52
  pipeline.call('EXPIRE', lock_key, '0')
51
53
  end
52
54
  end
53
55
 
54
56
  rel_keys = result.count { |red_res| red_res == 0 }
55
57
 
56
- { ok: true, result: { rel_keys: rel_keys } }
58
+ RedisQueuedLocks::Data[ok: true, result: { rel_keys: rel_keys }]
57
59
  end
58
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
@@ -63,7 +63,7 @@ module RedisQueuedLocks::Acquier
63
63
  # already obtained.
64
64
  # @param [Block]
65
65
  # A block of code that should be executed after the successfully acquired lock.
66
- # @return [Hash<Symbol,Any>,yield]
66
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
67
67
  # - Format: { ok: true/false, result: Any }
68
68
  # - If block is given the result of block's yeld will be returned.
69
69
  #
@@ -232,7 +232,7 @@ module RedisQueuedLocks::Acquier
232
232
  end
233
233
  end
234
234
  else
235
- { ok: true, result: acq_process[:lock_info] }
235
+ RedisQueuedLocks::Data[ok: true, result: acq_process[:lock_info]]
236
236
  end
237
237
  else
238
238
  if acq_process[:result] != :retry_limit_reached &&
@@ -245,7 +245,7 @@ module RedisQueuedLocks::Acquier
245
245
  acq_process[:result] = :timeout_reached
246
246
  end
247
247
  # Step 3.b: lock is not acquired (acquier is dequeued by timeout callback)
248
- { ok: false, result: acq_process[:result] }
248
+ RedisQueuedLocks::Data[ok: false, result: acq_process[:result]]
249
249
  end
250
250
  end
251
251
  # rubocop:enable Metrics/MethodLength, Metrics/BlockNesting
@@ -257,10 +257,14 @@ module RedisQueuedLocks::Acquier
257
257
  # It is safe because the lock obtain logic is transactional and
258
258
  # watches the original lock for changes.
259
259
  #
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> }
260
+ # @param redis [RedisClient]
261
+ # Redis connection client.
262
+ # @param lock_name [String]
263
+ # The lock name that should be released.
264
+ # @param isntrumenter [#notify]
265
+ # See RedisQueuedLocks::Instrument::ActiveSupport for example.
266
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
267
+ # Format: { ok: true/false, result: Hash<Symbil,Numeric|String> }
264
268
  #
265
269
  # @api private
266
270
  # @since 0.1.0
@@ -283,17 +287,24 @@ module RedisQueuedLocks::Acquier
283
287
  })
284
288
  end
285
289
 
286
- { ok: true, result: { rel_time: rel_time, rel_key: lock_key, rel_queue: lock_key_queue } }
290
+ RedisQueuedLocks::Data[
291
+ ok: true,
292
+ result: { rel_time: rel_time, rel_key: lock_key, rel_queue: lock_key_queue }
293
+ ]
287
294
  end
288
295
 
289
296
  # Release all locks:
290
297
  # - 1. clear all lock queus: drop them all from Redis database by the lock queue pattern;
291
298
  # - 2. delete all locks: drop lock keys from Redis by the lock key pattern;
292
299
  #
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> }
300
+ # @param redis [RedisClient]
301
+ # Redis connection client.
302
+ # @param batch_size [Integer]
303
+ # The number of lock keys that should be released in a time.
304
+ # @param isntrumenter [#notify]
305
+ # See RedisQueuedLocks::Instrument::ActiveSupport for example.
306
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
307
+ # Format: { ok: true/false, result: Hash<Symbol,Numeric> }
297
308
  #
298
309
  # @api private
299
310
  # @since 0.1.0
@@ -312,7 +323,10 @@ module RedisQueuedLocks::Acquier
312
323
  })
313
324
  end
314
325
 
315
- { ok: true, result: { rel_key_cnt: result[:rel_keys], rel_time: rel_time } }
326
+ RedisQueuedLocks::Data[
327
+ ok: true,
328
+ result: { rel_key_cnt: result[:rel_keys], rel_time: rel_time }
329
+ ]
316
330
  end
317
331
 
318
332
  # @param redis_client [RedisClient]
@@ -437,7 +451,66 @@ module RedisQueuedLocks::Acquier
437
451
  #
438
452
  # @api private
439
453
  # @since 0.1.0
440
- def extend_lock_ttl(redis_client, lock_name, milliseconds); end
454
+ def extend_lock_ttl(redis_client, lock_name, milliseconds)
455
+ # TODO: realize
456
+ end
457
+
458
+ # @param redis_client [RedisClient]
459
+ # @option scan_size [Integer]
460
+ # @return [Set<String>]
461
+ #
462
+ # @api private
463
+ # @since 0.1.0
464
+ def locks(redis_client, scan_size:)
465
+ Set.new.tap do |lock_keys|
466
+ redis_client.scan(
467
+ 'MATCH',
468
+ RedisQueuedLocks::Resource::LOCK_PATTERN,
469
+ count: scan_size
470
+ ) do |lock_key|
471
+ # TODO: reduce unnecessary iterations
472
+ lock_keys.add(lock_key)
473
+ end
474
+ end
475
+ end
476
+
477
+ # @param redis_client [RedisClient]
478
+ # @param scan_size [Integer]
479
+ # @return [Set<String>]
480
+ #
481
+ # @api private
482
+ # @since 0.1.0
483
+ def queues(redis_client, scan_size:)
484
+ Set.new.tap do |lock_queues|
485
+ redis_client.scan(
486
+ 'MATCH',
487
+ RedisQueuedLocks::Resource::LOCK_QUEUE_PATTERN,
488
+ count: scan_size
489
+ ) do |lock_queue|
490
+ # TODO: reduce unnecessary iterations
491
+ lock_queues.add(lock_queue)
492
+ end
493
+ end
494
+ end
495
+
496
+ # @param redis_client [RedisClient]
497
+ # @option scan_size [Integer]
498
+ # @return [Array<String>]
499
+ #
500
+ # @api private
501
+ # @since 0.1.0
502
+ def keys(redis_client, scan_size:)
503
+ Set.new.tap do |keys|
504
+ redis_client.scan(
505
+ 'MATCH',
506
+ RedisQueuedLocks::Resource::KEY_PATTERN,
507
+ count: scan_size
508
+ ) do |key|
509
+ # TODO: reduce unnecessary iterations
510
+ keys.add(key)
511
+ end
512
+ end
513
+ end
441
514
 
442
515
  private
443
516
 
@@ -15,6 +15,7 @@ class RedisQueuedLocks::Client
15
15
  setting :default_lock_ttl, 5_000 # NOTE: milliseconds
16
16
  setting :default_queue_ttl, 15 # NOTE: seconds
17
17
  setting :lock_release_batch_size, 100
18
+ setting :key_extraction_batch_size, 500
18
19
  setting :instrumenter, RedisQueuedLocks::Instrument::VoidNotifier
19
20
  setting :uniq_identifier, -> { RedisQueuedLocks::Resource.calc_uniq_identity }
20
21
 
@@ -91,7 +92,7 @@ class RedisQueuedLocks::Client
91
92
  # by another process while the lock request queue was initially empty;
92
93
  # @param block [Block]
93
94
  # A block of code that should be executed after the successfully acquired lock.
94
- # @return [Hash<Symbol,Any>,yield]
95
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
95
96
  # - Format: { ok: true/false, result: Symbol/Hash }.
96
97
  # - If block is given the result of block's yeld will be returned.
97
98
  #
@@ -162,8 +163,10 @@ class RedisQueuedLocks::Client
162
163
  )
163
164
  end
164
165
 
165
- # @param lock_name [String] The lock name that should be released.
166
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Symbol/Hash }.
166
+ # @param lock_name [String]
167
+ # The lock name that should be released.
168
+ # @return [RedisQueuedLocks::Data, Hash<Symbol,Any>]
169
+ # Format: { ok: true/false, result: Symbol/Hash }.
167
170
  #
168
171
  # @api public
169
172
  # @since 0.1.0
@@ -218,12 +221,40 @@ class RedisQueuedLocks::Client
218
221
  end
219
222
 
220
223
  # @option batch_size [Integer]
221
- # @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Symbol/Hash }.
224
+ # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
225
+ # Format: { ok: true/false, result: Symbol/Hash }.
222
226
  #
223
227
  # @api public
224
228
  # @since 0.1.0
225
229
  def clear_locks(batch_size: config[:lock_release_batch_size])
226
230
  RedisQueuedLocks::Acquier.release_all_locks!(redis_client, batch_size, config[:instrumenter])
227
231
  end
232
+
233
+ # @option scan_size [Integer]
234
+ # @return [Set<String>]
235
+ #
236
+ # @api public
237
+ # @since 0.1.0
238
+ def locks(scan_size: config[:key_extraction_batch_size])
239
+ RedisQueuedLocks::Acquier.locks(redis_client, scan_size:)
240
+ end
241
+
242
+ # @option scan_size [Integer]
243
+ # @return [Set<String>]
244
+ #
245
+ # @api public
246
+ # @since 0.1.0
247
+ def queues(scan_size: config[:key_extraction_batch_size])
248
+ RedisQueuedLocks::Acquier.queues(redis_client, scan_size:)
249
+ end
250
+
251
+ # @option scan_size [Integer]
252
+ # @return [Set<String>]
253
+ #
254
+ # @api public
255
+ # @since 0.1.0
256
+ def keys(scan_size: config[:key_extraction_batch_size])
257
+ RedisQueuedLocks::Acquier.keys(redis_client, scan_size:)
258
+ end
228
259
  end
229
260
  # rubocop:enable Metrics/ClassLength
@@ -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
@@ -3,6 +3,12 @@
3
3
  # @api private
4
4
  # @since 0.1.0
5
5
  module RedisQueuedLocks::Resource
6
+ # @return [String]
7
+ #
8
+ # @api private
9
+ # @since 0.1.0
10
+ KEY_PATTERN = 'rql:lock*'
11
+
6
12
  # @return [String]
7
13
  #
8
14
  # @api private
@@ -5,6 +5,6 @@ module RedisQueuedLocks
5
5
  #
6
6
  # @api public
7
7
  # @since 0.0.1
8
- # @version 0.0.16
9
- VERSION = '0.0.16'
8
+ # @version 0.0.18
9
+ VERSION = '0.0.18'
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.16
4
+ version: 0.0.18
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-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client
@@ -61,6 +61,7 @@ files:
61
61
  - lib/redis_queued_locks/acquier/release.rb
62
62
  - lib/redis_queued_locks/acquier/try.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