redis_queued_locks 1.14.0 → 1.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7924e5055147fe7c2e0ff65e59ca7e82dc0ae81ce2c880cced9c914307fb1821
4
- data.tar.gz: e6921c3d151ae3d227ad130989562f96266954c47c8358ecd82f76afc922c362
3
+ metadata.gz: f196a3e198011c805f10df6ba3c2110471b85e0f7e3629a8d6c0594329c6a61c
4
+ data.tar.gz: 00d1067ee165b563380b0e2061af8c73e37466e8a55b2f43c8f119069fd90b39
5
5
  SHA512:
6
- metadata.gz: e0b1deaefb5638a96392c759a903661ad3175e45b128e605f0939889c56974c6f6ea2f887884a883fcd8843aec5423bd384a7c8d24644a42ff4e0c6737e0340e
7
- data.tar.gz: ffaea4bd5b9c57802b99c754e2defb6e16ad9cff3e82855b4a8e6e3f93538ba648dbc84f3cd85200017f47bbc9f4d26a7bbb5d910776c79b19adbc02e5a002ed
6
+ metadata.gz: 6b6066096f58daeafab9c6c06f815628be1d2b32a56374f1fc3d1d6cdcff4f7aba6271d20efc16c0439084e629b6867e66eeb58d0091454b5441e29310fcb83b
7
+ data.tar.gz: 43751ba0011d662474c47ad014620d2b43d4555f04ae41f1a23ac1f7072aa20736a430e5a7db2a494449fe3245331e48bcf8453b91ba56c4ceba08dafaf5ed42
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.15.1] - 2025-10-22
4
+ ### Fixed
5
+ - **Config Layer**:
6
+ - some config keys has no correspondig validator so during config instantation
7
+ custom configuraiton of these keys leads to **NoMethodError**. Missing validators were added and
8
+ a correspondig test added too.
9
+
10
+ ## [1.15.0] - 2025-10-17
11
+ ### Changed
12
+ - `"redis_queud_locks.release_locks_of"` instrumentation event payload now includes `hst_id` and `acq_id`;
13
+
3
14
  ## [1.14.0] - 2025-10-17
4
15
  ### Added
5
16
  - `#clear_locks_of`/`#release_locks_of`
@@ -271,17 +282,17 @@
271
282
 
272
283
  ## [0.0.31] - 2024-03-25
273
284
  ### Changed
274
- - `:metadata` renamed to `:instrument` in order to reflect it's domain area;
285
+ - `:metadata` renamed to `:instrument` in order to reflect its domain area;
275
286
  - `:metadata` is renamed to `:meta` and reserved for future updates;
276
287
 
277
288
  ## [0.0.30] - 2024-03-23
278
289
  ### Fixed
279
290
  - Re-enqueue problem: fixed a problem when the expired lock requests were infinitly re-added to the lock queue
280
291
  and immediately removed from the lock queue rather than being re-positioned. It happens when the lock request
281
- ttl reached the queue ttl, and the new request now had the dead score forever (fix: it's score now will be correctly
292
+ ttl reached the queue ttl, and the new request now had the dead score forever (fix: its score now will be correctly
282
293
  recalculated from the current time at the dead score time moment);
283
294
  ### Added
284
- - Logging: more detailed logs to the `RedisQueuedLocks::Acquier::AcquierLock` logic and it's sub-modules:
295
+ - Logging: more detailed logs to the `RedisQueuedLocks::Acquier::AcquierLock` logic and its sub-modules:
285
296
  - added new logs;
286
297
  - added `queue_ttl` to each log;
287
298
 
data/README.md CHANGED
@@ -104,7 +104,7 @@ Provides flexible invocation flow, parametrized limits (lock request ttl, lock t
104
104
 
105
105
  <sup>\[[back to top](#table-of-contents)\]</sup>
106
106
 
107
- > Each lock request is put into the request queue (each lock is hosted by it's own queue separately from other queues) and processed in order of their priority (FIFO). Each lock request lives some period of time (RTTL) which guarantees that the request queue will never be stacked.
107
+ > Each lock request is put into the request queue (each lock is hosted by its own queue separately from other queues) and processed in order of their priority (FIFO). Each lock request lives some period of time (RTTL) which guarantees that the request queue will never be stacked.
108
108
 
109
109
  > In addition to the classic "queued" (FIFO) strategy RQL supports "random" (RANDOM) lock obtaining strategy when any acquirer from the lock queue can obtain the lock regardless the position in the queue.
110
110
 
@@ -577,8 +577,8 @@ def lock(
577
577
  - `false` by default;
578
578
  - `block` - (optional) `[Block]`
579
579
  - A block of code that should be executed after the successfully acquired lock.
580
- - If block is **passed** the obtained lock will be released after the block execution or it's ttl (what will happen first);
581
- - If block is **not passed** the obtained lock will be released after it's ttl;
580
+ - If block is **passed** the obtained lock will be released after the block execution or its ttl (what will happen first);
581
+ - If block is **not passed** the obtained lock will be released after its ttl;
582
582
  - If you want the block to have a TTL too and this TTL to be the same as TTL of the lock
583
583
  use `timed: true` option (`rql.lock("my_lock", timed: true, ttl: 5_000) { ... }`)
584
584
 
@@ -722,7 +722,7 @@ rql.lock_info("my_lock")
722
722
 
723
723
  - (`:queue_ttl`) setting a short limit of time to the lock request queue position (if a process fails to acquire
724
724
  the lock within this period of time (and before timeout/retry_count limits occurs of course) -
725
- it's lock request will be moved to the end of queue):
725
+ its lock request will be moved to the end of queue):
726
726
 
727
727
  ```ruby
728
728
  rql.lock("my_lock", queue_ttl: 5, timeout: 10_000, retry_count: nil)
@@ -1596,7 +1596,7 @@ Accepts:
1596
1596
  - `:dead_ttl` - (optional) `[Integer]`
1597
1597
  - lock request ttl after which a lock request is considered dead;
1598
1598
  - has a preconfigured value in `config['dead_request_ttl']` (1 day by default);
1599
- - `:sacn_size` - (optional) `[Integer]`
1599
+ - `:scan_size` - (optional) `[Integer]`
1600
1600
  - the batch of scanned keys for Redis'es SCAN command;
1601
1601
  - has a preconfigured valie in `config['lock_release_batch_size']`;
1602
1602
  - `:logger` - (optional) `[::Logger,#debug]`
@@ -2286,13 +2286,15 @@ Detalized event semantics and payload structure:
2286
2286
 
2287
2287
  ##### `"redis_queued_locks.release_locks_of"`
2288
2288
  - <sup>\[[back to the list](#instrumentation-events)\]</sup>
2289
- - an event signalizes about the released locks of the cocnrete host and acquirer;
2289
+ - an event signalizes about the released locks (and removement from lock queues) of the concrete host and acquirer;
2290
2290
  - raised from `#clear_locks_of` and `#clear_current_locks` (`#release_locks_of` and `#release_current_locks` respectively);
2291
2291
  - payload:
2292
2292
  - `:rel_time` - `float`/`milliseconds` - time spent on "release locks of" operation;
2293
2293
  - `:at` - `float`/`epoch` - the time when the opertaion has ended;
2294
+ - `:acq_id` - `string` - refused acquirer identifier;
2295
+ - `:hst_id` - `string` - refused host identifier;
2294
2296
  - `:rel_key_cnt` - `integer` - released locks count;
2295
- - `:tch_queue_cnt` - `:integer` - the number of queues from which the cocnrete host/acquirer was removed;
2297
+ - `:tch_queue_cnt` - `:integer` - the number of queues from which the concrete host/acquirer was removed;
2296
2298
 
2297
2299
  ---
2298
2300
 
@@ -2355,7 +2357,7 @@ Detalized event semantics and payload structure:
2355
2357
  - `unlock_on:`-option in lock/lock! logic in order to support auto-unlocking on any exception rasaied under the invoked block (invoked under the lock);
2356
2358
  - **Research**: support for `Valkey` database backend (https://github.com/valkey-io/valkey) (https://valkey.io/);
2357
2359
  - **Research**: support for `Garnet` database backend (https://microsoft.github.io/) (https://github.com/microsoft/garnet);
2358
- - add a library-level exception, when RQL-related key in Redis (required for it's logic) has incompatible type (means: some other program uses our key with their own type and logic and RQL can't work properly);
2360
+ - add a library-level exception, when RQL-related key in Redis (required for its logic) has incompatible type (means: some other program uses our key with their own type and logic and RQL can't work properly);
2359
2361
  ---
2360
2362
 
2361
2363
  ## Build and Develop
@@ -1,20 +1,20 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- redis_queued_locks (1.13.0)
4
+ redis_queued_locks (1.15.1)
5
5
  redis-client (~> 0.20)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (8.0.2)
10
+ activesupport (8.1.0)
11
11
  base64
12
- benchmark (>= 0.3)
13
12
  bigdecimal
14
13
  concurrent-ruby (~> 1.0, >= 1.3.1)
15
14
  connection_pool (>= 2.2.5)
16
15
  drb
17
16
  i18n (>= 1.6, < 2)
17
+ json
18
18
  logger (>= 1.4.2)
19
19
  minitest (>= 5.1)
20
20
  securerandom (>= 0.3)
@@ -33,11 +33,10 @@ GEM
33
33
  rubocop-thread_safety (= 0.7.2)
34
34
  ast (2.4.3)
35
35
  base64 (0.3.0)
36
- benchmark (0.4.1)
37
- bigdecimal (3.2.1)
36
+ bigdecimal (3.3.1)
38
37
  coderay (1.1.3)
39
38
  concurrent-ruby (1.3.5)
40
- connection_pool (2.5.3)
39
+ connection_pool (2.5.4)
41
40
  csv (3.3.5)
42
41
  diff-lcs (1.6.2)
43
42
  docile (1.4.1)
@@ -56,7 +55,7 @@ GEM
56
55
  fileutils (1.7.3)
57
56
  i18n (1.14.7)
58
57
  concurrent-ruby (~> 1.0)
59
- json (2.12.2)
58
+ json (2.15.1)
60
59
  language_server-protocol (3.17.0.5)
61
60
  lint_roller (1.1.0)
62
61
  listen (3.9.0)
@@ -64,43 +63,43 @@ GEM
64
63
  rb-inotify (~> 0.9, >= 0.9.10)
65
64
  logger (1.7.0)
66
65
  method_source (1.1.0)
67
- minitest (5.25.5)
66
+ minitest (5.26.0)
68
67
  mutex_m (0.3.0)
69
68
  parallel (1.27.0)
70
- parser (3.3.8.0)
69
+ parser (3.3.9.0)
71
70
  ast (~> 2.4.1)
72
71
  racc
73
- prism (1.4.0)
72
+ prism (1.6.0)
74
73
  pry (0.15.2)
75
74
  coderay (~> 1.1)
76
75
  method_source (~> 1.0)
77
76
  racc (1.8.1)
78
- rack (3.1.15)
77
+ rack (3.2.3)
79
78
  rainbow (3.1.1)
80
79
  rake (13.3.0)
81
80
  rb-fsevent (0.11.2)
82
81
  rb-inotify (0.11.1)
83
82
  ffi (~> 1.0)
84
- rbs (3.9.4)
83
+ rbs (3.9.5)
85
84
  logger
86
- redis-client (0.24.0)
85
+ redis-client (0.26.1)
87
86
  connection_pool
88
- regexp_parser (2.10.0)
89
- rspec (3.13.1)
87
+ regexp_parser (2.11.3)
88
+ rspec (3.13.2)
90
89
  rspec-core (~> 3.13.0)
91
90
  rspec-expectations (~> 3.13.0)
92
91
  rspec-mocks (~> 3.13.0)
93
- rspec-core (3.13.4)
92
+ rspec-core (3.13.6)
94
93
  rspec-support (~> 3.13.0)
95
94
  rspec-expectations (3.13.5)
96
95
  diff-lcs (>= 1.2.0, < 2.0)
97
96
  rspec-support (~> 3.13.0)
98
- rspec-mocks (3.13.5)
97
+ rspec-mocks (3.13.6)
99
98
  diff-lcs (>= 1.2.0, < 2.0)
100
99
  rspec-support (~> 3.13.0)
101
100
  rspec-retry (0.6.2)
102
101
  rspec-core (> 3.3)
103
- rspec-support (3.13.4)
102
+ rspec-support (3.13.6)
104
103
  rubocop (1.75.7)
105
104
  json (~> 2.3)
106
105
  language_server-protocol (~> 3.17.0.2)
@@ -112,7 +111,7 @@ GEM
112
111
  rubocop-ast (>= 1.44.0, < 2.0)
113
112
  ruby-progressbar (~> 1.7)
114
113
  unicode-display_width (>= 2.4.0, < 4.0)
115
- rubocop-ast (1.44.1)
114
+ rubocop-ast (1.47.1)
116
115
  parser (>= 3.3.7.2)
117
116
  prism (~> 1.4)
118
117
  rubocop-capybara (2.22.1)
@@ -155,8 +154,8 @@ GEM
155
154
  docile (~> 1.1)
156
155
  simplecov-html (~> 0.11)
157
156
  simplecov_json_formatter (~> 0.1)
158
- simplecov-html (0.13.1)
159
- simplecov-lcov (0.8.0)
157
+ simplecov-html (0.13.2)
158
+ simplecov-lcov (0.9.0)
160
159
  simplecov_json_formatter (0.1.4)
161
160
  steep (1.10.0)
162
161
  activesupport (>= 5.1)
@@ -180,10 +179,10 @@ GEM
180
179
  unicode-display_width (>= 1.1.1, < 4)
181
180
  tzinfo (2.0.6)
182
181
  concurrent-ruby (~> 1.0)
183
- unicode-display_width (3.1.4)
184
- unicode-emoji (~> 4.0, >= 4.0.4)
185
- unicode-emoji (4.0.4)
186
- uri (1.0.3)
182
+ unicode-display_width (3.2.0)
183
+ unicode-emoji (~> 4.1)
184
+ unicode-emoji (4.1.0)
185
+ uri (1.0.4)
187
186
  zlib (3.2.1)
188
187
 
189
188
  PLATFORMS
@@ -214,4 +213,4 @@ DEPENDENCIES
214
213
  steep
215
214
 
216
215
  BUNDLED WITH
217
- 2.6.9
216
+ 2.7.2
@@ -73,10 +73,18 @@ module RedisQueuedLocks::Acquirer::ReleaseLocksOf
73
73
  # despite the enabled instrumentation sampling;
74
74
  # - makes sense when instrumentation sampling is enabled;
75
75
  # @return [Hash<Symbol,Any>]
76
- # Format: { ok: true, result: Hash<Symbol,Numeric> }
76
+ # Format: {
77
+ # ok: true,
78
+ # result: {
79
+ # rel_key_cnt: Integer,
80
+ # tch_queue_cnt: Integer,
81
+ # rel_time: Numeric
82
+ # }
83
+ # }
77
84
  #
78
85
  # @api private
79
86
  # @since 1.14.0
87
+ # @version 1.15.0
80
88
  # rubocop:disable Metrics/MethodLength
81
89
  def release_locks_of(
82
90
  refused_host_id,
@@ -125,6 +133,8 @@ module RedisQueuedLocks::Acquirer::ReleaseLocksOf
125
133
  run_non_critical do
126
134
  instrumenter.notify('redis_queued_locks.release_locks_of', {
127
135
  at: time_at,
136
+ hst_id: refused_host_id,
137
+ acq_id: refused_acquirer_id,
128
138
  rel_time: rel_time,
129
139
  rel_key_cnt: result[:rel_key_cnt],
130
140
  tch_queue_cnt: result[:tch_queue_cnt]
@@ -2,7 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 1.13.0
5
- # @version 1.14.0
5
+ # @version 1.15.1
6
6
  # rubocop:disable Metrics/ClassLength
7
7
  class RedisQueuedLocks::Config
8
8
  require_relative 'config/dsl'
@@ -78,12 +78,13 @@ class RedisQueuedLocks::Config
78
78
  validate('retry_delay') { |val| val.is_a?(Integer) && val >= 0 }
79
79
  validate('retry_jitter') { |val| val.is_a?(Integer) && val >= 0 }
80
80
  validate('try_to_lock_timeout') { |val| val == nil || (val.is_a?(Integer) && val >= 0) }
81
- validate('default_lock_tt') { |val| val.is_a?(Integer) }
81
+ validate('default_lock_ttl') { |val| val.is_a?(Integer) }
82
82
  validate('default_queue_ttl') { |val| val.is_a?(Integer) }
83
83
  validate('detailed_acq_timeout_error') { |val| val == true || val == false }
84
84
  validate('lock_release_batch_size') { |val| val.is_a?(Integer) }
85
85
  validate('clear_locks_of__lock_scan_size') { |val| val.is_a?(Integer) }
86
86
  validate('clear_locks_of__queue_scan_size') { |val| val.is_a?(Integer) }
87
+ validate('key_extraction_batch_size') { |val| val.is_a?(Integer) }
87
88
  validate('instrumenter') { |val| RedisQueuedLocks::Instrument.valid_interface?(val) }
88
89
  validate('uniq_identifier') { |val| val.is_a?(Proc) }
89
90
  validate('logger') { |val| RedisQueuedLocks::Logging.valid_interface?(val) }
@@ -158,7 +158,7 @@ class RedisQueuedLocks::Swarm
158
158
  end
159
159
 
160
160
  # @option zombie_ttl [Integer]
161
- # @option lock_sacn_size [Integer]
161
+ # @option lock_scan_size [Integer]
162
162
  # @return [Hash<Symbol,Set<String>>]
163
163
  #
164
164
  # @api public
@@ -5,6 +5,6 @@ module RedisQueuedLocks
5
5
  #
6
6
  # @api public
7
7
  # @since 0.0.1
8
- # @version 1.14.0
9
- VERSION = '1.14.0'
8
+ # @version 1.15.1
9
+ VERSION = '1.15.1'
10
10
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  "|> Distributed locks with \"prioritized lock acquisition queue\" capabilities " \
19
19
  "based on the Redis Database.\n" \
20
20
  "|> Each lock request is put into the request queue " \
21
- "(each lock is hosted by it's own queue separately from other queues) and processed " \
21
+ "(each lock is hosted by its own queue separately from other queues) and processed " \
22
22
  "in order of their priority (FIFO).\n" \
23
23
  "|> Each lock request lives some period of time (RTTL) " \
24
24
  "(with requeue capabilities) which guarantees the request queue will never be stacked.\n" \
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: 1.14.0
4
+ version: 1.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
@@ -25,7 +25,7 @@ dependencies:
25
25
  version: '0.20'
26
26
  description: |-
27
27
  |> Distributed locks with "prioritized lock acquisition queue" capabilities based on the Redis Database.
28
- |> Each lock request is put into the request queue (each lock is hosted by it's own queue separately from other queues) and processed in order of their priority (FIFO).
28
+ |> Each lock request is put into the request queue (each lock is hosted by its own queue separately from other queues) and processed in order of their priority (FIFO).
29
29
  |> Each lock request lives some period of time (RTTL) (with requeue capabilities) which guarantees the request queue will never be stacked.
30
30
  |> In addition to the classic `queued` (FIFO) strategy RQL supports `random` (RANDOM) lock obtaining strategy when any acquirer from the lock queue can obtain the lock regardless the position in the queue.
31
31
  |> Provides flexible invocation flow, parametrized limits (lock request ttl, lock ttl, queue ttl, lock attempts limit, fast failing, etc), logging and instrumentation.