redis_queued_locks 1.1.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -3
- data/README.md +262 -60
- data/lib/redis_queued_locks/acquier/acquire_lock/delay_execution.rb +2 -2
- data/lib/redis_queued_locks/acquier/acquire_lock/try_to_lock.rb +239 -12
- data/lib/redis_queued_locks/acquier/acquire_lock/with_acq_timeout.rb +2 -2
- data/lib/redis_queued_locks/acquier/acquire_lock/yield_expire.rb +115 -0
- data/lib/redis_queued_locks/acquier/acquire_lock.rb +200 -89
- data/lib/redis_queued_locks/acquier/clear_dead_requests.rb +3 -3
- data/lib/redis_queued_locks/acquier/extend_lock_ttl.rb +3 -3
- data/lib/redis_queued_locks/acquier/is_locked.rb +2 -2
- data/lib/redis_queued_locks/acquier/is_queued.rb +2 -2
- data/lib/redis_queued_locks/acquier/keys.rb +2 -2
- data/lib/redis_queued_locks/acquier/lock_info.rb +19 -3
- data/lib/redis_queued_locks/acquier/locks.rb +13 -4
- data/lib/redis_queued_locks/acquier/queue_info.rb +2 -2
- data/lib/redis_queued_locks/acquier/queues.rb +4 -4
- data/lib/redis_queued_locks/acquier/release_all_locks.rb +4 -4
- data/lib/redis_queued_locks/acquier/release_lock.rb +4 -4
- data/lib/redis_queued_locks/acquier.rb +1 -1
- data/lib/redis_queued_locks/client.rb +50 -22
- data/lib/redis_queued_locks/debugger/interface.rb +4 -4
- data/lib/redis_queued_locks/debugger.rb +8 -8
- data/lib/redis_queued_locks/errors.rb +10 -6
- data/lib/redis_queued_locks/instrument/active_support.rb +2 -2
- data/lib/redis_queued_locks/instrument/void_notifier.rb +2 -2
- data/lib/redis_queued_locks/instrument.rb +2 -2
- data/lib/redis_queued_locks/logging/void_logger.rb +10 -10
- data/lib/redis_queued_locks/logging.rb +10 -3
- data/lib/redis_queued_locks/resource.rb +22 -16
- data/lib/redis_queued_locks/utilities.rb +2 -2
- data/lib/redis_queued_locks/version.rb +2 -2
- data/lib/redis_queued_locks.rb +2 -2
- metadata +4 -4
- data/lib/redis_queued_locks/acquier/acquire_lock/yield_with_expire.rb +0 -72
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api private
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Acquier::Queues
|
6
6
|
class << self
|
7
7
|
# @param redis_client [RedisClient]
|
@@ -10,7 +10,7 @@ module RedisQueuedLocks::Acquier::Queues
|
|
10
10
|
# @return [Set<String>,Set<Hash<Symbol,Any>>]
|
11
11
|
#
|
12
12
|
# @api private
|
13
|
-
# @since
|
13
|
+
# @since 1.0.0
|
14
14
|
def queues(redis_client, scan_size:, with_info:)
|
15
15
|
redis_client.with do |rconn|
|
16
16
|
lock_queues = scan_queues(rconn, scan_size)
|
@@ -25,7 +25,7 @@ module RedisQueuedLocks::Acquier::Queues
|
|
25
25
|
# @return [Set<String>]
|
26
26
|
#
|
27
27
|
# @api private
|
28
|
-
# @since
|
28
|
+
# @since 1.0.0
|
29
29
|
def scan_queues(redis_client, scan_size)
|
30
30
|
Set.new.tap do |lock_queues|
|
31
31
|
redis_client.scan(
|
@@ -44,7 +44,7 @@ module RedisQueuedLocks::Acquier::Queues
|
|
44
44
|
# @return [Set<Hash<Symbol,Any>>]
|
45
45
|
#
|
46
46
|
# @api private
|
47
|
-
# @since
|
47
|
+
# @since 1.0.0
|
48
48
|
def extract_queues_info(redis_client, lock_queues)
|
49
49
|
# TODO: refactor with RedisQueuedLocks::Acquier::QueueInfo
|
50
50
|
Set.new.tap do |seeded_queues|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api private
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Acquier::ReleaseAllLocks
|
6
|
-
# @since
|
6
|
+
# @since 1.0.0
|
7
7
|
extend RedisQueuedLocks::Utilities
|
8
8
|
|
9
9
|
class << self
|
@@ -27,7 +27,7 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks
|
|
27
27
|
# Format: { ok: true, result: Hash<Symbol,Numeric> }
|
28
28
|
#
|
29
29
|
# @api private
|
30
|
-
# @since
|
30
|
+
# @since 1.0.0
|
31
31
|
def release_all_locks(redis, batch_size, logger, instrumenter, instrument)
|
32
32
|
rel_start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
33
33
|
fully_release_all_locks(redis, batch_size) => { ok:, result: }
|
@@ -59,7 +59,7 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks
|
|
59
59
|
# - Exmaple: { ok: true, result: { rel_key_cnt: 12345 } }
|
60
60
|
#
|
61
61
|
# @api private
|
62
|
-
# @since
|
62
|
+
# @since 1.0.0
|
63
63
|
def fully_release_all_locks(redis, batch_size)
|
64
64
|
result = redis.with do |rconn|
|
65
65
|
rconn.pipelined do |pipeline|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api private
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Acquier::ReleaseLock
|
6
|
-
# @since
|
6
|
+
# @since 1.0.0
|
7
7
|
extend RedisQueuedLocks::Utilities
|
8
8
|
|
9
9
|
class << self
|
@@ -27,7 +27,7 @@ module RedisQueuedLocks::Acquier::ReleaseLock
|
|
27
27
|
# Format: { ok: true/false, result: Hash<Symbol,Numeric|String|Symbol> }
|
28
28
|
#
|
29
29
|
# @api private
|
30
|
-
# @since
|
30
|
+
# @since 1.0.0
|
31
31
|
def release_lock(redis, lock_name, instrumenter, logger)
|
32
32
|
lock_key = RedisQueuedLocks::Resource.prepare_lock_key(lock_name)
|
33
33
|
lock_key_queue = RedisQueuedLocks::Resource.prepare_lock_queue(lock_name)
|
@@ -76,7 +76,7 @@ module RedisQueuedLocks::Acquier::ReleaseLock
|
|
76
76
|
# }
|
77
77
|
#
|
78
78
|
# @api private
|
79
|
-
# @since
|
79
|
+
# @since 1.0.0
|
80
80
|
def fully_release_lock(redis, lock_key, lock_key_queue)
|
81
81
|
result = redis.with do |rconn|
|
82
82
|
rconn.multi do |transact|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api public
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
# rubocop:disable Metrics/ClassLength
|
6
6
|
class RedisQueuedLocks::Client
|
7
|
-
# @since
|
7
|
+
# @since 1.0.0
|
8
8
|
include Qonfig::Configurable
|
9
9
|
|
10
10
|
configuration do
|
@@ -22,6 +22,7 @@ class RedisQueuedLocks::Client
|
|
22
22
|
setting :log_lock_try, false
|
23
23
|
setting :dead_request_ttl, (1 * 24 * 60 * 60 * 1000) # NOTE: 1 day in milliseconds
|
24
24
|
setting :is_timed_by_default, false
|
25
|
+
setting :default_conflict_strategy, :wait_for_lock
|
25
26
|
|
26
27
|
validate('retry_count') { |val| val == nil || (val.is_a?(::Integer) && val >= 0) }
|
27
28
|
validate('retry_delay') { |val| val.is_a?(::Integer) && val >= 0 }
|
@@ -36,12 +37,20 @@ class RedisQueuedLocks::Client
|
|
36
37
|
validate('log_lock_try', :boolean)
|
37
38
|
validate('dead_request_ttl') { |val| val.is_a?(::Integer) && val > 0 }
|
38
39
|
validate('is_timed_by_default', :boolean)
|
40
|
+
validate('default_conflict_strategy') do |val|
|
41
|
+
# rubocop:disable Layout/MultilineOperationIndentation
|
42
|
+
val == :work_through ||
|
43
|
+
val == :extendable_work_through ||
|
44
|
+
val == :wait_for_lock ||
|
45
|
+
val == :dead_locking
|
46
|
+
# rubocop:enable Layout/MultilineOperationIndentation
|
47
|
+
end
|
39
48
|
end
|
40
49
|
|
41
50
|
# @return [RedisClient]
|
42
51
|
#
|
43
52
|
# @api private
|
44
|
-
# @since
|
53
|
+
# @since 1.0.0
|
45
54
|
attr_reader :redis_client
|
46
55
|
|
47
56
|
# NOTE: attr_access here is chosen intentionally in order to have an ability to change
|
@@ -49,7 +58,7 @@ class RedisQueuedLocks::Client
|
|
49
58
|
# @return [String]
|
50
59
|
#
|
51
60
|
# @api private
|
52
|
-
# @since
|
61
|
+
# @since 1.0.0
|
53
62
|
attr_accessor :uniq_identity
|
54
63
|
|
55
64
|
# @param redis_client [RedisClient]
|
@@ -60,7 +69,7 @@ class RedisQueuedLocks::Client
|
|
60
69
|
# @return [void]
|
61
70
|
#
|
62
71
|
# @api public
|
63
|
-
# @since
|
72
|
+
# @since 1.0.0
|
64
73
|
def initialize(redis_client, &configs)
|
65
74
|
configure(&configs)
|
66
75
|
@uniq_identity = config[:uniq_identifier].call
|
@@ -96,19 +105,31 @@ class RedisQueuedLocks::Client
|
|
96
105
|
# already obtained;
|
97
106
|
# - Should the logic exit immidietly after the first try if the lock was obtained
|
98
107
|
# by another process while the lock request queue was initially empty;
|
108
|
+
# @option conflict_strategy [Symbol]
|
109
|
+
# - The conflict strategy mode for cases when the process that obtained the lock
|
110
|
+
# want to acquire this lock again;
|
111
|
+
# - By default uses `:wait_for_lock` strategy;
|
112
|
+
# - pre-confured in `config[:default_conflict_strategy]`;
|
113
|
+
# - Supports:
|
114
|
+
# - `:work_through` - continue working under the lock without lock's TTL extension;
|
115
|
+
# - `:extendable_work_through` - continue working under the lock with lock's TTL extension;
|
116
|
+
# - `:wait_for_lock` - (default) - work in classic way
|
117
|
+
# (with timeouts, retry delays, retry limits, etc - in classic way :));
|
118
|
+
# - `:dead_locking` - fail with deadlock exception;
|
99
119
|
# @option meta [NilClass,Hash<String|Symbol,Any>]
|
100
120
|
# - A custom metadata wich will be passed to the lock data in addition to the existing data;
|
101
121
|
# - Metadata can not contain reserved lock data keys;
|
102
122
|
# @option logger [::Logger,#debug]
|
103
123
|
# - Logger object used from the configuration layer (see config[:logger]);
|
104
124
|
# - See `RedisQueuedLocks::Logging::VoidLogger` for example;
|
125
|
+
# - Supports `SemanticLogger::Logger` (see "semantic_logger" gem)
|
105
126
|
# @option log_lock_try [Boolean]
|
106
127
|
# - should be logged the each try of lock acquiring (a lot of logs can
|
107
128
|
# be generated depending on your retry configurations);
|
108
129
|
# - see `config[:log_lock_try]`;
|
109
130
|
# @option instrument [NilClass,Any]
|
110
|
-
#
|
111
|
-
#
|
131
|
+
# - Custom instrumentation data wich will be passed to the instrumenter's payload
|
132
|
+
# with :instrument key;
|
112
133
|
# @param block [Block]
|
113
134
|
# A block of code that should be executed after the successfully acquired lock.
|
114
135
|
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
|
@@ -116,7 +137,8 @@ class RedisQueuedLocks::Client
|
|
116
137
|
# - If block is given the result of block's yeld will be returned.
|
117
138
|
#
|
118
139
|
# @api public
|
119
|
-
# @since
|
140
|
+
# @since 1.0.0
|
141
|
+
# @version 1.3.0
|
120
142
|
def lock(
|
121
143
|
lock_name,
|
122
144
|
ttl: config[:default_lock_ttl],
|
@@ -128,6 +150,7 @@ class RedisQueuedLocks::Client
|
|
128
150
|
retry_jitter: config[:retry_jitter],
|
129
151
|
raise_errors: false,
|
130
152
|
fail_fast: false,
|
153
|
+
conflict_strategy: config[:default_conflict_strategy],
|
131
154
|
identity: uniq_identity,
|
132
155
|
meta: nil,
|
133
156
|
logger: config[:logger],
|
@@ -153,6 +176,7 @@ class RedisQueuedLocks::Client
|
|
153
176
|
instrumenter: config[:instrumenter],
|
154
177
|
identity:,
|
155
178
|
fail_fast:,
|
179
|
+
conflict_strategy:,
|
156
180
|
meta:,
|
157
181
|
logger: config[:logger],
|
158
182
|
log_lock_try: config[:log_lock_try],
|
@@ -164,7 +188,8 @@ class RedisQueuedLocks::Client
|
|
164
188
|
# @note See #lock method signature.
|
165
189
|
#
|
166
190
|
# @api public
|
167
|
-
# @since
|
191
|
+
# @since 1.0.0
|
192
|
+
# @version 1.3.0
|
168
193
|
def lock!(
|
169
194
|
lock_name,
|
170
195
|
ttl: config[:default_lock_ttl],
|
@@ -175,6 +200,7 @@ class RedisQueuedLocks::Client
|
|
175
200
|
retry_delay: config[:retry_delay],
|
176
201
|
retry_jitter: config[:retry_jitter],
|
177
202
|
fail_fast: false,
|
203
|
+
conflict_strategy: config[:default_conflict_strategy],
|
178
204
|
identity: uniq_identity,
|
179
205
|
meta: nil,
|
180
206
|
logger: config[:logger],
|
@@ -198,6 +224,7 @@ class RedisQueuedLocks::Client
|
|
198
224
|
log_lock_try:,
|
199
225
|
meta:,
|
200
226
|
instrument:,
|
227
|
+
conflict_strategy:,
|
201
228
|
&block
|
202
229
|
)
|
203
230
|
end
|
@@ -219,7 +246,7 @@ class RedisQueuedLocks::Client
|
|
219
246
|
# }
|
220
247
|
#
|
221
248
|
# @api public
|
222
|
-
# @since
|
249
|
+
# @since 1.0.0
|
223
250
|
def unlock(
|
224
251
|
lock_name,
|
225
252
|
logger: config[:logger],
|
@@ -238,7 +265,7 @@ class RedisQueuedLocks::Client
|
|
238
265
|
# @return [Boolean]
|
239
266
|
#
|
240
267
|
# @api public
|
241
|
-
# @since
|
268
|
+
# @since 1.0.0
|
242
269
|
def locked?(lock_name)
|
243
270
|
RedisQueuedLocks::Acquier::IsLocked.locked?(redis_client, lock_name)
|
244
271
|
end
|
@@ -247,7 +274,7 @@ class RedisQueuedLocks::Client
|
|
247
274
|
# @return [Boolean]
|
248
275
|
#
|
249
276
|
# @api public
|
250
|
-
# @since
|
277
|
+
# @since 1.0.0
|
251
278
|
def queued?(lock_name)
|
252
279
|
RedisQueuedLocks::Acquier::IsQueued.queued?(redis_client, lock_name)
|
253
280
|
end
|
@@ -256,7 +283,7 @@ class RedisQueuedLocks::Client
|
|
256
283
|
# @return [Hash<String,String|Numeric>,NilClass]
|
257
284
|
#
|
258
285
|
# @api public
|
259
|
-
# @since
|
286
|
+
# @since 1.0.0
|
260
287
|
def lock_info(lock_name)
|
261
288
|
RedisQueuedLocks::Acquier::LockInfo.lock_info(redis_client, lock_name)
|
262
289
|
end
|
@@ -265,7 +292,7 @@ class RedisQueuedLocks::Client
|
|
265
292
|
# @return [Hash<String|Array<Hash<String,String|Numeric>>,NilClass]
|
266
293
|
#
|
267
294
|
# @api public
|
268
|
-
# @since
|
295
|
+
# @since 1.0.0
|
269
296
|
def queue_info(lock_name)
|
270
297
|
RedisQueuedLocks::Acquier::QueueInfo.queue_info(redis_client, lock_name)
|
271
298
|
end
|
@@ -288,7 +315,7 @@ class RedisQueuedLocks::Client
|
|
288
315
|
# - { ok: false, result: :async_expire_or_no_lock }
|
289
316
|
#
|
290
317
|
# @api public
|
291
|
-
# @since
|
318
|
+
# @since 1.0.0
|
292
319
|
def extend_lock_ttl(lock_name, milliseconds, logger: config[:logger])
|
293
320
|
RedisQueuedLocks::Acquier::ExtendLockTTL.extend_lock_ttl(
|
294
321
|
redis_client,
|
@@ -311,7 +338,7 @@ class RedisQueuedLocks::Client
|
|
311
338
|
# Example: { ok: true, result { rel_key_cnt: 100, rel_time: 0.01 } }
|
312
339
|
#
|
313
340
|
# @api public
|
314
|
-
# @since
|
341
|
+
# @since 1.0.0
|
315
342
|
def clear_locks(
|
316
343
|
batch_size: config[:lock_release_batch_size],
|
317
344
|
logger: config[:logger],
|
@@ -345,7 +372,7 @@ class RedisQueuedLocks::Client
|
|
345
372
|
# @return [Set<String>,Set<Hash<Symbol,Any>>]
|
346
373
|
#
|
347
374
|
# @api public
|
348
|
-
# @since
|
375
|
+
# @since 1.0.0
|
349
376
|
def locks(scan_size: config[:key_extraction_batch_size], with_info: false)
|
350
377
|
RedisQueuedLocks::Acquier::Locks.locks(redis_client, scan_size:, with_info:)
|
351
378
|
end
|
@@ -356,7 +383,7 @@ class RedisQueuedLocks::Client
|
|
356
383
|
# @return [Set<Hash<String,Any>>]
|
357
384
|
#
|
358
385
|
# @api public
|
359
|
-
# @since
|
386
|
+
# @since 1.0.0
|
360
387
|
def locks_info(scan_size: config[:key_extraction_batch_size])
|
361
388
|
locks(scan_size:, with_info: true)
|
362
389
|
end
|
@@ -376,7 +403,7 @@ class RedisQueuedLocks::Client
|
|
376
403
|
# @return [Set<String>,String<Hash<Symbol,Any>>]
|
377
404
|
#
|
378
405
|
# @api public
|
379
|
-
# @since
|
406
|
+
# @since 1.0.0
|
380
407
|
def queues(scan_size: config[:key_extraction_batch_size], with_info: false)
|
381
408
|
RedisQueuedLocks::Acquier::Queues.queues(redis_client, scan_size:, with_info:)
|
382
409
|
end
|
@@ -387,7 +414,7 @@ class RedisQueuedLocks::Client
|
|
387
414
|
# @return [Set<Hash<Symbol,Any>>]
|
388
415
|
#
|
389
416
|
# @api public
|
390
|
-
# @since
|
417
|
+
# @since 1.0.0
|
391
418
|
def queues_info(scan_size: config[:key_extraction_batch_size])
|
392
419
|
queues(scan_size:, with_info: true)
|
393
420
|
end
|
@@ -396,7 +423,7 @@ class RedisQueuedLocks::Client
|
|
396
423
|
# @return [Set<String>]
|
397
424
|
#
|
398
425
|
# @api public
|
399
|
-
# @since
|
426
|
+
# @since 1.0.0
|
400
427
|
def keys(scan_size: config[:key_extraction_batch_size])
|
401
428
|
RedisQueuedLocks::Acquier::Keys.keys(redis_client, scan_size:)
|
402
429
|
end
|
@@ -415,7 +442,8 @@ class RedisQueuedLocks::Client
|
|
415
442
|
# Format: { ok: true, result: { processed_queus: Set<String> } }
|
416
443
|
#
|
417
444
|
# @api public
|
418
|
-
# @since
|
445
|
+
# @since 1.0.0
|
446
|
+
# @version 1.1.0
|
419
447
|
def clear_dead_requests(
|
420
448
|
dead_ttl: config[:dead_request_ttl],
|
421
449
|
scan_size: config[:lock_release_batch_size],
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api private
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Debugger::Interface
|
6
6
|
# @param message [String]
|
7
7
|
# @return [void]
|
8
8
|
#
|
9
9
|
# @api private
|
10
|
-
# @since
|
10
|
+
# @since 1.0.0
|
11
11
|
def debug(message)
|
12
12
|
RedisQueuedLocks::Debugger.debug(message)
|
13
13
|
end
|
@@ -15,7 +15,7 @@ module RedisQueuedLocks::Debugger::Interface
|
|
15
15
|
# @return [void]
|
16
16
|
#
|
17
17
|
# @api private
|
18
|
-
# @since
|
18
|
+
# @since 1.0.0
|
19
19
|
def enable_debugger!
|
20
20
|
RedisQueuedLocks::Debugger.enable!
|
21
21
|
end
|
@@ -23,7 +23,7 @@ module RedisQueuedLocks::Debugger::Interface
|
|
23
23
|
# @return [void]
|
24
24
|
#
|
25
25
|
# @api private
|
26
|
-
# @since
|
26
|
+
# @since 1.0.0
|
27
27
|
def disable_debugger!
|
28
28
|
RedisQueuedLocks::Debugger.disable!
|
29
29
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api private
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Debugger
|
6
6
|
require_relative 'debugger/interface'
|
7
7
|
|
8
8
|
# @return [String]
|
9
9
|
#
|
10
10
|
# @api private
|
11
|
-
# @since
|
11
|
+
# @since 1.0.0
|
12
12
|
DEBUG_ENABLED_METHOD = <<~METHOD_DECLARATION.strip.freeze
|
13
13
|
def debug(message) = STDOUT.write("#\{message}\n")
|
14
14
|
METHOD_DECLARATION
|
@@ -16,20 +16,20 @@ module RedisQueuedLocks::Debugger
|
|
16
16
|
# @return [String]
|
17
17
|
#
|
18
18
|
# @api private
|
19
|
-
# @since
|
19
|
+
# @since 1.0.0
|
20
20
|
DEBUG_DISABLED_MEHTOD = <<~METHOD_DECLARATION.strip.freeze
|
21
21
|
def debug(message); end
|
22
22
|
METHOD_DECLARATION
|
23
23
|
|
24
24
|
class << self
|
25
25
|
# @api private
|
26
|
-
# @since
|
26
|
+
# @since 1.0.0
|
27
27
|
instance_variable_set(:@enabled, false)
|
28
28
|
|
29
29
|
# @return [void]
|
30
30
|
#
|
31
31
|
# @api private
|
32
|
-
# @since
|
32
|
+
# @since 1.0.0
|
33
33
|
def enable!
|
34
34
|
@enabled = true
|
35
35
|
eval(DEBUG_ENABLED_METHOD)
|
@@ -38,7 +38,7 @@ module RedisQueuedLocks::Debugger
|
|
38
38
|
# @return [void]
|
39
39
|
#
|
40
40
|
# @api private
|
41
|
-
# @since
|
41
|
+
# @since 1.0.0
|
42
42
|
def disable!
|
43
43
|
@enabled = false
|
44
44
|
eval(DEBUG_DISABLED_MEHTOD)
|
@@ -47,7 +47,7 @@ module RedisQueuedLocks::Debugger
|
|
47
47
|
# @return [Boolean]
|
48
48
|
#
|
49
49
|
# @api private
|
50
|
-
# @since
|
50
|
+
# @since 1.0.0
|
51
51
|
def enabled?
|
52
52
|
@enabled
|
53
53
|
end
|
@@ -56,7 +56,7 @@ module RedisQueuedLocks::Debugger
|
|
56
56
|
# @return [void]
|
57
57
|
#
|
58
58
|
# @api private
|
59
|
-
# @since
|
59
|
+
# @since 1.0.0
|
60
60
|
def debug(message); end
|
61
61
|
end
|
62
62
|
end
|
@@ -2,26 +2,30 @@
|
|
2
2
|
|
3
3
|
module RedisQueuedLocks
|
4
4
|
# @api public
|
5
|
-
# @since
|
5
|
+
# @since 1.0.0
|
6
6
|
Error = Class.new(::StandardError)
|
7
7
|
|
8
8
|
# @api public
|
9
|
-
# @since
|
9
|
+
# @since 1.0.0
|
10
10
|
ArgumentError = Class.new(::ArgumentError)
|
11
11
|
|
12
12
|
# @api public
|
13
|
-
# @since
|
13
|
+
# @since 1.0.0
|
14
14
|
LockAlreadyObtainedError = Class.new(Error)
|
15
15
|
|
16
16
|
# @api public
|
17
|
-
# @since
|
17
|
+
# @since 1.0.0
|
18
18
|
LockAcquiermentTimeoutError = Class.new(Error)
|
19
19
|
|
20
20
|
# @api public
|
21
|
-
# @since
|
21
|
+
# @since 1.0.0
|
22
22
|
LockAcquiermentRetryLimitError = Class.new(Error)
|
23
23
|
|
24
24
|
# @api pulic
|
25
|
-
# @since
|
25
|
+
# @since 1.0.0
|
26
26
|
TimedLockTimeoutError = Class.new(Error)
|
27
|
+
|
28
|
+
# @api public
|
29
|
+
# @since 1.3.0
|
30
|
+
ConflictLockObtainError = Class.new(Error)
|
27
31
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api public
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Instrument::ActiveSupport
|
6
6
|
class << self
|
7
7
|
# @param event [String]
|
@@ -9,7 +9,7 @@ module RedisQueuedLocks::Instrument::ActiveSupport
|
|
9
9
|
# @return [void]
|
10
10
|
#
|
11
11
|
# @api public
|
12
|
-
# @since
|
12
|
+
# @since 1.0.0
|
13
13
|
def notify(event, payload = {})
|
14
14
|
::ActiveSupport::Notifications.instrument(event, payload)
|
15
15
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api public
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Instrument::VoidNotifier
|
6
6
|
class << self
|
7
7
|
# @param event [String]
|
@@ -9,7 +9,7 @@ module RedisQueuedLocks::Instrument::VoidNotifier
|
|
9
9
|
# @return [void]
|
10
10
|
#
|
11
11
|
# @api public
|
12
|
-
# @since
|
12
|
+
# @since 1.0.0
|
13
13
|
def notify(event, payload = {}); end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api public
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Instrument
|
6
6
|
require_relative 'instrument/void_notifier'
|
7
7
|
require_relative 'instrument/active_support'
|
@@ -11,7 +11,7 @@ module RedisQueuedLocks::Instrument
|
|
11
11
|
# @return [Boolean]
|
12
12
|
#
|
13
13
|
# @api public
|
14
|
-
# @since
|
14
|
+
# @since 1.0.0
|
15
15
|
def valid_interface?(instrumenter)
|
16
16
|
if instrumenter == RedisQueuedLocks::Instrument::ActiveSupport
|
17
17
|
# NOTE: active_support should be required in your app
|
@@ -1,43 +1,43 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api public
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Logging::VoidLogger
|
6
6
|
class << self
|
7
7
|
# @api public
|
8
|
-
# @since
|
8
|
+
# @since 1.0.0
|
9
9
|
def warn(progname = nil, &block); end
|
10
10
|
|
11
11
|
# @api public
|
12
|
-
# @since
|
12
|
+
# @since 1.0.0
|
13
13
|
def unknown(progname = nil, &block); end
|
14
14
|
|
15
15
|
# @api public
|
16
|
-
# @since
|
16
|
+
# @since 1.0.0
|
17
17
|
def log(progname = nil, &block); end
|
18
18
|
|
19
19
|
# @api public
|
20
|
-
# @since
|
20
|
+
# @since 1.0.0
|
21
21
|
def info(progname = nil, &block); end
|
22
22
|
|
23
23
|
# @api public
|
24
|
-
# @since
|
24
|
+
# @since 1.0.0
|
25
25
|
def error(progname = nil, &block); end
|
26
26
|
|
27
27
|
# @api public
|
28
|
-
# @since
|
28
|
+
# @since 1.0.0
|
29
29
|
def fatal(progname = nil, &block); end
|
30
30
|
|
31
31
|
# @api public
|
32
|
-
# @since
|
32
|
+
# @since 1.0.0
|
33
33
|
def debug(progname = nil, &block); end
|
34
34
|
|
35
35
|
# @api public
|
36
|
-
# @since
|
36
|
+
# @since 1.0.0
|
37
37
|
def add(*, &block); end
|
38
38
|
|
39
39
|
# @api public
|
40
|
-
# @since
|
40
|
+
# @since 1.0.0
|
41
41
|
def <<(message); end
|
42
42
|
end
|
43
43
|
end
|
@@ -1,19 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# @api public
|
4
|
-
# @since
|
4
|
+
# @since 1.0.0
|
5
5
|
module RedisQueuedLocks::Logging
|
6
6
|
require_relative 'logging/void_logger'
|
7
7
|
|
8
8
|
class << self
|
9
|
-
# @param logger [::Logger,#debug]
|
9
|
+
# @param logger [::Logger,#debug,::SemanticLogger::Logger]
|
10
10
|
# @return [Boolean]
|
11
11
|
#
|
12
12
|
# @api public
|
13
|
-
# @since
|
13
|
+
# @since 1.0.0
|
14
|
+
# @version 1.2.0
|
14
15
|
def valid_interface?(logger)
|
15
16
|
return true if logger.is_a?(::Logger)
|
16
17
|
|
18
|
+
# NOTE:
|
19
|
+
# - convinient/conventional way to support the popular `semantic_logger` library
|
20
|
+
# - see https://logger.rocketjob.io/
|
21
|
+
# - see https://github.com/reidmorrison/semantic_logger
|
22
|
+
return true if defined?(::SemanticLogger::Logger) && logger.is_a?(::SemanticLogger::Logger)
|
23
|
+
|
17
24
|
# NOTE: should provide `#debug` method.
|
18
25
|
return false unless logger.respond_to?(:debug)
|
19
26
|
|