redis_queued_locks 1.19.0 → 1.21.0

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/project-overview.md +96 -23
  3. data/.claude/rules/acquirer.md +39 -20
  4. data/.claude/rules/arguments.md +3 -2
  5. data/.claude/rules/git.md +3 -2
  6. data/.claude/rules/logic.md +32 -8
  7. data/.claude/rules/swarm.md +14 -9
  8. data/.claude/rules/tests.md +12 -3
  9. data/.claude/rules/type-checking.md +2 -1
  10. data/.claude/rules/visitors.md +10 -11
  11. data/.claude/skills/rql-code-review/SKILL.md +386 -0
  12. data/.claude/skills/rql-code-review/templates/report.en.md +31 -0
  13. data/.claude/skills/rql-code-review/templates/report.ru.md +31 -0
  14. data/CHANGELOG.md +194 -0
  15. data/CLAUDE.md +6 -3
  16. data/README.md +502 -92
  17. data/lib/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue/log_visitor.rb +1 -0
  18. data/lib/redis_queued_locks/acquirer/acquire_lock/instr_visitor.rb +42 -0
  19. data/lib/redis_queued_locks/acquirer/acquire_lock/log_visitor.rb +45 -0
  20. data/lib/redis_queued_locks/acquirer/acquire_lock/try_to_lock/log_visitor.rb +1 -0
  21. data/lib/redis_queued_locks/acquirer/acquire_lock/try_to_lock.rb +695 -128
  22. data/lib/redis_queued_locks/acquirer/acquire_lock/with_acq_timeout.rb +2 -2
  23. data/lib/redis_queued_locks/acquirer/acquire_lock/yield_expire/log_visitor.rb +1 -0
  24. data/lib/redis_queued_locks/acquirer/acquire_lock/yield_expire.rb +8 -6
  25. data/lib/redis_queued_locks/acquirer/acquire_lock.rb +134 -26
  26. data/lib/redis_queued_locks/acquirer/clear_dead_requests.rb +229 -24
  27. data/lib/redis_queued_locks/acquirer/extend_lock_ttl.rb +189 -18
  28. data/lib/redis_queued_locks/acquirer/is_locked.rb +0 -1
  29. data/lib/redis_queued_locks/acquirer/is_queued.rb +0 -1
  30. data/lib/redis_queued_locks/acquirer/keys.rb +151 -7
  31. data/lib/redis_queued_locks/acquirer/lock_info.rb +39 -41
  32. data/lib/redis_queued_locks/acquirer/lock_series_poc/instr_visitor.rb +3 -2
  33. data/lib/redis_queued_locks/acquirer/lock_series_poc/log_visitor.rb +5 -4
  34. data/lib/redis_queued_locks/acquirer/lock_series_poc.rb +79 -20
  35. data/lib/redis_queued_locks/acquirer/locks.rb +212 -83
  36. data/lib/redis_queued_locks/acquirer/queue_info.rb +11 -18
  37. data/lib/redis_queued_locks/acquirer/queues.rb +123 -50
  38. data/lib/redis_queued_locks/acquirer/reindex_locks.rb +253 -0
  39. data/lib/redis_queued_locks/acquirer/release_all_locks.rb +177 -61
  40. data/lib/redis_queued_locks/acquirer/release_lock.rb +84 -25
  41. data/lib/redis_queued_locks/acquirer/release_locks_of.rb +274 -70
  42. data/lib/redis_queued_locks/acquirer/release_read_lock.rb +22 -3
  43. data/lib/redis_queued_locks/acquirer.rb +1 -0
  44. data/lib/redis_queued_locks/client.rb +164 -36
  45. data/lib/redis_queued_locks/config.rb +16 -13
  46. data/lib/redis_queued_locks/errors.rb +34 -4
  47. data/lib/redis_queued_locks/instrument/sampler.rb +4 -7
  48. data/lib/redis_queued_locks/logging/sampler.rb +4 -8
  49. data/lib/redis_queued_locks/resource.rb +113 -6
  50. data/lib/redis_queued_locks/swarm/flush_zombies.rb +333 -61
  51. data/lib/redis_queued_locks/swarm/redis_client_builder.rb +8 -4
  52. data/lib/redis_queued_locks/swarm/swarm_element/threaded.rb +3 -2
  53. data/lib/redis_queued_locks/swarm/zombie_info.rb +203 -53
  54. data/lib/redis_queued_locks/swarm.rb +97 -5
  55. data/lib/redis_queued_locks/utilities.rb +1 -1
  56. data/lib/redis_queued_locks/version.rb +2 -2
  57. data/sig/redis_queued_locks/acquirer/acquire_lock/instr_visitor.rbs +14 -0
  58. data/sig/redis_queued_locks/acquirer/acquire_lock/log_visitor.rbs +13 -0
  59. data/sig/redis_queued_locks/acquirer/acquire_lock/try_to_lock.rbs +107 -1
  60. data/sig/redis_queued_locks/acquirer/acquire_lock/yield_expire.rbs +3 -3
  61. data/sig/redis_queued_locks/acquirer/acquire_lock.rbs +3 -1
  62. data/sig/redis_queued_locks/acquirer/clear_dead_requests.rbs +19 -1
  63. data/sig/redis_queued_locks/acquirer/extend_lock_ttl.rbs +20 -4
  64. data/sig/redis_queued_locks/acquirer/keys.rbs +11 -1
  65. data/sig/redis_queued_locks/acquirer/locks.rbs +15 -6
  66. data/sig/redis_queued_locks/acquirer/queues.rbs +9 -2
  67. data/sig/redis_queued_locks/acquirer/reindex_locks.rbs +52 -0
  68. data/sig/redis_queued_locks/acquirer/release_all_locks.rbs +8 -1
  69. data/sig/redis_queued_locks/acquirer/release_lock.rbs +6 -3
  70. data/sig/redis_queued_locks/acquirer/release_locks_of.rbs +20 -1
  71. data/sig/redis_queued_locks/acquirer/release_read_lock.rbs +1 -1
  72. data/sig/redis_queued_locks/client.rbs +21 -2
  73. data/sig/redis_queued_locks/errors.rbs +5 -2
  74. data/sig/redis_queued_locks/instrument/sampler.rbs +0 -2
  75. data/sig/redis_queued_locks/logging/sampler.rbs +0 -2
  76. data/sig/redis_queued_locks/resource.rbs +7 -1
  77. data/sig/redis_queued_locks/swarm/flush_zombies.rbs +51 -1
  78. data/sig/redis_queued_locks/swarm/zombie_info.rbs +58 -7
  79. data/sig/vendor/redis_client.rbs +2 -0
  80. metadata +6 -1
@@ -2,6 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 1.7.0
5
+ # @version 1.18.0
5
6
  module RedisQueuedLocks::Acquirer::AcquireLock::DequeueFromLockQueue::LogVisitor
6
7
  class << self
7
8
  # @param logger [::Logger,#debug]
@@ -2,7 +2,10 @@
2
2
 
3
3
  # @api private
4
4
  # @since 1.7.0
5
+ # @version 1.21.0
6
+ # rubocop:disable Metrics/ModuleLength
5
7
  module RedisQueuedLocks::Acquirer::AcquireLock::InstrVisitor
8
+ # rubocop:disable Metrics/ClassLength
6
9
  class << self
7
10
  # @param instrumenter [#notify]
8
11
  # @param instr_sampled [Boolean]
@@ -172,5 +175,44 @@ module RedisQueuedLocks::Acquirer::AcquireLock::InstrVisitor
172
175
  hold_time:, ttl:, acq_id:, hst_id:, ts:, lock_key:, rw_mode:, acq_time:, instrument:
173
176
  }) rescue nil
174
177
  end
178
+
179
+ # The lock is not obtained (the failure result of `#lock`/`#lock!`: the timeout, the retry
180
+ # limit, `fail_fast`, the dead lock or the lock upgrade conflict).
181
+ #
182
+ # @param instrumenter [#notify]
183
+ # @param instr_sampled [Boolean]
184
+ # @param lock_key [String]
185
+ # @param rw_mode [Symbol]
186
+ # @param ttl [Integer]
187
+ # @param acq_id [String]
188
+ # @param hst_id [String]
189
+ # @param ts [Numeric]
190
+ # @param acq_time [Numeric]
191
+ # @param result [Symbol] The failure result (`:timeout_reached`, `:retry_limit_reached`, ...).
192
+ # @param instrument [NilClass,Any]
193
+ # @return [void]
194
+ #
195
+ # @api private
196
+ # @since 1.21.0
197
+ def lock_obtaining_failed(
198
+ instrumenter,
199
+ instr_sampled,
200
+ lock_key,
201
+ rw_mode,
202
+ ttl,
203
+ acq_id,
204
+ hst_id,
205
+ ts,
206
+ acq_time,
207
+ result,
208
+ instrument
209
+ )
210
+ return unless instr_sampled
211
+ instrumenter.notify('redis_queued_locks.lock_obtaining_failed', {
212
+ lock_key:, rw_mode:, ttl:, acq_id:, hst_id:, ts:, acq_time:, result:, instrument:
213
+ }) rescue nil
214
+ end
175
215
  end
216
+ # rubocop:enable Metrics/ClassLength
176
217
  end
218
+ # rubocop:enable Metrics/ModuleLength
@@ -2,6 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 1.7.0
5
+ # @version 1.21.0
5
6
  # rubocop:disable Metrics/ModuleLength
6
7
  module RedisQueuedLocks::Acquirer::AcquireLock::LogVisitor
7
8
  # rubocop:disable Metrics/ClassLength
@@ -230,6 +231,50 @@ module RedisQueuedLocks::Acquirer::AcquireLock::LogVisitor
230
231
  "acq_time => #{acq_time} (ms)"
231
232
  end rescue nil
232
233
  end
234
+
235
+ # The lock is not obtained (the failure result of `#lock`/`#lock!`: the timeout, the retry
236
+ # limit, `fail_fast`, the dead lock or the lock upgrade conflict).
237
+ #
238
+ # @param logger [::Logger,#debug]
239
+ # @param log_sampled [Boolean]
240
+ # @param lock_key [String]
241
+ # @param queue_ttl [Integer]
242
+ # @param acquirer_id [String]
243
+ # @param host_id [String]
244
+ # @param acq_time [Numeric]
245
+ # @param access_strategy [Symbol]
246
+ # @param rw_mode [Symbol]
247
+ # @param result [Symbol] The failure result (`:timeout_reached`, `:retry_limit_reached`, ...).
248
+ # @return [void]
249
+ #
250
+ # @api private
251
+ # @since 1.21.0
252
+ def lock_obtaining_failed(
253
+ logger,
254
+ log_sampled,
255
+ lock_key,
256
+ queue_ttl,
257
+ acquirer_id,
258
+ host_id,
259
+ acq_time,
260
+ access_strategy,
261
+ rw_mode,
262
+ result
263
+ )
264
+ return unless log_sampled
265
+
266
+ logger.debug do
267
+ "[redis_queued_locks.lock_obtaining_failed] " \
268
+ "lock_key => '#{lock_key}' " \
269
+ "queue_ttl => #{queue_ttl} " \
270
+ "acq_id => '#{acquirer_id}' " \
271
+ "hst_id => '#{host_id}' " \
272
+ "acs_strat => '#{access_strategy}' " \
273
+ "rw_mode => '#{rw_mode}' " \
274
+ "acq_time => #{acq_time} (ms) " \
275
+ "result => '#{result}'"
276
+ end rescue nil
277
+ end
233
278
  end
234
279
  # rubocop:enable Metrics/ClassLength
235
280
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 1.7.0
5
+ # @version 1.18.0
5
6
  # rubocop:disable Metrics/ModuleLength
6
7
  module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
7
8
  # rubocop:disable Metrics/ClassLength