redis_queued_locks 1.7.0 → 1.9.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +60 -1
  4. data/README.md +485 -46
  5. data/lib/redis_queued_locks/acquier/acquire_lock/dequeue_from_lock_queue/log_visitor.rb +4 -0
  6. data/lib/redis_queued_locks/acquier/acquire_lock/dequeue_from_lock_queue.rb +4 -1
  7. data/lib/redis_queued_locks/acquier/acquire_lock/instr_visitor.rb +20 -5
  8. data/lib/redis_queued_locks/acquier/acquire_lock/log_visitor.rb +24 -0
  9. data/lib/redis_queued_locks/acquier/acquire_lock/try_to_lock/log_visitor.rb +56 -0
  10. data/lib/redis_queued_locks/acquier/acquire_lock/try_to_lock.rb +37 -30
  11. data/lib/redis_queued_locks/acquier/acquire_lock/with_acq_timeout.rb +41 -7
  12. data/lib/redis_queued_locks/acquier/acquire_lock/yield_expire/log_visitor.rb +8 -0
  13. data/lib/redis_queued_locks/acquier/acquire_lock/yield_expire.rb +21 -9
  14. data/lib/redis_queued_locks/acquier/acquire_lock.rb +61 -22
  15. data/lib/redis_queued_locks/acquier/clear_dead_requests.rb +5 -1
  16. data/lib/redis_queued_locks/acquier/extend_lock_ttl.rb +5 -1
  17. data/lib/redis_queued_locks/acquier/lock_info.rb +4 -3
  18. data/lib/redis_queued_locks/acquier/locks.rb +2 -2
  19. data/lib/redis_queued_locks/acquier/queue_info.rb +2 -2
  20. data/lib/redis_queued_locks/acquier/release_all_locks.rb +12 -2
  21. data/lib/redis_queued_locks/acquier/release_lock.rb +12 -2
  22. data/lib/redis_queued_locks/client.rb +320 -10
  23. data/lib/redis_queued_locks/errors.rb +8 -0
  24. data/lib/redis_queued_locks/instrument.rb +8 -1
  25. data/lib/redis_queued_locks/logging.rb +8 -1
  26. data/lib/redis_queued_locks/resource.rb +59 -1
  27. data/lib/redis_queued_locks/swarm/acquirers.rb +44 -0
  28. data/lib/redis_queued_locks/swarm/flush_zombies.rb +133 -0
  29. data/lib/redis_queued_locks/swarm/probe_hosts.rb +69 -0
  30. data/lib/redis_queued_locks/swarm/redis_client_builder.rb +67 -0
  31. data/lib/redis_queued_locks/swarm/supervisor.rb +83 -0
  32. data/lib/redis_queued_locks/swarm/swarm_element/isolated.rb +287 -0
  33. data/lib/redis_queued_locks/swarm/swarm_element/threaded.rb +351 -0
  34. data/lib/redis_queued_locks/swarm/swarm_element.rb +8 -0
  35. data/lib/redis_queued_locks/swarm/zombie_info.rb +145 -0
  36. data/lib/redis_queued_locks/swarm.rb +241 -0
  37. data/lib/redis_queued_locks/utilities/lock.rb +22 -0
  38. data/lib/redis_queued_locks/utilities.rb +75 -0
  39. data/lib/redis_queued_locks/version.rb +2 -2
  40. data/lib/redis_queued_locks.rb +2 -0
  41. data/redis_queued_locks.gemspec +6 -10
  42. metadata +24 -6
  43. data/lib/redis_queued_locks/watcher.rb +0 -1
@@ -12,11 +12,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
12
12
  # @param lock_key [String]
13
13
  # @param queue_ttl [Integer]
14
14
  # @param acquier_id [String]
15
+ # @param host_id [String]
15
16
  # @param access_strategy [Symbol]
16
17
  # @return [void]
17
18
  #
18
19
  # @api private
19
20
  # @since 1.7.0
21
+ # @version 1.9.0
20
22
  def start(
21
23
  logger,
22
24
  log_sampled,
@@ -24,6 +26,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
24
26
  lock_key,
25
27
  queue_ttl,
26
28
  acquier_id,
29
+ host_id,
27
30
  access_strategy
28
31
  )
29
32
  return unless log_sampled && log_lock_try
@@ -33,6 +36,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
33
36
  "lock_key => '#{lock_key}' " \
34
37
  "queue_ttl => #{queue_ttl} " \
35
38
  "acq_id => '#{acquier_id}' " \
39
+ "hst_id => '#{host_id}' " \
36
40
  "acs_strat => '#{access_strategy}'"
37
41
  end rescue nil
38
42
  end
@@ -43,11 +47,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
43
47
  # @param lock_key [String]
44
48
  # @param queue_ttl [Integer]
45
49
  # @param acquier_id [String]
50
+ # @param host_id [String]
46
51
  # @param access_strategy [Symbol]
47
52
  # @return [void]
48
53
  #
49
54
  # @api private
50
55
  # @since 1.7.0
56
+ # @version 1.9.0
51
57
  def rconn_fetched(
52
58
  logger,
53
59
  log_sampled,
@@ -55,6 +61,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
55
61
  lock_key,
56
62
  queue_ttl,
57
63
  acquier_id,
64
+ host_id,
58
65
  access_strategy
59
66
  )
60
67
  return unless log_sampled && log_lock_try
@@ -64,6 +71,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
64
71
  "lock_key => '#{lock_key}' " \
65
72
  "queue_ttl => #{queue_ttl} " \
66
73
  "acq_id => '#{acquier_id}' " \
74
+ "hst_id => '#{host_id}' " \
67
75
  "acs_strat => '#{access_strategy}'"
68
76
  end rescue nil
69
77
  end
@@ -74,11 +82,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
74
82
  # @param lock_key [String]
75
83
  # @param queue_ttl [Integer]
76
84
  # @param acquier_id [String]
85
+ # @param host_id [String]
77
86
  # @param access_strategy [Symbol]
78
87
  # @return [void]
79
88
  #
80
89
  # @api private
81
90
  # @since 1.7.0
91
+ # @version 1.9.0
82
92
  def same_process_conflict_detected(
83
93
  logger,
84
94
  log_sampled,
@@ -86,6 +96,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
86
96
  lock_key,
87
97
  queue_ttl,
88
98
  acquier_id,
99
+ host_id,
89
100
  access_strategy
90
101
  )
91
102
  return unless log_sampled && log_lock_try
@@ -95,6 +106,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
95
106
  "lock_key => '#{lock_key}' " \
96
107
  "queue_ttl => #{queue_ttl} " \
97
108
  "acq_id => '#{acquier_id}' " \
109
+ "hst_id => '#{host_id}' " \
98
110
  "acs_strat => '#{access_strategy}'"
99
111
  end rescue nil
100
112
  end
@@ -105,12 +117,14 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
105
117
  # @param lock_key [String]
106
118
  # @param queue_ttl [Integer]
107
119
  # @param acquier_id [String]
120
+ # @param host_id [String]
108
121
  # @param access_strategy [Symbol]
109
122
  # @param sp_conflict_status [Symbol]
110
123
  # @return [void]
111
124
  #
112
125
  # @api private
113
126
  # @since 1.7.0
127
+ # @version 1.9.0
114
128
  def same_process_conflict_analyzed(
115
129
  logger,
116
130
  log_sampled,
@@ -118,6 +132,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
118
132
  lock_key,
119
133
  queue_ttl,
120
134
  acquier_id,
135
+ host_id,
121
136
  access_strategy,
122
137
  sp_conflict_status
123
138
  )
@@ -128,6 +143,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
128
143
  "lock_key => '#{lock_key}' " \
129
144
  "queue_ttl => #{queue_ttl} " \
130
145
  "acq_id => '#{acquier_id}' " \
146
+ "hst_id => '#{host_id}' " \
131
147
  "acs_strat => '#{access_strategy}' " \
132
148
  "spc_status => '#{sp_conflict_status}'"
133
149
  end rescue nil
@@ -139,6 +155,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
139
155
  # @param lock_key [String]
140
156
  # @param queue_ttl [Integer]
141
157
  # @param acquier_id [String]
158
+ # @param host_id [String]
142
159
  # @param access_strategy [Symbol]
143
160
  # @param sp_conflict_status [Symbol]
144
161
  # @param ttl [Integer]
@@ -147,6 +164,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
147
164
  #
148
165
  # @api private
149
166
  # @since 1.7.0
167
+ # @version 1.9.0
150
168
  def reentrant_lock__extend_and_work_through(
151
169
  logger,
152
170
  log_sampled,
@@ -154,6 +172,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
154
172
  lock_key,
155
173
  queue_ttl,
156
174
  acquier_id,
175
+ host_id,
157
176
  access_strategy,
158
177
  sp_conflict_status,
159
178
  ttl,
@@ -166,6 +185,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
166
185
  "lock_key => '#{lock_key}' " \
167
186
  "queue_ttl => #{queue_ttl} " \
168
187
  "acq_id => '#{acquier_id}' " \
188
+ "hst_id => '#{host_id}' " \
169
189
  "acs_strat => '#{access_strategy}' " \
170
190
  "spc_status => '#{sp_conflict_status}' " \
171
191
  "last_ext_ttl => #{ttl} " \
@@ -179,6 +199,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
179
199
  # @param lock_key [String]
180
200
  # @param queue_ttl [Integer]
181
201
  # @param acquier_id [String]
202
+ # @param host_id [String]
182
203
  # @param access_strategy [Symbol]
183
204
  # @param sp_conflict_status [Symbol]
184
205
  # @param spc_processed_timestamp [Float]
@@ -186,6 +207,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
186
207
  #
187
208
  # @api private
188
209
  # @since 1.7.0
210
+ # @version 1.9.0
189
211
  def reentrant_lock__work_through(
190
212
  logger,
191
213
  log_sampled,
@@ -193,6 +215,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
193
215
  lock_key,
194
216
  queue_ttl,
195
217
  acquier_id,
218
+ host_id,
196
219
  access_strategy,
197
220
  sp_conflict_status,
198
221
  spc_processed_timestamp
@@ -204,6 +227,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
204
227
  "lock_key => '#{lock_key}' " \
205
228
  "queue_ttl => #{queue_ttl} " \
206
229
  "acq_id => '#{acquier_id}' " \
230
+ "hst_id => '#{host_id}' " \
207
231
  "acs_strat => '#{access_strategy}' " \
208
232
  "spc_status => '#{sp_conflict_status}' " \
209
233
  "last_spc_ts => '#{spc_processed_timestamp}'"
@@ -216,6 +240,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
216
240
  # @param lock_key [String]
217
241
  # @param queue_ttl [Integer]
218
242
  # @param acquier_id [String]
243
+ # @param host_id [String]
219
244
  # @param access_strategy [Symbol]
220
245
  # @param sp_conflict_status [Symbol]
221
246
  # @param spc_processed_timestamp [Float]
@@ -223,6 +248,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
223
248
  #
224
249
  # @api private
225
250
  # @since 1.7.0
251
+ # @version 1.9.0
226
252
  def single_process_lock_conflict__dead_lock(
227
253
  logger,
228
254
  log_sampled,
@@ -230,6 +256,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
230
256
  lock_key,
231
257
  queue_ttl,
232
258
  acquier_id,
259
+ host_id,
233
260
  access_strategy,
234
261
  sp_conflict_status,
235
262
  spc_processed_timestamp
@@ -241,6 +268,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
241
268
  "lock_key => '#{lock_key}' " \
242
269
  "queue_ttl => #{queue_ttl} " \
243
270
  "acq_id => '#{acquier_id}' " \
271
+ "hst_id => '#{host_id}' " \
244
272
  "acs_strat => '#{access_strategy}' " \
245
273
  "spc_status => '#{sp_conflict_status}' " \
246
274
  "last_spc_ts => '#{spc_processed_timestamp}'"
@@ -253,11 +281,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
253
281
  # @param lock_key [String]
254
282
  # @param queue_ttl [Integer]
255
283
  # @param acquier_id [String]
284
+ # @param host_id [String]
256
285
  # @param access_strategy [Symbol]
257
286
  # @return [void]
258
287
  #
259
288
  # @api private
260
289
  # @since 1.7.0
290
+ # @version 1.9.0
261
291
  def acq_added_to_queue(
262
292
  logger,
263
293
  log_sampled,
@@ -265,6 +295,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
265
295
  lock_key,
266
296
  queue_ttl,
267
297
  acquier_id,
298
+ host_id,
268
299
  access_strategy
269
300
  )
270
301
  return unless log_sampled && log_lock_try
@@ -274,6 +305,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
274
305
  "lock_key => '#{lock_key}' " \
275
306
  "queue_ttl => #{queue_ttl} " \
276
307
  "acq_id => '#{acquier_id}' " \
308
+ "hst_id => '#{host_id}' " \
277
309
  "acs_strat => '#{access_strategy}'"
278
310
  end rescue nil
279
311
  end
@@ -284,11 +316,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
284
316
  # @param lock_key [String]
285
317
  # @param queue_ttl [Integer]
286
318
  # @param acquier_id [String]
319
+ # @param host_id [String]
287
320
  # @param access_strategy [Symbol]
288
321
  # @return [void]
289
322
  #
290
323
  # @api private
291
324
  # @since 1.7.0
325
+ # @version 1.9.0
292
326
  def remove_expired_acqs(
293
327
  logger,
294
328
  log_sampled,
@@ -296,6 +330,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
296
330
  lock_key,
297
331
  queue_ttl,
298
332
  acquier_id,
333
+ host_id,
299
334
  access_strategy
300
335
  )
301
336
  return unless log_sampled && log_lock_try
@@ -305,6 +340,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
305
340
  "lock_key => '#{lock_key}' " \
306
341
  "queue_ttl => #{queue_ttl} " \
307
342
  "acq_id => '#{acquier_id}' " \
343
+ "hst_id => '#{host_id}' " \
308
344
  "acs_strat => '#{access_strategy}'"
309
345
  end rescue nil
310
346
  end
@@ -315,12 +351,14 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
315
351
  # @param lock_key [String]
316
352
  # @param queue_ttl [Integer]
317
353
  # @param acquier_id [String]
354
+ # @param host_id [String]
318
355
  # @param access_strategy [Symbol]
319
356
  # @param waiting_acquier [String]
320
357
  # @return [void]
321
358
  #
322
359
  # @api private
323
360
  # @since 1.7.0
361
+ # @version 1.9.0
324
362
  def get_first_from_queue(
325
363
  logger,
326
364
  log_sampled,
@@ -328,6 +366,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
328
366
  lock_key,
329
367
  queue_ttl,
330
368
  acquier_id,
369
+ host_id,
331
370
  access_strategy,
332
371
  waiting_acquier
333
372
  )
@@ -338,6 +377,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
338
377
  "lock_key => '#{lock_key}' " \
339
378
  "queue_ttl => #{queue_ttl} " \
340
379
  "acq_id => '#{acquier_id}' " \
380
+ "hst_id => '#{host_id}' " \
341
381
  "acs_strat => '#{access_strategy}' " \
342
382
  "first_acq_id_in_queue => '#{waiting_acquier}'"
343
383
  end rescue nil
@@ -349,11 +389,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
349
389
  # @param lock_key [String]
350
390
  # @param queue_ttl [Integer]
351
391
  # @param acquier_id [String]
392
+ # @param host_id [String]
352
393
  # @param access_strategy [Symbol]
353
394
  # @return [void]
354
395
  #
355
396
  # @api private
356
397
  # @since 1.7.0
398
+ # @version 1.9.0
357
399
  def exit__queue_ttl_reached(
358
400
  logger,
359
401
  log_sampled,
@@ -361,6 +403,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
361
403
  lock_key,
362
404
  queue_ttl,
363
405
  acquier_id,
406
+ host_id,
364
407
  access_strategy
365
408
  )
366
409
  return unless log_sampled && log_lock_try
@@ -370,6 +413,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
370
413
  "lock_key => '#{lock_key}' " \
371
414
  "queue_ttl => #{queue_ttl} " \
372
415
  "acq_id => '#{acquier_id}' " \
416
+ "hst_id => '#{host_id}' " \
373
417
  "acs_strat => '#{access_strategy}'"
374
418
  end rescue nil
375
419
  end
@@ -380,6 +424,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
380
424
  # @param lock_key [String]
381
425
  # @param queue_ttl [Integer]
382
426
  # @param acquier_id [String]
427
+ # @param host_id [String]
383
428
  # @param access_strategy [Symbol]
384
429
  # @param waiting_acquier [String]
385
430
  # @param current_lock_data [Hash<String,Any>]
@@ -387,6 +432,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
387
432
  #
388
433
  # @api private
389
434
  # @since 1.7.0
435
+ # @version 1.9.0
390
436
  def exit__no_first(
391
437
  logger,
392
438
  log_sampled,
@@ -394,6 +440,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
394
440
  lock_key,
395
441
  queue_ttl,
396
442
  acquier_id,
443
+ host_id,
397
444
  access_strategy,
398
445
  waiting_acquier,
399
446
  current_lock_data
@@ -405,6 +452,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
405
452
  "lock_key => '#{lock_key}' " \
406
453
  "queue_ttl => #{queue_ttl} " \
407
454
  "acq_id => '#{acquier_id}' " \
455
+ "hst_id => '#{host_id}' " \
408
456
  "acs_strat => '#{access_strategy}' " \
409
457
  "first_acq_id_in_queue => '#{waiting_acquier}' " \
410
458
  "<current_lock_data> => <<#{current_lock_data}>>"
@@ -417,6 +465,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
417
465
  # @param lock_key [String]
418
466
  # @param queue_ttl [Integer]
419
467
  # @param acquier_id [String]
468
+ # @param host_id [String]
420
469
  # @param access_strategy [Symbol]
421
470
  # @param waiting_acquier [String]
422
471
  # @param locked_by_acquier [String]
@@ -425,6 +474,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
425
474
  #
426
475
  # @api private
427
476
  # @since 1.7.0
477
+ # @version 1.9.0
428
478
  def exit__lock_still_obtained(
429
479
  logger,
430
480
  log_sampled,
@@ -432,6 +482,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
432
482
  lock_key,
433
483
  queue_ttl,
434
484
  acquier_id,
485
+ host_id,
435
486
  access_strategy,
436
487
  waiting_acquier,
437
488
  locked_by_acquier,
@@ -444,6 +495,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
444
495
  "lock_key => '#{lock_key}' " \
445
496
  "queue_ttl => #{queue_ttl} " \
446
497
  "acq_id => '#{acquier_id}' " \
498
+ "hst_id => '#{host_id}' " \
447
499
  "acs_strat => '#{access_strategy}' " \
448
500
  "first_acq_id_in_queue => '#{waiting_acquier}' " \
449
501
  "locked_by_acq_id => '#{locked_by_acquier}' " \
@@ -457,11 +509,13 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
457
509
  # @param lock_key [String]
458
510
  # @param queue_ttl [Integer]
459
511
  # @param acquier_id [String]
512
+ # @param host_id [String]
460
513
  # @param access_strategy [Symbol]
461
514
  # @return [void]
462
515
  #
463
516
  # @api private
464
517
  # @since 1.7.0
518
+ # @version 1.9.0
465
519
  def obtain__free_to_acquire(
466
520
  logger,
467
521
  log_sampled,
@@ -469,6 +523,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
469
523
  lock_key,
470
524
  queue_ttl,
471
525
  acquier_id,
526
+ host_id,
472
527
  access_strategy
473
528
  )
474
529
  return unless log_sampled && log_lock_try
@@ -478,6 +533,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
478
533
  "lock_key => '#{lock_key}' " \
479
534
  "queue_ttl => #{queue_ttl} " \
480
535
  "acq_id => '#{acquier_id}' " \
536
+ "hst_id => '#{host_id}' " \
481
537
  "acs_strat => '#{access_strategy}'"
482
538
  end rescue nil
483
539
  end
@@ -22,6 +22,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
22
22
  # @param lock_key [String]
23
23
  # @param lock_key_queue [String]
24
24
  # @param acquier_id [String]
25
+ # @param host_id [String]
25
26
  # @param acquier_position [Numeric]
26
27
  # @param ttl [Integer]
27
28
  # @param queue_ttl [Integer]
@@ -35,7 +36,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
35
36
  #
36
37
  # @api private
37
38
  # @since 1.0.0
38
- # @version 1.7.0
39
+ # @version 1.9.0
39
40
  # rubocop:disable Metrics/MethodLength
40
41
  def try_to_lock(
41
42
  redis,
@@ -44,6 +45,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
44
45
  lock_key,
45
46
  lock_key_queue,
46
47
  acquier_id,
48
+ host_id,
47
49
  acquier_position,
48
50
  ttl,
49
51
  queue_ttl,
@@ -60,15 +62,15 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
60
62
  spc_processed_timestamp = nil
61
63
 
62
64
  LogVisitor.start(
63
- logger, log_sampled, log_lock_try,
64
- lock_key, queue_ttl, acquier_id, access_strategy
65
+ logger, log_sampled, log_lock_try, lock_key,
66
+ queue_ttl, acquier_id, host_id, access_strategy
65
67
  )
66
68
 
67
69
  # Step X: start to work with lock acquiring
68
70
  result = redis.with do |rconn|
69
71
  LogVisitor.rconn_fetched(
70
- logger, log_sampled, log_lock_try,
71
- lock_key, queue_ttl, acquier_id, access_strategy
72
+ logger, log_sampled, log_lock_try, lock_key,
73
+ queue_ttl, acquier_id, host_id, access_strategy
72
74
  )
73
75
 
74
76
  # Step 0:
@@ -83,8 +85,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
83
85
  # SP-Conflict Step X1: calculate the current deadlock status
84
86
  if current_lock_obtainer != nil && acquier_id == current_lock_obtainer
85
87
  LogVisitor.same_process_conflict_detected(
86
- logger, log_sampled, log_lock_try,
87
- lock_key, queue_ttl, acquier_id, access_strategy
88
+ logger, log_sampled, log_lock_try, lock_key,
89
+ queue_ttl, acquier_id, host_id, access_strategy
88
90
  )
89
91
 
90
92
  # SP-Conflict Step X2: self-process dead lock moment started.
@@ -113,8 +115,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
113
115
  # rubocop:enable Lint/DuplicateBranch
114
116
 
115
117
  LogVisitor.same_process_conflict_analyzed(
116
- logger, log_sampled, log_lock_try,
117
- lock_key, queue_ttl, acquier_id, access_strategy, sp_conflict_status
118
+ logger, log_sampled, log_lock_try, lock_key,
119
+ queue_ttl, acquier_id, host_id, access_strategy, sp_conflict_status
118
120
  )
119
121
  end
120
122
 
@@ -154,8 +156,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
154
156
  inter_result = :extendable_conflict_work_through
155
157
 
156
158
  LogVisitor.reentrant_lock__extend_and_work_through(
157
- logger, log_sampled, log_lock_try,
158
- lock_key, queue_ttl, acquier_id, access_strategy,
159
+ logger, log_sampled, log_lock_try, lock_key,
160
+ queue_ttl, acquier_id, host_id, access_strategy,
159
161
  sp_conflict_status, ttl, spc_processed_timestamp
160
162
  )
161
163
  # SP-Conflict-Step X2: switch to dead lock logic or not
@@ -179,8 +181,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
179
181
  )
180
182
 
181
183
  LogVisitor.reentrant_lock__work_through(
182
- logger, log_sampled, log_lock_try,
183
- lock_key, queue_ttl, acquier_id, access_strategy,
184
+ logger, log_sampled, log_lock_try, lock_key,
185
+ queue_ttl, acquier_id, host_id, access_strategy,
184
186
  sp_conflict_status, spc_processed_timestamp
185
187
  )
186
188
  # SP-Conflict-Step X2: switch to dead lock logic or not
@@ -189,8 +191,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
189
191
  spc_processed_timestamp = Time.now.to_f
190
192
 
191
193
  LogVisitor.single_process_lock_conflict__dead_lock(
192
- logger, log_sampled, log_lock_try,
193
- lock_key, queue_ttl, acquier_id, access_strategy,
194
+ logger, log_sampled, log_lock_try, lock_key,
195
+ queue_ttl, acquier_id, host_id, access_strategy,
194
196
  sp_conflict_status, spc_processed_timestamp
195
197
  )
196
198
  # Reached the SP-Non-Conflict Mode (NOTE):
@@ -204,8 +206,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
204
206
  rconn.call('ZADD', lock_key_queue, 'NX', acquier_position, acquier_id)
205
207
 
206
208
  LogVisitor.acq_added_to_queue(
207
- logger, log_sampled, log_lock_try,
208
- lock_key, queue_ttl, acquier_id, access_strategy
209
+ logger, log_sampled, log_lock_try, lock_key,
210
+ queue_ttl, acquier_id, host_id, access_strategy
209
211
  )
210
212
 
211
213
  # Step 2.1: drop expired acquiers from the lock queue
@@ -217,24 +219,24 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
217
219
  )
218
220
 
219
221
  LogVisitor.remove_expired_acqs(
220
- logger, log_sampled, log_lock_try,
221
- lock_key, queue_ttl, acquier_id, access_strategy
222
+ logger, log_sampled, log_lock_try, lock_key,
223
+ queue_ttl, acquier_id, host_id, access_strategy
222
224
  )
223
225
 
224
226
  # Step 3: get the actual acquier waiting in the queue
225
227
  waiting_acquier = Array(rconn.call('ZRANGE', lock_key_queue, '0', '0')).first
226
228
 
227
229
  LogVisitor.get_first_from_queue(
228
- logger, log_sampled, log_lock_try,
229
- lock_key, queue_ttl, acquier_id, access_strategy, waiting_acquier
230
+ logger, log_sampled, log_lock_try, lock_key,
231
+ queue_ttl, acquier_id, host_id, access_strategy, waiting_acquier
230
232
  )
231
233
 
232
234
  # Step PRE-4.x: check if the request time limit is reached
233
235
  # (when the current try self-removes itself from queue (queue ttl has come))
234
236
  if waiting_acquier == nil
235
237
  LogVisitor.exit__queue_ttl_reached(
236
- logger, log_sampled, log_lock_try,
237
- lock_key, queue_ttl, acquier_id, access_strategy
238
+ logger, log_sampled, log_lock_try, lock_key,
239
+ queue_ttl, acquier_id, host_id, access_strategy
238
240
  )
239
241
 
240
242
  inter_result = :dead_score_reached
@@ -243,8 +245,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
243
245
  elsif access_strategy == :queued && waiting_acquier != acquier_id
244
246
  # Step ROLLBACK 1.1: our time hasn't come yet. retry!
245
247
  LogVisitor.exit__no_first(
246
- logger, log_sampled, log_lock_try,
247
- lock_key, queue_ttl, acquier_id, access_strategy, waiting_acquier,
248
+ logger, log_sampled, log_lock_try, lock_key,
249
+ queue_ttl, acquier_id, host_id, access_strategy, waiting_acquier,
248
250
  rconn.call('HGETALL', lock_key).to_h
249
251
  )
250
252
  inter_result = :acquier_is_not_first_in_queue
@@ -260,8 +262,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
260
262
  # Step ROLLBACK 2: required lock is stil acquired. retry!
261
263
 
262
264
  LogVisitor.exit__lock_still_obtained(
263
- logger, log_sampled, log_lock_try,
264
- lock_key, queue_ttl, acquier_id, access_strategy,
265
+ logger, log_sampled, log_lock_try, lock_key,
266
+ queue_ttl, acquier_id, host_id, access_strategy,
265
267
  waiting_acquier, locked_by_acquier,
266
268
  rconn.call('HGETALL', lock_key).to_h
267
269
  )
@@ -272,11 +274,12 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
272
274
  # Step 6.1: remove our acquier from waiting queue
273
275
  transact.call('ZREM', lock_key_queue, acquier_id)
274
276
 
275
- # Step 6.2: acquire a lock and store an info about the acquier
277
+ # Step 6.2: acquire a lock and store an info about the acquier and host
276
278
  transact.call(
277
279
  'HSET',
278
280
  lock_key,
279
281
  'acq_id', acquier_id,
282
+ 'hst_id', host_id,
280
283
  'ts', (timestamp = Time.now.to_f),
281
284
  'ini_ttl', ttl,
282
285
  *(meta.to_a if meta != nil)
@@ -286,8 +289,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
286
289
  transact.call('PEXPIRE', lock_key, ttl) # NOTE: in milliseconds
287
290
 
288
291
  LogVisitor.obtain__free_to_acquire(
289
- logger, log_sampled, log_lock_try,
290
- lock_key, queue_ttl, acquier_id, access_strategy
292
+ logger, log_sampled, log_lock_try, lock_key,
293
+ queue_ttl, acquier_id, host_id, access_strategy
291
294
  )
292
295
  end
293
296
  end
@@ -317,6 +320,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
317
320
  process: :extendable_conflict_work_through,
318
321
  lock_key: lock_key,
319
322
  acq_id: acquier_id,
323
+ hst_id: host_id,
320
324
  ts: spc_processed_timestamp,
321
325
  ttl: ttl
322
326
  }]
@@ -327,6 +331,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
327
331
  process: :extendable_conflict_work_through,
328
332
  lock_key: lock_key,
329
333
  acq_id: acquier_id,
334
+ hst_id: host_id,
330
335
  ts: spc_processed_timestamp,
331
336
  ttl: ttl
332
337
  }]
@@ -348,6 +353,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
348
353
  process: :conflict_work_through,
349
354
  lock_key: lock_key,
350
355
  acq_id: acquier_id,
356
+ hst_id: host_id,
351
357
  ts: spc_processed_timestamp,
352
358
  ttl: ttl
353
359
  }]
@@ -381,6 +387,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
381
387
  process: :lock_obtaining,
382
388
  lock_key: lock_key,
383
389
  acq_id: acquier_id,
390
+ hst_id: host_id,
384
391
  ts: timestamp,
385
392
  ttl: ttl
386
393
  }]