redis_queued_locks 1.5.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,485 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 1.7.0
5
+ # rubocop:disable Metrics/ModuleLength
6
+ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock::LogVisitor
7
+ extend self
8
+
9
+ # @param logger [::Logger,#debug]
10
+ # @param log_sampled [Boolean]
11
+ # @param log_lock_try [Boolean]
12
+ # @param lock_key [String]
13
+ # @param queue_ttl [Integer]
14
+ # @param acquier_id [String]
15
+ # @param access_strategy [Symbol]
16
+ # @return [void]
17
+ #
18
+ # @api private
19
+ # @since 1.7.0
20
+ def start(
21
+ logger,
22
+ log_sampled,
23
+ log_lock_try,
24
+ lock_key,
25
+ queue_ttl,
26
+ acquier_id,
27
+ access_strategy
28
+ )
29
+ return unless log_sampled && log_lock_try
30
+
31
+ logger.debug do
32
+ "[redis_queued_locks.try_lock.start] " \
33
+ "lock_key => '#{lock_key}' " \
34
+ "queue_ttl => #{queue_ttl} " \
35
+ "acq_id => '#{acquier_id}' " \
36
+ "acs_strat => '#{access_strategy}'"
37
+ end rescue nil
38
+ end
39
+
40
+ # @param logger [::Logger,#debug]
41
+ # @param log_sampled [Boolean]
42
+ # @param log_lock_try [Boolean]
43
+ # @param lock_key [String]
44
+ # @param queue_ttl [Integer]
45
+ # @param acquier_id [String]
46
+ # @param access_strategy [Symbol]
47
+ # @return [void]
48
+ #
49
+ # @api private
50
+ # @since 1.7.0
51
+ def rconn_fetched(
52
+ logger,
53
+ log_sampled,
54
+ log_lock_try,
55
+ lock_key,
56
+ queue_ttl,
57
+ acquier_id,
58
+ access_strategy
59
+ )
60
+ return unless log_sampled && log_lock_try
61
+
62
+ logger.debug do
63
+ "[redis_queued_locks.try_lock.rconn_fetched] " \
64
+ "lock_key => '#{lock_key}' " \
65
+ "queue_ttl => #{queue_ttl} " \
66
+ "acq_id => '#{acquier_id}' " \
67
+ "acs_strat => '#{access_strategy}'"
68
+ end rescue nil
69
+ end
70
+
71
+ # @param logger [::Logger,#debug]
72
+ # @param log_sampled [Boolean]
73
+ # @param log_lock_try [Boolean]
74
+ # @param lock_key [String]
75
+ # @param queue_ttl [Integer]
76
+ # @param acquier_id [String]
77
+ # @param access_strategy [Symbol]
78
+ # @return [void]
79
+ #
80
+ # @api private
81
+ # @since 1.7.0
82
+ def same_process_conflict_detected(
83
+ logger,
84
+ log_sampled,
85
+ log_lock_try,
86
+ lock_key,
87
+ queue_ttl,
88
+ acquier_id,
89
+ access_strategy
90
+ )
91
+ return unless log_sampled && log_lock_try
92
+
93
+ logger.debug do
94
+ "[redis_queued_locks.try_lock.same_process_conflict_detected] " \
95
+ "lock_key => '#{lock_key}' " \
96
+ "queue_ttl => #{queue_ttl} " \
97
+ "acq_id => '#{acquier_id}' " \
98
+ "acs_strat => '#{access_strategy}'"
99
+ end rescue nil
100
+ end
101
+
102
+ # @param logger [::Logger,#debug]
103
+ # @param log_sampled [Boolean]
104
+ # @param log_lock_try [Boolean]
105
+ # @param lock_key [String]
106
+ # @param queue_ttl [Integer]
107
+ # @param acquier_id [String]
108
+ # @param access_strategy [Symbol]
109
+ # @param sp_conflict_status [Symbol]
110
+ # @return [void]
111
+ #
112
+ # @api private
113
+ # @since 1.7.0
114
+ def same_process_conflict_analyzed(
115
+ logger,
116
+ log_sampled,
117
+ log_lock_try,
118
+ lock_key,
119
+ queue_ttl,
120
+ acquier_id,
121
+ access_strategy,
122
+ sp_conflict_status
123
+ )
124
+ return unless log_sampled && log_lock_try
125
+
126
+ logger.debug do
127
+ "[redis_queued_locks.try_lock.same_process_conflict_analyzed] " \
128
+ "lock_key => '#{lock_key}' " \
129
+ "queue_ttl => #{queue_ttl} " \
130
+ "acq_id => '#{acquier_id}' " \
131
+ "acs_strat => '#{access_strategy}' " \
132
+ "spc_status => '#{sp_conflict_status}'"
133
+ end rescue nil
134
+ end
135
+
136
+ # @param logger [::Logger,#debug]
137
+ # @param log_sampled [Boolean]
138
+ # @param log_lock_try [Boolean]
139
+ # @param lock_key [String]
140
+ # @param queue_ttl [Integer]
141
+ # @param acquier_id [String]
142
+ # @param access_strategy [Symbol]
143
+ # @param sp_conflict_status [Symbol]
144
+ # @param ttl [Integer]
145
+ # @param spc_processed_timestamp [Float]
146
+ # @return [void]
147
+ #
148
+ # @api private
149
+ # @since 1.7.0
150
+ def reentrant_lock__extend_and_work_through(
151
+ logger,
152
+ log_sampled,
153
+ log_lock_try,
154
+ lock_key,
155
+ queue_ttl,
156
+ acquier_id,
157
+ access_strategy,
158
+ sp_conflict_status,
159
+ ttl,
160
+ spc_processed_timestamp
161
+ )
162
+ return unless log_sampled && log_lock_try
163
+
164
+ logger.debug do
165
+ "[redis_queued_locks.try_lock.reentrant_lock__extend_and_work_through] " \
166
+ "lock_key => '#{lock_key}' " \
167
+ "queue_ttl => #{queue_ttl} " \
168
+ "acq_id => '#{acquier_id}' " \
169
+ "acs_strat => '#{access_strategy}' " \
170
+ "spc_status => '#{sp_conflict_status}' " \
171
+ "last_ext_ttl => #{ttl} " \
172
+ "last_ext_ts => '#{spc_processed_timestamp}'"
173
+ end rescue nil
174
+ end
175
+
176
+ # @param logger [::Logger,#debug]
177
+ # @param log_sampled [Boolean]
178
+ # @param log_lock_try [Boolean]
179
+ # @param lock_key [String]
180
+ # @param queue_ttl [Integer]
181
+ # @param acquier_id [String]
182
+ # @param access_strategy [Symbol]
183
+ # @param sp_conflict_status [Symbol]
184
+ # @param spc_processed_timestamp [Float]
185
+ # @return [void]
186
+ #
187
+ # @api private
188
+ # @since 1.7.0
189
+ def reentrant_lock__work_through(
190
+ logger,
191
+ log_sampled,
192
+ log_lock_try,
193
+ lock_key,
194
+ queue_ttl,
195
+ acquier_id,
196
+ access_strategy,
197
+ sp_conflict_status,
198
+ spc_processed_timestamp
199
+ )
200
+ return unless log_sampled && log_lock_try
201
+
202
+ logger.debug do
203
+ "[redis_queued_locks.try_lock.reentrant_lock__work_through] " \
204
+ "lock_key => '#{lock_key}' " \
205
+ "queue_ttl => #{queue_ttl} " \
206
+ "acq_id => '#{acquier_id}' " \
207
+ "acs_strat => '#{access_strategy}' " \
208
+ "spc_status => '#{sp_conflict_status}' " \
209
+ "last_spc_ts => '#{spc_processed_timestamp}'"
210
+ end rescue nil
211
+ end
212
+
213
+ # @param logger [::Logger,#debug]
214
+ # @param log_sampled [Boolean]
215
+ # @param log_lock_try [Boolean]
216
+ # @param lock_key [String]
217
+ # @param queue_ttl [Integer]
218
+ # @param acquier_id [String]
219
+ # @param access_strategy [Symbol]
220
+ # @param sp_conflict_status [Symbol]
221
+ # @param spc_processed_timestamp [Float]
222
+ # @return [void]
223
+ #
224
+ # @api private
225
+ # @since 1.7.0
226
+ def single_process_lock_conflict__dead_lock(
227
+ logger,
228
+ log_sampled,
229
+ log_lock_try,
230
+ lock_key,
231
+ queue_ttl,
232
+ acquier_id,
233
+ access_strategy,
234
+ sp_conflict_status,
235
+ spc_processed_timestamp
236
+ )
237
+ return unless log_sampled && log_lock_try
238
+
239
+ logger.debug do
240
+ "[redis_queued_locks.try_lock.single_process_lock_conflict__dead_lock] " \
241
+ "lock_key => '#{lock_key}' " \
242
+ "queue_ttl => #{queue_ttl} " \
243
+ "acq_id => '#{acquier_id}' " \
244
+ "acs_strat => '#{access_strategy}' " \
245
+ "spc_status => '#{sp_conflict_status}' " \
246
+ "last_spc_ts => '#{spc_processed_timestamp}'"
247
+ end rescue nil
248
+ end
249
+
250
+ # @param logger [::Logger,#debug]
251
+ # @param log_sampled [Boolean]
252
+ # @param log_lock_try [Boolean]
253
+ # @param lock_key [String]
254
+ # @param queue_ttl [Integer]
255
+ # @param acquier_id [String]
256
+ # @param access_strategy [Symbol]
257
+ # @return [void]
258
+ #
259
+ # @api private
260
+ # @since 1.7.0
261
+ def acq_added_to_queue(
262
+ logger,
263
+ log_sampled,
264
+ log_lock_try,
265
+ lock_key,
266
+ queue_ttl,
267
+ acquier_id,
268
+ access_strategy
269
+ )
270
+ return unless log_sampled && log_lock_try
271
+
272
+ logger.debug do
273
+ "[redis_queued_locks.try_lock.acq_added_to_queue] " \
274
+ "lock_key => '#{lock_key}' " \
275
+ "queue_ttl => #{queue_ttl} " \
276
+ "acq_id => '#{acquier_id}' " \
277
+ "acs_strat => '#{access_strategy}'"
278
+ end rescue nil
279
+ end
280
+
281
+ # @param logger [::Logger,#debug]
282
+ # @param log_sampled [Boolean]
283
+ # @param log_lock_try [Boolean]
284
+ # @param lock_key [String]
285
+ # @param queue_ttl [Integer]
286
+ # @param acquier_id [String]
287
+ # @param access_strategy [Symbol]
288
+ # @return [void]
289
+ #
290
+ # @api private
291
+ # @since 1.7.0
292
+ def remove_expired_acqs(
293
+ logger,
294
+ log_sampled,
295
+ log_lock_try,
296
+ lock_key,
297
+ queue_ttl,
298
+ acquier_id,
299
+ access_strategy
300
+ )
301
+ return unless log_sampled && log_lock_try
302
+
303
+ logger.debug do
304
+ "[redis_queued_locks.try_lock.remove_expired_acqs] " \
305
+ "lock_key => '#{lock_key}' " \
306
+ "queue_ttl => #{queue_ttl} " \
307
+ "acq_id => '#{acquier_id}' " \
308
+ "acs_strat => '#{access_strategy}'"
309
+ end rescue nil
310
+ end
311
+
312
+ # @param logger [::Logger,#debug]
313
+ # @param log_sampled [Boolean]
314
+ # @param log_lock_try [Boolean]
315
+ # @param lock_key [String]
316
+ # @param queue_ttl [Integer]
317
+ # @param acquier_id [String]
318
+ # @param access_strategy [Symbol]
319
+ # @param waiting_acquier [String]
320
+ # @return [void]
321
+ #
322
+ # @api private
323
+ # @since 1.7.0
324
+ def get_first_from_queue(
325
+ logger,
326
+ log_sampled,
327
+ log_lock_try,
328
+ lock_key,
329
+ queue_ttl,
330
+ acquier_id,
331
+ access_strategy,
332
+ waiting_acquier
333
+ )
334
+ return unless log_sampled && log_lock_try
335
+
336
+ logger.debug do
337
+ "[redis_queued_locks.try_lock.get_first_from_queue] " \
338
+ "lock_key => '#{lock_key}' " \
339
+ "queue_ttl => #{queue_ttl} " \
340
+ "acq_id => '#{acquier_id}' " \
341
+ "acs_strat => '#{access_strategy}' " \
342
+ "first_acq_id_in_queue => '#{waiting_acquier}'"
343
+ end rescue nil
344
+ end
345
+
346
+ # @param logger [::Logger,#debug]
347
+ # @param log_sampled [Boolean]
348
+ # @param log_lock_try [Boolean]
349
+ # @param lock_key [String]
350
+ # @param queue_ttl [Integer]
351
+ # @param acquier_id [String]
352
+ # @param access_strategy [Symbol]
353
+ # @return [void]
354
+ #
355
+ # @api private
356
+ # @since 1.7.0
357
+ def exit__queue_ttl_reached(
358
+ logger,
359
+ log_sampled,
360
+ log_lock_try,
361
+ lock_key,
362
+ queue_ttl,
363
+ acquier_id,
364
+ access_strategy
365
+ )
366
+ return unless log_sampled && log_lock_try
367
+
368
+ logger.debug do
369
+ "[redis_queued_locks.try_lock.exit__queue_ttl_reached] " \
370
+ "lock_key => '#{lock_key}' " \
371
+ "queue_ttl => #{queue_ttl} " \
372
+ "acq_id => '#{acquier_id}' " \
373
+ "acs_strat => '#{access_strategy}'"
374
+ end rescue nil
375
+ end
376
+
377
+ # @param logger [::Logger,#debug]
378
+ # @param log_sampled [Boolean]
379
+ # @param log_lock_try [Boolean]
380
+ # @param lock_key [String]
381
+ # @param queue_ttl [Integer]
382
+ # @param acquier_id [String]
383
+ # @param access_strategy [Symbol]
384
+ # @param waiting_acquier [String]
385
+ # @param current_lock_data [Hash<String,Any>]
386
+ # @return [void]
387
+ #
388
+ # @api private
389
+ # @since 1.7.0
390
+ def exit__no_first(
391
+ logger,
392
+ log_sampled,
393
+ log_lock_try,
394
+ lock_key,
395
+ queue_ttl,
396
+ acquier_id,
397
+ access_strategy,
398
+ waiting_acquier,
399
+ current_lock_data
400
+ )
401
+ return unless log_sampled && log_lock_try
402
+
403
+ logger.debug do
404
+ "[redis_queued_locks.try_lock.exit__no_first] " \
405
+ "lock_key => '#{lock_key}' " \
406
+ "queue_ttl => #{queue_ttl} " \
407
+ "acq_id => '#{acquier_id}' " \
408
+ "acs_strat => '#{access_strategy}' " \
409
+ "first_acq_id_in_queue => '#{waiting_acquier}' " \
410
+ "<current_lock_data> => <<#{current_lock_data}>>"
411
+ end rescue nil
412
+ end
413
+
414
+ # @param logger [::Logger,#debug]
415
+ # @param log_sampled [Boolean]
416
+ # @param log_lock_try [Boolean]
417
+ # @param lock_key [String]
418
+ # @param queue_ttl [Integer]
419
+ # @param acquier_id [String]
420
+ # @param access_strategy [Symbol]
421
+ # @param waiting_acquier [String]
422
+ # @param locked_by_acquier [String]
423
+ # @param current_lock_data [Hash<String,Any>]
424
+ # @return [void]
425
+ #
426
+ # @api private
427
+ # @since 1.7.0
428
+ def exit__lock_still_obtained(
429
+ logger,
430
+ log_sampled,
431
+ log_lock_try,
432
+ lock_key,
433
+ queue_ttl,
434
+ acquier_id,
435
+ access_strategy,
436
+ waiting_acquier,
437
+ locked_by_acquier,
438
+ current_lock_data
439
+ )
440
+ return unless log_sampled && log_lock_try
441
+
442
+ logger.debug do
443
+ "[redis_queued_locks.try_lock.exit__lock_still_obtained] " \
444
+ "lock_key => '#{lock_key}' " \
445
+ "queue_ttl => #{queue_ttl} " \
446
+ "acq_id => '#{acquier_id}' " \
447
+ "acs_strat => '#{access_strategy}' " \
448
+ "first_acq_id_in_queue => '#{waiting_acquier}' " \
449
+ "locked_by_acq_id => '#{locked_by_acquier}' " \
450
+ "<current_lock_data> => <<#{current_lock_data}>>"
451
+ end rescue nil
452
+ end
453
+
454
+ # @param logger [::Logger,#debug]
455
+ # @param log_sampled [Boolean]
456
+ # @param log_lock_try [Boolean]
457
+ # @param lock_key [String]
458
+ # @param queue_ttl [Integer]
459
+ # @param acquier_id [String]
460
+ # @param access_strategy [Symbol]
461
+ # @return [void]
462
+ #
463
+ # @api private
464
+ # @since 1.7.0
465
+ def obtain__free_to_acquire(
466
+ logger,
467
+ log_sampled,
468
+ log_lock_try,
469
+ lock_key,
470
+ queue_ttl,
471
+ acquier_id,
472
+ access_strategy
473
+ )
474
+ return unless log_sampled && log_lock_try
475
+
476
+ logger.debug do
477
+ "[redis_queued_locks.try_lock.obtain__free_to_acquire] " \
478
+ "lock_key => '#{lock_key}' " \
479
+ "queue_ttl => #{queue_ttl} " \
480
+ "acq_id => '#{acquier_id}' " \
481
+ "acs_strat => '#{access_strategy}'"
482
+ end rescue nil
483
+ end
484
+ end
485
+ # rubocop:enable Metrics/ModuleLength