redis_queued_locks 1.6.0 → 1.7.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.
@@ -0,0 +1,192 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 1.7.0
5
+ # rubocop:disable Metrics/ModuleLength
6
+ module RedisQueuedLocks::Acquier::AcquireLock::LogVisitor
7
+ extend self
8
+
9
+ # @param logger [::Logger,#debug]
10
+ # @param log_sampled [Boolean]
11
+ # @param lock_key [String]
12
+ # @param queue_ttl [Integer]
13
+ # @param acquier_id [String]
14
+ # @param access_strategy [Symbol]
15
+ # @return [void]
16
+ #
17
+ # @api private
18
+ # @since 1.7.0
19
+ def start_lock_obtaining(
20
+ logger,
21
+ log_sampled,
22
+ lock_key,
23
+ queue_ttl,
24
+ acquier_id,
25
+ access_strategy
26
+ )
27
+ return unless log_sampled
28
+
29
+ logger.debug do
30
+ "[redis_queued_locks.start_lock_obtaining] " \
31
+ "lock_key => '#{lock_key}' " \
32
+ "queue_ttl => #{queue_ttl} " \
33
+ "acq_id => '#{acquier_id}' " \
34
+ "acs_strat => '#{access_strategy}'"
35
+ end rescue nil
36
+ end
37
+
38
+ # @param logger [::Logger,#debug]
39
+ # @param log_sampled [Boolean]
40
+ # @param lock_key [String]
41
+ # @param queue_ttl [Integer]
42
+ # @param acquier_id [String]
43
+ # @param access_strategy [Symbol]
44
+ # @return [void]
45
+ #
46
+ # @api private
47
+ # @since 1.7.0
48
+ def start_try_to_lock_cycle(
49
+ logger,
50
+ log_sampled,
51
+ lock_key,
52
+ queue_ttl,
53
+ acquier_id,
54
+ access_strategy
55
+ )
56
+ return unless log_sampled
57
+
58
+ logger.debug do
59
+ "[redis_queued_locks.start_try_to_lock_cycle] " \
60
+ "lock_key => '#{lock_key}' " \
61
+ "queue_ttl => #{queue_ttl} " \
62
+ "acq_id => '#{acquier_id}' " \
63
+ "acs_strat => '#{access_strategy}'"
64
+ end rescue nil
65
+ end
66
+
67
+ # @param logger [::Logger,#debug]
68
+ # @param log_sampled [Boolean]
69
+ # @param lock_key [String]
70
+ # @param queue_ttl [Integer]
71
+ # @param acquier_id [String]
72
+ # @param access_strategy [Symbol]
73
+ # @return [void]
74
+ #
75
+ # @api private
76
+ # @since 1.7.0
77
+ def dead_score_reached__reset_acquier_position(
78
+ logger,
79
+ log_sampled,
80
+ lock_key,
81
+ queue_ttl,
82
+ acquier_id,
83
+ access_strategy
84
+ )
85
+ return unless log_sampled
86
+
87
+ logger.debug do
88
+ "[redis_queued_locks.dead_score_reached__reset_acquier_position] " \
89
+ "lock_key => '#{lock_key}' " \
90
+ "queue_ttl => #{queue_ttl} " \
91
+ "acq_id => '#{acquier_id}' " \
92
+ "acs_strat => '#{access_strategy}'"
93
+ end rescue nil
94
+ end
95
+
96
+ # @param logger [::Logger,#debug]
97
+ # @param log_sampled [Boolean]
98
+ # @param lock_key [String]
99
+ # @param queue_ttl [Integer]
100
+ # @param acquier_id [String]
101
+ # @param acq_time [Numeric]
102
+ # @param access_strategy [Symbol]
103
+ # @return [void]
104
+ #
105
+ # @api private
106
+ # @since 1.7.0
107
+ def extendable_reentrant_lock_obtained(
108
+ logger,
109
+ log_sampled,
110
+ lock_key,
111
+ queue_ttl,
112
+ acquier_id,
113
+ acq_time,
114
+ access_strategy
115
+ )
116
+ return unless log_sampled
117
+
118
+ logger.debug do
119
+ "[redis_queued_locks.extendable_reentrant_lock_obtained] " \
120
+ "lock_key => '#{lock_key}' " \
121
+ "queue_ttl => #{queue_ttl} " \
122
+ "acq_id => '#{acquier_id}' " \
123
+ "acs_strat => '#{access_strategy}' " \
124
+ "acq_time => #{acq_time} (ms)"
125
+ end rescue nil
126
+ end
127
+
128
+ # @param logger [::Logger,#debug]
129
+ # @param log_sampled [Boolean]
130
+ # @param lock_key [String]
131
+ # @param queue_ttl [Integer]
132
+ # @param acquier_id [String]
133
+ # @param acq_time [Numeric]
134
+ # @param access_strategy [Symbol]
135
+ # @return [void]
136
+ #
137
+ # @api private
138
+ # @since 1.7.0
139
+ def reentrant_lock_obtained(
140
+ logger,
141
+ log_sampled,
142
+ lock_key,
143
+ queue_ttl,
144
+ acquier_id,
145
+ acq_time,
146
+ access_strategy
147
+ )
148
+ return unless log_sampled
149
+
150
+ logger.debug do
151
+ "[redis_queued_locks.reentrant_lock_obtained] " \
152
+ "lock_key => '#{lock_key}' " \
153
+ "queue_ttl => #{queue_ttl} " \
154
+ "acq_id => '#{acquier_id}' " \
155
+ "acs_strat => '#{access_strategy}' " \
156
+ "acq_time => #{acq_time} (ms)"
157
+ end rescue nil
158
+ end
159
+
160
+ # @param logger [::Logger,#debug]
161
+ # @param log_sampled [Boolean]
162
+ # @param lock_key [String]
163
+ # @param queue_ttl [Integer]
164
+ # @param acquier_id [String]
165
+ # @param acq_time [Numeric]
166
+ # @param access_strategy [Symbol]
167
+ # @return [void]
168
+ #
169
+ # @api private
170
+ # @since 1.7.0
171
+ def lock_obtained(
172
+ logger,
173
+ log_sampled,
174
+ lock_key,
175
+ queue_ttl,
176
+ acquier_id,
177
+ acq_time,
178
+ access_strategy
179
+ )
180
+ return unless log_sampled
181
+
182
+ logger.debug do
183
+ "[redis_queued_locks.lock_obtained] " \
184
+ "lock_key => '#{lock_key}' " \
185
+ "queue_ttl => #{queue_ttl} " \
186
+ "acq_id => '#{acquier_id}' " \
187
+ "acs_strat => '#{access_strategy}' " \
188
+ "acq_time => #{acq_time} (ms)"
189
+ end rescue nil
190
+ end
191
+ end
192
+ # rubocop:enable Metrics/ModuleLength
@@ -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