redis_queued_locks 1.17.0 → 1.18.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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/project-overview.md +86 -10
  3. data/.claude/rules/acquirer.md +31 -11
  4. data/.claude/rules/arguments.md +2 -1
  5. data/.claude/rules/git.md +46 -0
  6. data/.claude/rules/logic.md +9 -3
  7. data/.claude/rules/swarm.md +4 -3
  8. data/.claude/rules/tests.md +9 -3
  9. data/.claude/rules/type-checking.md +10 -2
  10. data/.claude/rules/visitors.md +12 -7
  11. data/CHANGELOG.md +62 -0
  12. data/CLAUDE.md +7 -2
  13. data/README.md +348 -79
  14. data/lib/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue/log_visitor.rb +6 -3
  15. data/lib/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue.rb +9 -7
  16. data/lib/redis_queued_locks/acquirer/acquire_lock/instr_visitor.rb +20 -10
  17. data/lib/redis_queued_locks/acquirer/acquire_lock/log_visitor.rb +34 -16
  18. data/lib/redis_queued_locks/acquirer/acquire_lock/try_to_lock/log_visitor.rb +240 -28
  19. data/lib/redis_queued_locks/acquirer/acquire_lock/try_to_lock.rb +398 -129
  20. data/lib/redis_queued_locks/acquirer/acquire_lock/yield_expire/log_visitor.rb +12 -6
  21. data/lib/redis_queued_locks/acquirer/acquire_lock/yield_expire.rb +32 -8
  22. data/lib/redis_queued_locks/acquirer/acquire_lock.rb +73 -20
  23. data/lib/redis_queued_locks/acquirer/clear_dead_requests.rb +9 -1
  24. data/lib/redis_queued_locks/acquirer/extend_lock_ttl.rb +182 -3
  25. data/lib/redis_queued_locks/acquirer/is_locked.rb +19 -2
  26. data/lib/redis_queued_locks/acquirer/is_queued.rb +6 -2
  27. data/lib/redis_queued_locks/acquirer/lock_info.rb +96 -6
  28. data/lib/redis_queued_locks/acquirer/lock_series_poc/instr_visitor.rb +8 -2
  29. data/lib/redis_queued_locks/acquirer/lock_series_poc/log_visitor.rb +18 -6
  30. data/lib/redis_queued_locks/acquirer/lock_series_poc.rb +126 -27
  31. data/lib/redis_queued_locks/acquirer/locks.rb +103 -6
  32. data/lib/redis_queued_locks/acquirer/queue_info.rb +38 -9
  33. data/lib/redis_queued_locks/acquirer/queues.rb +28 -4
  34. data/lib/redis_queued_locks/acquirer/release_all_locks.rb +35 -1
  35. data/lib/redis_queued_locks/acquirer/release_lock.rb +40 -9
  36. data/lib/redis_queued_locks/acquirer/release_locks_of.rb +43 -3
  37. data/lib/redis_queued_locks/acquirer/release_read_lock.rb +143 -0
  38. data/lib/redis_queued_locks/acquirer.rb +1 -0
  39. data/lib/redis_queued_locks/client.rb +129 -14
  40. data/lib/redis_queued_locks/resource.rb +117 -9
  41. data/lib/redis_queued_locks/swarm/flush_zombies.rb +38 -0
  42. data/lib/redis_queued_locks/swarm/zombie_info.rb +42 -0
  43. data/lib/redis_queued_locks/version.rb +1 -1
  44. data/rbs_collection.lock.yaml +10 -2
  45. data/rbs_collection.yaml +0 -2
  46. data/sig/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue/log_visitor.rbs +2 -1
  47. data/sig/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue.rbs +0 -1
  48. data/sig/redis_queued_locks/acquirer/acquire_lock/instr_visitor.rbs +5 -0
  49. data/sig/redis_queued_locks/acquirer/acquire_lock/log_visitor.rbs +12 -6
  50. data/sig/redis_queued_locks/acquirer/acquire_lock/try_to_lock/log_visitor.rbs +74 -7
  51. data/sig/redis_queued_locks/acquirer/acquire_lock/try_to_lock.rbs +4 -2
  52. data/sig/redis_queued_locks/acquirer/acquire_lock/yield_expire.rbs +3 -0
  53. data/sig/redis_queued_locks/acquirer/acquire_lock/yield_with_expire/log_visitor.rbs +4 -2
  54. data/sig/redis_queued_locks/acquirer/extend_lock_ttl.rbs +19 -1
  55. data/sig/redis_queued_locks/acquirer/lock_info.rbs +9 -1
  56. data/sig/redis_queued_locks/acquirer/locks.rbs +10 -1
  57. data/sig/redis_queued_locks/acquirer/queue_info.rbs +2 -4
  58. data/sig/redis_queued_locks/acquirer/queues.rbs +1 -1
  59. data/sig/redis_queued_locks/acquirer/release_lock.rbs +8 -1
  60. data/sig/redis_queued_locks/acquirer/release_read_lock.rbs +44 -0
  61. data/sig/redis_queued_locks/client.rbs +22 -2
  62. data/sig/redis_queued_locks/resource.rbs +9 -2
  63. data/sig/redis_queued_locks/swarm/zombie_info.rbs +5 -0
  64. metadata +4 -1
@@ -14,11 +14,12 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
14
14
  # @param acquirer_id [String]
15
15
  # @param host_id [String]
16
16
  # @param access_strategy [Symbol]
17
+ # @param rw_mode [Symbol]
17
18
  # @return [void]
18
19
  #
19
20
  # @api private
20
21
  # @since 1.7.0
21
- # @version 1.9.0
22
+ # @version 1.18.0
22
23
  def start(
23
24
  logger,
24
25
  log_sampled,
@@ -27,7 +28,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
27
28
  queue_ttl,
28
29
  acquirer_id,
29
30
  host_id,
30
- access_strategy
31
+ access_strategy,
32
+ rw_mode
31
33
  )
32
34
  return unless log_sampled && log_lock_try
33
35
 
@@ -37,7 +39,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
37
39
  "queue_ttl => #{queue_ttl} " \
38
40
  "acq_id => '#{acquirer_id}' " \
39
41
  "hst_id => '#{host_id}' " \
40
- "acs_strat => '#{access_strategy}'"
42
+ "acs_strat => '#{access_strategy}' " \
43
+ "rw_mode => '#{rw_mode}'"
41
44
  end rescue nil
42
45
  end
43
46
 
@@ -49,11 +52,12 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
49
52
  # @param acquirer_id [String]
50
53
  # @param host_id [String]
51
54
  # @param access_strategy [Symbol]
55
+ # @param rw_mode [Symbol]
52
56
  # @return [void]
53
57
  #
54
58
  # @api private
55
59
  # @since 1.7.0
56
- # @version 1.9.0
60
+ # @version 1.18.0
57
61
  def rconn_fetched(
58
62
  logger,
59
63
  log_sampled,
@@ -62,7 +66,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
62
66
  queue_ttl,
63
67
  acquirer_id,
64
68
  host_id,
65
- access_strategy
69
+ access_strategy,
70
+ rw_mode
66
71
  )
67
72
  return unless log_sampled && log_lock_try
68
73
 
@@ -72,7 +77,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
72
77
  "queue_ttl => #{queue_ttl} " \
73
78
  "acq_id => '#{acquirer_id}' " \
74
79
  "hst_id => '#{host_id}' " \
75
- "acs_strat => '#{access_strategy}'"
80
+ "acs_strat => '#{access_strategy}' " \
81
+ "rw_mode => '#{rw_mode}'"
76
82
  end rescue nil
77
83
  end
78
84
 
@@ -84,11 +90,12 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
84
90
  # @param acquirer_id [String]
85
91
  # @param host_id [String]
86
92
  # @param access_strategy [Symbol]
93
+ # @param rw_mode [Symbol]
87
94
  # @return [void]
88
95
  #
89
96
  # @api private
90
97
  # @since 1.7.0
91
- # @version 1.9.0
98
+ # @version 1.18.0
92
99
  def same_process_conflict_detected(
93
100
  logger,
94
101
  log_sampled,
@@ -97,7 +104,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
97
104
  queue_ttl,
98
105
  acquirer_id,
99
106
  host_id,
100
- access_strategy
107
+ access_strategy,
108
+ rw_mode
101
109
  )
102
110
  return unless log_sampled && log_lock_try
103
111
 
@@ -107,7 +115,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
107
115
  "queue_ttl => #{queue_ttl} " \
108
116
  "acq_id => '#{acquirer_id}' " \
109
117
  "hst_id => '#{host_id}' " \
110
- "acs_strat => '#{access_strategy}'"
118
+ "acs_strat => '#{access_strategy}' " \
119
+ "rw_mode => '#{rw_mode}'"
111
120
  end rescue nil
112
121
  end
113
122
 
@@ -119,12 +128,13 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
119
128
  # @param acquirer_id [String]
120
129
  # @param host_id [String]
121
130
  # @param access_strategy [Symbol]
131
+ # @param rw_mode [Symbol]
122
132
  # @param sp_conflict_status [Symbol]
123
133
  # @return [void]
124
134
  #
125
135
  # @api private
126
136
  # @since 1.7.0
127
- # @version 1.9.0
137
+ # @version 1.18.0
128
138
  def same_process_conflict_analyzed(
129
139
  logger,
130
140
  log_sampled,
@@ -134,6 +144,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
134
144
  acquirer_id,
135
145
  host_id,
136
146
  access_strategy,
147
+ rw_mode,
137
148
  sp_conflict_status
138
149
  )
139
150
  return unless log_sampled && log_lock_try
@@ -145,6 +156,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
145
156
  "acq_id => '#{acquirer_id}' " \
146
157
  "hst_id => '#{host_id}' " \
147
158
  "acs_strat => '#{access_strategy}' " \
159
+ "rw_mode => '#{rw_mode}' " \
148
160
  "spc_status => '#{sp_conflict_status}'"
149
161
  end rescue nil
150
162
  end
@@ -157,6 +169,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
157
169
  # @param acquirer_id [String]
158
170
  # @param host_id [String]
159
171
  # @param access_strategy [Symbol]
172
+ # @param rw_mode [Symbol]
160
173
  # @param sp_conflict_status [Symbol]
161
174
  # @param ttl [Integer]
162
175
  # @param spc_processed_timestamp [Float]
@@ -164,7 +177,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
164
177
  #
165
178
  # @api private
166
179
  # @since 1.7.0
167
- # @version 1.9.0
180
+ # @version 1.18.0
168
181
  def reentrant_lock__extend_and_work_through(
169
182
  logger,
170
183
  log_sampled,
@@ -174,6 +187,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
174
187
  acquirer_id,
175
188
  host_id,
176
189
  access_strategy,
190
+ rw_mode,
177
191
  sp_conflict_status,
178
192
  ttl,
179
193
  spc_processed_timestamp
@@ -187,6 +201,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
187
201
  "acq_id => '#{acquirer_id}' " \
188
202
  "hst_id => '#{host_id}' " \
189
203
  "acs_strat => '#{access_strategy}' " \
204
+ "rw_mode => '#{rw_mode}' " \
190
205
  "spc_status => '#{sp_conflict_status}' " \
191
206
  "last_ext_ttl => #{ttl} " \
192
207
  "last_ext_ts => '#{spc_processed_timestamp}'"
@@ -201,13 +216,14 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
201
216
  # @param acquirer_id [String]
202
217
  # @param host_id [String]
203
218
  # @param access_strategy [Symbol]
219
+ # @param rw_mode [Symbol]
204
220
  # @param sp_conflict_status [Symbol]
205
221
  # @param spc_processed_timestamp [Float]
206
222
  # @return [void]
207
223
  #
208
224
  # @api private
209
225
  # @since 1.7.0
210
- # @version 1.9.0
226
+ # @version 1.18.0
211
227
  def reentrant_lock__work_through(
212
228
  logger,
213
229
  log_sampled,
@@ -217,6 +233,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
217
233
  acquirer_id,
218
234
  host_id,
219
235
  access_strategy,
236
+ rw_mode,
220
237
  sp_conflict_status,
221
238
  spc_processed_timestamp
222
239
  )
@@ -229,6 +246,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
229
246
  "acq_id => '#{acquirer_id}' " \
230
247
  "hst_id => '#{host_id}' " \
231
248
  "acs_strat => '#{access_strategy}' " \
249
+ "rw_mode => '#{rw_mode}' " \
232
250
  "spc_status => '#{sp_conflict_status}' " \
233
251
  "last_spc_ts => '#{spc_processed_timestamp}'"
234
252
  end rescue nil
@@ -242,13 +260,14 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
242
260
  # @param acquirer_id [String]
243
261
  # @param host_id [String]
244
262
  # @param access_strategy [Symbol]
263
+ # @param rw_mode [Symbol]
245
264
  # @param sp_conflict_status [Symbol]
246
265
  # @param spc_processed_timestamp [Float]
247
266
  # @return [void]
248
267
  #
249
268
  # @api private
250
269
  # @since 1.7.0
251
- # @version 1.9.0
270
+ # @version 1.18.0
252
271
  def single_process_lock_conflict__dead_lock(
253
272
  logger,
254
273
  log_sampled,
@@ -258,6 +277,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
258
277
  acquirer_id,
259
278
  host_id,
260
279
  access_strategy,
280
+ rw_mode,
261
281
  sp_conflict_status,
262
282
  spc_processed_timestamp
263
283
  )
@@ -270,6 +290,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
270
290
  "acq_id => '#{acquirer_id}' " \
271
291
  "hst_id => '#{host_id}' " \
272
292
  "acs_strat => '#{access_strategy}' " \
293
+ "rw_mode => '#{rw_mode}' " \
273
294
  "spc_status => '#{sp_conflict_status}' " \
274
295
  "last_spc_ts => '#{spc_processed_timestamp}'"
275
296
  end rescue nil
@@ -283,11 +304,55 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
283
304
  # @param acquirer_id [String]
284
305
  # @param host_id [String]
285
306
  # @param access_strategy [Symbol]
307
+ # @param rw_mode [Symbol]
308
+ # @param sp_conflict_status [Symbol]
309
+ # @param spc_processed_timestamp [Float]
310
+ # @return [void]
311
+ #
312
+ # @api private
313
+ # @since 1.18.0
314
+ def single_process_lock_conflict__lock_upgrade(
315
+ logger,
316
+ log_sampled,
317
+ log_lock_try,
318
+ lock_key,
319
+ queue_ttl,
320
+ acquirer_id,
321
+ host_id,
322
+ access_strategy,
323
+ rw_mode,
324
+ sp_conflict_status,
325
+ spc_processed_timestamp
326
+ )
327
+ return unless log_sampled && log_lock_try
328
+
329
+ logger.debug do
330
+ "[redis_queued_locks.try_lock.single_process_lock_conflict__lock_upgrade] " \
331
+ "lock_key => '#{lock_key}' " \
332
+ "queue_ttl => #{queue_ttl} " \
333
+ "acq_id => '#{acquirer_id}' " \
334
+ "hst_id => '#{host_id}' " \
335
+ "acs_strat => '#{access_strategy}' " \
336
+ "rw_mode => '#{rw_mode}' " \
337
+ "spc_status => '#{sp_conflict_status}' " \
338
+ "last_spc_ts => '#{spc_processed_timestamp}'"
339
+ end rescue nil
340
+ end
341
+
342
+ # @param logger [::Logger,#debug]
343
+ # @param log_sampled [Boolean]
344
+ # @param log_lock_try [Boolean]
345
+ # @param lock_key [String]
346
+ # @param queue_ttl [Integer]
347
+ # @param acquirer_id [String]
348
+ # @param host_id [String]
349
+ # @param access_strategy [Symbol]
350
+ # @param rw_mode [Symbol]
286
351
  # @return [void]
287
352
  #
288
353
  # @api private
289
354
  # @since 1.7.0
290
- # @version 1.9.0
355
+ # @version 1.18.0
291
356
  def acq_added_to_queue(
292
357
  logger,
293
358
  log_sampled,
@@ -296,7 +361,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
296
361
  queue_ttl,
297
362
  acquirer_id,
298
363
  host_id,
299
- access_strategy
364
+ access_strategy,
365
+ rw_mode
300
366
  )
301
367
  return unless log_sampled && log_lock_try
302
368
 
@@ -306,7 +372,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
306
372
  "queue_ttl => #{queue_ttl} " \
307
373
  "acq_id => '#{acquirer_id}' " \
308
374
  "hst_id => '#{host_id}' " \
309
- "acs_strat => '#{access_strategy}'"
375
+ "acs_strat => '#{access_strategy}' " \
376
+ "rw_mode => '#{rw_mode}'"
310
377
  end rescue nil
311
378
  end
312
379
 
@@ -318,11 +385,12 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
318
385
  # @param acquirer_id [String]
319
386
  # @param host_id [String]
320
387
  # @param access_strategy [Symbol]
388
+ # @param rw_mode [Symbol]
321
389
  # @return [void]
322
390
  #
323
391
  # @api private
324
392
  # @since 1.7.0
325
- # @version 1.9.0
393
+ # @version 1.18.0
326
394
  def remove_expired_acqs(
327
395
  logger,
328
396
  log_sampled,
@@ -331,7 +399,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
331
399
  queue_ttl,
332
400
  acquirer_id,
333
401
  host_id,
334
- access_strategy
402
+ access_strategy,
403
+ rw_mode
335
404
  )
336
405
  return unless log_sampled && log_lock_try
337
406
 
@@ -341,7 +410,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
341
410
  "queue_ttl => #{queue_ttl} " \
342
411
  "acq_id => '#{acquirer_id}' " \
343
412
  "hst_id => '#{host_id}' " \
344
- "acs_strat => '#{access_strategy}'"
413
+ "acs_strat => '#{access_strategy}' " \
414
+ "rw_mode => '#{rw_mode}'"
345
415
  end rescue nil
346
416
  end
347
417
 
@@ -353,12 +423,13 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
353
423
  # @param acquirer_id [String]
354
424
  # @param host_id [String]
355
425
  # @param access_strategy [Symbol]
426
+ # @param rw_mode [Symbol]
356
427
  # @param waiting_acquirer [String,NilClass]
357
428
  # @return [void]
358
429
  #
359
430
  # @api private
360
431
  # @since 1.7.0
361
- # @version 1.9.0
432
+ # @version 1.18.0
362
433
  def get_first_from_queue(
363
434
  logger,
364
435
  log_sampled,
@@ -368,6 +439,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
368
439
  acquirer_id,
369
440
  host_id,
370
441
  access_strategy,
442
+ rw_mode,
371
443
  waiting_acquirer
372
444
  )
373
445
  return unless log_sampled && log_lock_try
@@ -379,6 +451,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
379
451
  "acq_id => '#{acquirer_id}' " \
380
452
  "hst_id => '#{host_id}' " \
381
453
  "acs_strat => '#{access_strategy}' " \
454
+ "rw_mode => '#{rw_mode}' " \
382
455
  "first_acq_id_in_queue => '#{waiting_acquirer}'"
383
456
  end rescue nil
384
457
  end
@@ -391,11 +464,12 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
391
464
  # @param acquirer_id [String]
392
465
  # @param host_id [String]
393
466
  # @param access_strategy [Symbol]
467
+ # @param rw_mode [Symbol]
394
468
  # @return [void]
395
469
  #
396
470
  # @api private
397
471
  # @since 1.7.0
398
- # @version 1.9.0
472
+ # @version 1.18.0
399
473
  def exit__queue_ttl_reached(
400
474
  logger,
401
475
  log_sampled,
@@ -404,7 +478,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
404
478
  queue_ttl,
405
479
  acquirer_id,
406
480
  host_id,
407
- access_strategy
481
+ access_strategy,
482
+ rw_mode
408
483
  )
409
484
  return unless log_sampled && log_lock_try
410
485
 
@@ -414,7 +489,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
414
489
  "queue_ttl => #{queue_ttl} " \
415
490
  "acq_id => '#{acquirer_id}' " \
416
491
  "hst_id => '#{host_id}' " \
417
- "acs_strat => '#{access_strategy}'"
492
+ "acs_strat => '#{access_strategy}' " \
493
+ "rw_mode => '#{rw_mode}'"
418
494
  end rescue nil
419
495
  end
420
496
 
@@ -426,13 +502,14 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
426
502
  # @param acquirer_id [String]
427
503
  # @param host_id [String]
428
504
  # @param access_strategy [Symbol]
505
+ # @param rw_mode [Symbol]
429
506
  # @param waiting_acquirer [String,NilClass]
430
507
  # @param current_lock_data [Hash<String,Any>]
431
508
  # @return [void]
432
509
  #
433
510
  # @api private
434
511
  # @since 1.7.0
435
- # @version 1.9.0
512
+ # @version 1.18.0
436
513
  def exit__no_first(
437
514
  logger,
438
515
  log_sampled,
@@ -442,6 +519,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
442
519
  acquirer_id,
443
520
  host_id,
444
521
  access_strategy,
522
+ rw_mode,
445
523
  waiting_acquirer,
446
524
  current_lock_data
447
525
  )
@@ -454,6 +532,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
454
532
  "acq_id => '#{acquirer_id}' " \
455
533
  "hst_id => '#{host_id}' " \
456
534
  "acs_strat => '#{access_strategy}' " \
535
+ "rw_mode => '#{rw_mode}' " \
457
536
  "first_acq_id_in_queue => '#{waiting_acquirer}' " \
458
537
  "<current_lock_data> => <<#{current_lock_data}>>"
459
538
  end rescue nil
@@ -467,6 +546,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
467
546
  # @param acquirer_id [String]
468
547
  # @param host_id [String]
469
548
  # @param access_strategy [Symbol]
549
+ # @param rw_mode [Symbol]
470
550
  # @param waiting_acquirer [String,NilClass]
471
551
  # @param locked_by_acquirer [String]
472
552
  # @param current_lock_data [Hash<String,Any>]
@@ -474,7 +554,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
474
554
  #
475
555
  # @api private
476
556
  # @since 1.7.0
477
- # @version 1.9.0
557
+ # @version 1.18.0
478
558
  def exit__lock_still_obtained(
479
559
  logger,
480
560
  log_sampled,
@@ -484,6 +564,7 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
484
564
  acquirer_id,
485
565
  host_id,
486
566
  access_strategy,
567
+ rw_mode,
487
568
  waiting_acquirer,
488
569
  locked_by_acquirer,
489
570
  current_lock_data
@@ -497,12 +578,57 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
497
578
  "acq_id => '#{acquirer_id}' " \
498
579
  "hst_id => '#{host_id}' " \
499
580
  "acs_strat => '#{access_strategy}' " \
581
+ "rw_mode => '#{rw_mode}' " \
500
582
  "first_acq_id_in_queue => '#{waiting_acquirer}' " \
501
583
  "locked_by_acq_id => '#{locked_by_acquirer}' " \
502
584
  "<current_lock_data> => <<#{current_lock_data}>>"
503
585
  end rescue nil
504
586
  end
505
587
 
588
+ # Read lock request is blocked by an earlier write lock request (FIFO between modes).
589
+ #
590
+ # @param logger [::Logger,#debug]
591
+ # @param log_sampled [Boolean]
592
+ # @param log_lock_try [Boolean]
593
+ # @param lock_key [String]
594
+ # @param queue_ttl [Integer]
595
+ # @param acquirer_id [String]
596
+ # @param host_id [String]
597
+ # @param access_strategy [Symbol]
598
+ # @param rw_mode [Symbol]
599
+ # @param ahead_acquirer [String]
600
+ # @return [void]
601
+ #
602
+ # @api private
603
+ # @since 1.18.0
604
+ def exit__write_request_ahead(
605
+ logger,
606
+ log_sampled,
607
+ log_lock_try,
608
+ lock_key,
609
+ queue_ttl,
610
+ acquirer_id,
611
+ host_id,
612
+ access_strategy,
613
+ rw_mode,
614
+ ahead_acquirer
615
+ )
616
+ return unless log_sampled && log_lock_try
617
+
618
+ logger.debug do
619
+ "[redis_queued_locks.try_lock.exit__write_request_ahead] " \
620
+ "lock_key => '#{lock_key}' " \
621
+ "queue_ttl => #{queue_ttl} " \
622
+ "acq_id => '#{acquirer_id}' " \
623
+ "hst_id => '#{host_id}' " \
624
+ "acs_strat => '#{access_strategy}' " \
625
+ "rw_mode => '#{rw_mode}' " \
626
+ "ahead_acq_id => '#{ahead_acquirer}'"
627
+ end rescue nil
628
+ end
629
+
630
+ # Write lock request is blocked by an earlier read lock request (FIFO between modes).
631
+ #
506
632
  # @param logger [::Logger,#debug]
507
633
  # @param log_sampled [Boolean]
508
634
  # @param log_lock_try [Boolean]
@@ -511,11 +637,95 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
511
637
  # @param acquirer_id [String]
512
638
  # @param host_id [String]
513
639
  # @param access_strategy [Symbol]
640
+ # @param rw_mode [Symbol]
641
+ # @param ahead_acquirer [String]
642
+ # @return [void]
643
+ #
644
+ # @api private
645
+ # @since 1.18.0
646
+ def exit__read_request_ahead(
647
+ logger,
648
+ log_sampled,
649
+ log_lock_try,
650
+ lock_key,
651
+ queue_ttl,
652
+ acquirer_id,
653
+ host_id,
654
+ access_strategy,
655
+ rw_mode,
656
+ ahead_acquirer
657
+ )
658
+ return unless log_sampled && log_lock_try
659
+
660
+ logger.debug do
661
+ "[redis_queued_locks.try_lock.exit__read_request_ahead] " \
662
+ "lock_key => '#{lock_key}' " \
663
+ "queue_ttl => #{queue_ttl} " \
664
+ "acq_id => '#{acquirer_id}' " \
665
+ "hst_id => '#{host_id}' " \
666
+ "acs_strat => '#{access_strategy}' " \
667
+ "rw_mode => '#{rw_mode}' " \
668
+ "ahead_acq_id => '#{ahead_acquirer}'"
669
+ end rescue nil
670
+ end
671
+
672
+ # The lock is still held by readers: write lock requests wait for all readers,
673
+ # read lock requests wait for their own (same acquirer) read lock (see `:wait_for_lock`).
674
+ #
675
+ # @param logger [::Logger,#debug]
676
+ # @param log_sampled [Boolean]
677
+ # @param log_lock_try [Boolean]
678
+ # @param lock_key [String]
679
+ # @param queue_ttl [Integer]
680
+ # @param acquirer_id [String]
681
+ # @param host_id [String]
682
+ # @param access_strategy [Symbol]
683
+ # @param rw_mode [Symbol]
684
+ # @param waiting_acquirer [String,NilClass]
685
+ # @return [void]
686
+ #
687
+ # @api private
688
+ # @since 1.18.0
689
+ def exit__read_lock_still_obtained(
690
+ logger,
691
+ log_sampled,
692
+ log_lock_try,
693
+ lock_key,
694
+ queue_ttl,
695
+ acquirer_id,
696
+ host_id,
697
+ access_strategy,
698
+ rw_mode,
699
+ waiting_acquirer
700
+ )
701
+ return unless log_sampled && log_lock_try
702
+
703
+ logger.debug do
704
+ "[redis_queued_locks.try_lock.exit__read_lock_still_obtained] " \
705
+ "lock_key => '#{lock_key}' " \
706
+ "queue_ttl => #{queue_ttl} " \
707
+ "acq_id => '#{acquirer_id}' " \
708
+ "hst_id => '#{host_id}' " \
709
+ "acs_strat => '#{access_strategy}' " \
710
+ "rw_mode => '#{rw_mode}' " \
711
+ "first_acq_id_in_queue => '#{waiting_acquirer}'"
712
+ end rescue nil
713
+ end
714
+
715
+ # @param logger [::Logger,#debug]
716
+ # @param log_sampled [Boolean]
717
+ # @param log_lock_try [Boolean]
718
+ # @param lock_key [String]
719
+ # @param queue_ttl [Integer]
720
+ # @param acquirer_id [String]
721
+ # @param host_id [String]
722
+ # @param access_strategy [Symbol]
723
+ # @param rw_mode [Symbol]
514
724
  # @return [void]
515
725
  #
516
726
  # @api private
517
727
  # @since 1.7.0
518
- # @version 1.9.0
728
+ # @version 1.18.0
519
729
  def obtain__free_to_acquire(
520
730
  logger,
521
731
  log_sampled,
@@ -524,7 +734,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
524
734
  queue_ttl,
525
735
  acquirer_id,
526
736
  host_id,
527
- access_strategy
737
+ access_strategy,
738
+ rw_mode
528
739
  )
529
740
  return unless log_sampled && log_lock_try
530
741
 
@@ -534,7 +745,8 @@ module RedisQueuedLocks::Acquirer::AcquireLock::TryToLock::LogVisitor
534
745
  "queue_ttl => #{queue_ttl} " \
535
746
  "acq_id => '#{acquirer_id}' " \
536
747
  "hst_id => '#{host_id}' " \
537
- "acs_strat => '#{access_strategy}'"
748
+ "acs_strat => '#{access_strategy}' " \
749
+ "rw_mode => '#{rw_mode}'"
538
750
  end rescue nil
539
751
  end
540
752
  end