redis_queued_locks 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +51 -0
  4. data/README.md +402 -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/yield_expire/log_visitor.rb +8 -0
  12. data/lib/redis_queued_locks/acquier/acquire_lock/yield_expire.rb +13 -9
  13. data/lib/redis_queued_locks/acquier/acquire_lock.rb +44 -20
  14. data/lib/redis_queued_locks/acquier/clear_dead_requests.rb +5 -1
  15. data/lib/redis_queued_locks/acquier/extend_lock_ttl.rb +5 -1
  16. data/lib/redis_queued_locks/acquier/lock_info.rb +4 -3
  17. data/lib/redis_queued_locks/acquier/locks.rb +2 -2
  18. data/lib/redis_queued_locks/acquier/queue_info.rb +2 -2
  19. data/lib/redis_queued_locks/acquier/release_all_locks.rb +12 -2
  20. data/lib/redis_queued_locks/acquier/release_lock.rb +12 -2
  21. data/lib/redis_queued_locks/client.rb +284 -34
  22. data/lib/redis_queued_locks/errors.rb +8 -0
  23. data/lib/redis_queued_locks/instrument.rb +8 -1
  24. data/lib/redis_queued_locks/logging.rb +8 -1
  25. data/lib/redis_queued_locks/resource.rb +59 -1
  26. data/lib/redis_queued_locks/swarm/acquirers.rb +44 -0
  27. data/lib/redis_queued_locks/swarm/flush_zombies.rb +133 -0
  28. data/lib/redis_queued_locks/swarm/probe_hosts.rb +69 -0
  29. data/lib/redis_queued_locks/swarm/redis_client_builder.rb +67 -0
  30. data/lib/redis_queued_locks/swarm/supervisor.rb +83 -0
  31. data/lib/redis_queued_locks/swarm/swarm_element/isolated.rb +287 -0
  32. data/lib/redis_queued_locks/swarm/swarm_element/threaded.rb +351 -0
  33. data/lib/redis_queued_locks/swarm/swarm_element.rb +8 -0
  34. data/lib/redis_queued_locks/swarm/zombie_info.rb +145 -0
  35. data/lib/redis_queued_locks/swarm.rb +241 -0
  36. data/lib/redis_queued_locks/utilities/lock.rb +22 -0
  37. data/lib/redis_queued_locks/utilities.rb +75 -0
  38. data/lib/redis_queued_locks/version.rb +2 -2
  39. data/lib/redis_queued_locks.rb +2 -0
  40. metadata +14 -4
  41. data/lib/redis_queued_locks/watcher.rb +0 -1
@@ -19,6 +19,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
19
19
  # @param logger [::Logger,#debug] Logger object.
20
20
  # @param lock_key [String] Obtained lock key that should be expired.
21
21
  # @param acquier_id [String] Acquier identifier.
22
+ # @param host_id [String] Host identifier.
22
23
  # @param access_strategy [Symbol] Lock obtaining strategy.
23
24
  # @param timed [Boolean] Should the lock be wrapped by Timeout with with lock's ttl
24
25
  # @param ttl_shift [Float] Lock's TTL shifting. Should affect block's ttl. In millisecodns.
@@ -36,13 +37,14 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
36
37
  #
37
38
  # @api private
38
39
  # @since 1.3.0
39
- # @version 1.8.0
40
+ # @version 1.9.0
40
41
  # rubocop:disable Metrics/MethodLength
41
42
  def yield_expire(
42
43
  redis,
43
44
  logger,
44
45
  lock_key,
45
46
  acquier_id,
47
+ host_id,
46
48
  access_strategy,
47
49
  timed,
48
50
  ttl_shift,
@@ -64,7 +66,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
64
66
  end
65
67
 
66
68
  if timed && ttl != nil
67
- yield_with_timeout(timeout, lock_key, ttl, acquier_id, meta, &block)
69
+ yield_with_timeout(timeout, lock_key, ttl, acquier_id, host_id, meta, &block)
68
70
  else
69
71
  yield
70
72
  end
@@ -72,8 +74,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
72
74
  ensure
73
75
  if should_expire
74
76
  LogVisitor.expire_lock(
75
- logger, log_sampled,
76
- lock_key, queue_ttl, acquier_id, access_strategy
77
+ logger, log_sampled, lock_key,
78
+ queue_ttl, acquier_id, host_id, access_strategy
77
79
  )
78
80
  redis.call('EXPIRE', lock_key, '0')
79
81
  elsif should_decrease
@@ -83,8 +85,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
83
85
 
84
86
  if decreased_ttl > 0
85
87
  LogVisitor.decrease_lock(
86
- logger, log_sampled,
87
- lock_key, decreased_ttl, queue_ttl, acquier_id, access_strategy
88
+ logger, log_sampled, lock_key,
89
+ decreased_ttl, queue_ttl, acquier_id, host_id, access_strategy
88
90
  )
89
91
  # NOTE:# NOTE: EVAL signature -> <lua script>, (number of keys), *(keys), *(arguments)
90
92
  redis.call('EVAL', DECREASE_LOCK_PTTL, 1, lock_key, decreased_ttl)
@@ -100,14 +102,15 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
100
102
  # @parma lock_key [String]
101
103
  # @param lock_ttl [Integer,NilClass]
102
104
  # @param acquier_id [String]
105
+ # @param host_id [String]
103
106
  # @param meta [NilClass,Hash<Symbol|String,Any>]
104
107
  # @param block [Blcok]
105
108
  # @return [Any]
106
109
  #
107
110
  # @api private
108
111
  # @since 1.3.0
109
- # @version 1.8.0
110
- def yield_with_timeout(timeout, lock_key, lock_ttl, acquier_id, meta, &block)
112
+ # @version 1.9.0
113
+ def yield_with_timeout(timeout, lock_key, lock_ttl, acquier_id, host_id, meta, &block)
111
114
  ::Timeout.timeout(timeout, &block)
112
115
  rescue ::Timeout::Error
113
116
  raise(
@@ -116,7 +119,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldExpire
116
119
  "(lock: \"#{lock_key}\", " \
117
120
  "ttl: #{lock_ttl}, " \
118
121
  "meta: #{meta ? meta.inspect : '<no-meta>'}, " \
119
- "acq_id: \"#{acquier_id}\")"
122
+ "acq_id: \"#{acquier_id}\", " \
123
+ "hst_id: \"#{host_id}\")"
120
124
  )
121
125
  end
122
126
  end
@@ -121,6 +121,9 @@ module RedisQueuedLocks::Acquier::AcquireLock
121
121
  # - you can provide your own log sampler with bettter algorithm that should realize
122
122
  # `sampling_happened?(percent) => boolean` interface
123
123
  # (see `RedisQueuedLocks::Logging::Sampler` for example);
124
+ # @option log_sample_this [Boolean]
125
+ # - marks the method that everything should be logged despite the enabled log sampling;
126
+ # - makes sense when log sampling is enabled;
124
127
  # @option instr_sampling_enabled [Boolean]
125
128
  # - enables <instrumentaion sampling>: only the configured percent
126
129
  # of RQL cases will be instrumented;
@@ -139,6 +142,10 @@ module RedisQueuedLocks::Acquier::AcquireLock
139
142
  # - you can provide your own log sampler with bettter algorithm that should realize
140
143
  # `sampling_happened?(percent) => boolean` interface
141
144
  # (see `RedisQueuedLocks::Instrument::Sampler` for example);
145
+ # @option instr_sample_this [Boolean]
146
+ # - marks the method that everything should be instrumneted
147
+ # despite the enabled instrumentation sampling;
148
+ # - makes sense when instrumentation sampling is enabled;
142
149
  # @param [Block]
143
150
  # A block of code that should be executed after the successfully acquired lock.
144
151
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
@@ -147,7 +154,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
147
154
  #
148
155
  # @api private
149
156
  # @since 1.0.0
150
- # @version 1.8.0
157
+ # @version 1.9.0
151
158
  def acquire_lock(
152
159
  redis,
153
160
  lock_name,
@@ -176,9 +183,11 @@ module RedisQueuedLocks::Acquier::AcquireLock
176
183
  log_sampling_enabled:,
177
184
  log_sampling_percent:,
178
185
  log_sampler:,
186
+ log_sample_this:,
179
187
  instr_sampling_enabled:,
180
188
  instr_sampling_percent:,
181
189
  instr_sampler:,
190
+ instr_sample_this:,
182
191
  &block
183
192
  )
184
193
  # Step 0: Prevent argument type incompatabilities
@@ -195,6 +204,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
195
204
  # Step 0.2: prevent :meta incompatabiltiies (structure)
196
205
  if meta.is_a?(::Hash) && (meta.any? do |key, _value|
197
206
  key == 'acq_id' ||
207
+ key == 'hst_id' ||
198
208
  key == 'ts' ||
199
209
  key == 'ini_ttl' ||
200
210
  key == 'lock_key' ||
@@ -208,7 +218,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
208
218
  raise(
209
219
  RedisQueuedLocks::ArgumentError,
210
220
  '`:meta` keys can not overlap reserved lock data keys ' \
211
- '"acq_id", "ts", "ini_ttl", "lock_key", "rem_ttl", "spc_cnt", ' \
221
+ '"acq_id", "hst_id", "ts", "ini_ttl", "lock_key", "rem_ttl", "spc_cnt", ' \
212
222
  '"spc_ext_ttl", "l_spc_ext_ini_ttl", "l_spc_ext_ts", "l_spc_ts"'
213
223
  )
214
224
  end
@@ -221,6 +231,12 @@ module RedisQueuedLocks::Acquier::AcquireLock
221
231
  ractor_id,
222
232
  identity
223
233
  )
234
+ host_id = RedisQueuedLocks::Resource.host_identifier(
235
+ process_id,
236
+ thread_id,
237
+ ractor_id,
238
+ identity
239
+ )
224
240
  lock_ttl = ttl
225
241
  lock_key = RedisQueuedLocks::Resource.prepare_lock_key(lock_name)
226
242
  lock_key_queue = RedisQueuedLocks::Resource.prepare_lock_queue(lock_name)
@@ -228,11 +244,13 @@ module RedisQueuedLocks::Acquier::AcquireLock
228
244
 
229
245
  log_sampled = RedisQueuedLocks::Logging.should_log?(
230
246
  log_sampling_enabled,
247
+ log_sample_this,
231
248
  log_sampling_percent,
232
249
  log_sampler
233
250
  )
234
251
  instr_sampled = RedisQueuedLocks::Instrument.should_instrument?(
235
252
  instr_sampling_enabled,
253
+ instr_sample_this,
236
254
  instr_sampling_percent,
237
255
  instr_sampler
238
256
  )
@@ -257,6 +275,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
257
275
  lock_key_queue,
258
276
  queue_ttl,
259
277
  acquier_id,
278
+ host_id,
260
279
  access_strategy,
261
280
  log_sampled,
262
281
  instr_sampled
@@ -264,8 +283,8 @@ module RedisQueuedLocks::Acquier::AcquireLock
264
283
  end
265
284
 
266
285
  LogVisitor.start_lock_obtaining(
267
- logger, log_sampled,
268
- lock_key, queue_ttl, acquier_id, access_strategy
286
+ logger, log_sampled, lock_key,
287
+ queue_ttl, acquier_id, host_id, access_strategy
269
288
  )
270
289
 
271
290
  # Step 2: try to lock with timeout
@@ -284,8 +303,8 @@ module RedisQueuedLocks::Acquier::AcquireLock
284
303
  while acq_process[:should_try]
285
304
 
286
305
  LogVisitor.start_try_to_lock_cycle(
287
- logger, log_sampled,
288
- lock_key, queue_ttl, acquier_id, access_strategy
306
+ logger, log_sampled, lock_key,
307
+ queue_ttl, acquier_id, host_id, access_strategy
289
308
  )
290
309
 
291
310
  # Step 2.X: check the actual score: is it in queue ttl limit or not?
@@ -294,8 +313,8 @@ module RedisQueuedLocks::Acquier::AcquireLock
294
313
  acquier_position = RedisQueuedLocks::Resource.calc_initial_acquier_position
295
314
 
296
315
  LogVisitor.dead_score_reached__reset_acquier_position(
297
- logger, log_sampled,
298
- lock_key, queue_ttl, acquier_id, access_strategy
316
+ logger, log_sampled, lock_key,
317
+ queue_ttl, acquier_id, host_id, access_strategy
299
318
  )
300
319
  end
301
320
 
@@ -306,6 +325,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
306
325
  lock_key,
307
326
  lock_key_queue,
308
327
  acquier_id,
328
+ host_id,
309
329
  acquier_position,
310
330
  lock_ttl,
311
331
  queue_ttl,
@@ -330,35 +350,35 @@ module RedisQueuedLocks::Acquier::AcquireLock
330
350
  if acq_process[:result][:process] == :extendable_conflict_work_through
331
351
  # instrumetnation: (reentrant lock with ttl extension)
332
352
  LogVisitor.extendable_reentrant_lock_obtained(
333
- logger, log_sampled,
334
- result[:lock_key], queue_ttl, acquier_id, acq_time, access_strategy
353
+ logger, log_sampled, result[:lock_key],
354
+ queue_ttl, acquier_id, host_id, acq_time, access_strategy
335
355
  )
336
356
  InstrVisitor.extendable_reentrant_lock_obtained(
337
- instrumenter, instr_sampled,
338
- result[:lock_key], result[:ttl], result[:acq_id], result[:ts], acq_time,
357
+ instrumenter, instr_sampled, result[:lock_key],
358
+ result[:ttl], result[:acq_id], result[:hst_id], result[:ts], acq_time,
339
359
  instrument
340
360
  )
341
361
  elsif acq_process[:result][:process] == :conflict_work_through
342
362
  # instrumetnation: (reentrant lock without ttl extension)
343
363
  LogVisitor.reentrant_lock_obtained(
344
- logger, log_sampled,
345
- result[:lock_key], queue_ttl, acquier_id, acq_time, access_strategy
364
+ logger, log_sampled, result[:lock_key],
365
+ queue_ttl, acquier_id, host_id, acq_time, access_strategy
346
366
  )
347
367
  InstrVisitor.reentrant_lock_obtained(
348
- instrumenter, instr_sampled,
349
- result[:lock_key], result[:ttl], result[:acq_id], result[:ts], acq_time,
368
+ instrumenter, instr_sampled, result[:lock_key],
369
+ result[:ttl], result[:acq_id], result[:hst_id], result[:ts], acq_time,
350
370
  instrument
351
371
  )
352
372
  else
353
373
  # instrumentation: (classic lock obtain)
354
374
  # NOTE: classic is: acq_process[:result][:process] == :lock_obtaining
355
375
  LogVisitor.lock_obtained(
356
- logger, log_sampled,
357
- result[:lock_key], queue_ttl, acquier_id, acq_time, access_strategy
376
+ logger, log_sampled, result[:lock_key],
377
+ queue_ttl, acquier_id, host_id, acq_time, access_strategy
358
378
  )
359
379
  InstrVisitor.lock_obtained(
360
- instrumenter, instr_sampled,
361
- result[:lock_key], result[:ttl], result[:acq_id], result[:ts], acq_time,
380
+ instrumenter, instr_sampled, result[:lock_key],
381
+ result[:ttl], result[:acq_id], result[:hst_id], result[:ts], acq_time,
362
382
  instrument
363
383
  )
364
384
  end
@@ -367,6 +387,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
367
387
  acq_process[:lock_info] = {
368
388
  lock_key: result[:lock_key],
369
389
  acq_id: result[:acq_id],
390
+ hst_id: result[:hst_id],
370
391
  ts: result[:ts],
371
392
  ttl: result[:ttl],
372
393
  process: result[:process]
@@ -464,6 +485,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
464
485
  logger,
465
486
  lock_key,
466
487
  acquier_id,
488
+ host_id,
467
489
  access_strategy,
468
490
  timed,
469
491
  ttl_shift,
@@ -493,6 +515,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
493
515
  acq_process[:lock_info][:lock_key],
494
516
  acq_process[:lock_info][:ttl],
495
517
  acq_process[:lock_info][:acq_id],
518
+ acq_process[:lock_info][:hst_id],
496
519
  acq_process[:lock_info][:ts],
497
520
  acq_process[:acq_time],
498
521
  acq_process[:hold_time],
@@ -506,6 +529,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
506
529
  acq_process[:lock_info][:lock_key],
507
530
  acq_process[:lock_info][:ttl],
508
531
  acq_process[:lock_info][:acq_id],
532
+ acq_process[:lock_info][:hst_id],
509
533
  acq_process[:lock_info][:ts],
510
534
  acq_process[:lock_info][:lock_key],
511
535
  acq_process[:acq_time],
@@ -13,9 +13,11 @@ module RedisQueuedLocks::Acquier::ClearDeadRequests
13
13
  # @param log_sampling_enabled [Boolean]
14
14
  # @param log_sampling_percent [Integer]
15
15
  # @param log_sampler [#sampling_happened?,Module<RedisQueuedLocks::Logging::Sampler>]
16
+ # @param log_sample_this [Boolean]
16
17
  # @param instr_sampling_enabled [Boolean]
17
18
  # @param instr_sampling_percent [Integer]
18
19
  # @param instr_sampler [#sampling_happened?,Module<RedisQueuedLocks::Instrument::Sampler>]
20
+ # @param instr_sample_this [Boolean]
19
21
  # @return [Hash<Symbol,Boolean|Hash<Symbol,Set<String>>>]
20
22
  #
21
23
  # @api private
@@ -31,9 +33,11 @@ module RedisQueuedLocks::Acquier::ClearDeadRequests
31
33
  log_sampling_enabled,
32
34
  log_sampling_percent,
33
35
  log_sampler,
36
+ log_sample_this,
34
37
  instr_sampling_enabled,
35
38
  instr_sampling_percent,
36
- instr_sampler
39
+ instr_sampler,
40
+ instr_sample_this
37
41
  )
38
42
  dead_score = RedisQueuedLocks::Resource.acquier_dead_score(dead_ttl / 1_000.0)
39
43
 
@@ -22,9 +22,11 @@ module RedisQueuedLocks::Acquier::ExtendLockTTL
22
22
  # @param log_sampling_enabled [Boolean]
23
23
  # @param log_sampling_percent [Integer]
24
24
  # @param log_sampler [#sampling_happened?,Module<RedisQueuedLocks::Logging::Sampler>]
25
+ # @param log_sample_this [Boolean]
25
26
  # @param instr_sampling_enabled [Boolean]
26
27
  # @param instr_sampling_percent [Integer]
27
28
  # @param instr_sampler [#sampling_happened?,Module<RedisQueuedLocks::Instrument::Sampler>]
29
+ # @param instr_sample_this [Boolean]
28
30
  # @return [Hash<Symbol,Boolean|Symbol>]
29
31
  #
30
32
  # @api private
@@ -40,9 +42,11 @@ module RedisQueuedLocks::Acquier::ExtendLockTTL
40
42
  log_sampling_enabled,
41
43
  log_sampling_percent,
42
44
  log_sampler,
45
+ log_sample_this,
43
46
  instr_sampling_enabled,
44
47
  instr_sampling_percent,
45
- instr_sampler
48
+ instr_sampler,
49
+ instr_sample_this
46
50
  )
47
51
  lock_key = RedisQueuedLocks::Resource.prepare_lock_key(lock_name)
48
52
 
@@ -10,7 +10,8 @@ module RedisQueuedLocks::Acquier::LockInfo
10
10
  # - `nil` is returned when lock key does not exist or expired;
11
11
  # - result format: {
12
12
  # 'lock_key' => "rql:lock:your_lockname", # acquired lock key
13
- # 'acq_id' => "rql:acq:process_id/thread_id", # lock acquier identifier
13
+ # 'acq_id' => "rql:acq:123/456/789/987/uniqstring", # lock acquier identifier
14
+ # 'hst_id' => "rql:hst:123/456/987/uniqstring", # lock host identifier
14
15
  # 'ts' => 123456789.2649841, # <locked at> time stamp (epoch, seconds.microseconds)
15
16
  # 'ini_ttl' => 123456789, # initial lock key ttl (milliseconds)
16
17
  # 'rem_ttl' => 123456789, # remaining lock key ttl (milliseconds)
@@ -24,7 +25,7 @@ module RedisQueuedLocks::Acquier::LockInfo
24
25
  #
25
26
  # @api private
26
27
  # @since 1.0.0
27
- # @version 1.3.0
28
+ # @version 1.9.0
28
29
  # rubocop:disable Metrics/MethodLength
29
30
  def lock_info(redis_client, lock_name)
30
31
  lock_key = RedisQueuedLocks::Resource.prepare_lock_key(lock_name)
@@ -55,7 +56,7 @@ module RedisQueuedLocks::Acquier::LockInfo
55
56
  lock_data['lock_key'] = lock_key
56
57
  lock_data['ts'] = Float(lock_data['ts'])
57
58
  lock_data['ini_ttl'] = Integer(lock_data['ini_ttl'])
58
- lock_data['rem_ttl'] = ((pttl_cmd_res == -1) ? Infinity : pttl_cmd_res)
59
+ lock_data['rem_ttl'] = ((pttl_cmd_res == -1) ? Float::INFINITY : pttl_cmd_res)
59
60
  lock_data['spc_cnt'] = Integer(lock_data['spc_cnt']) if lock_data['spc_cnt']
60
61
  lock_data['l_spc_ts'] = Float(lock_data['l_spc_ts']) if lock_data['l_spc_ts']
61
62
  lock_data['spc_ext_ttl'] = Integer(lock_data['spc_ext_ttl']) if lock_data['spc_ext_ttl']
@@ -45,7 +45,7 @@ module RedisQueuedLocks::Acquier::Locks
45
45
  #
46
46
  # @api private
47
47
  # @since 1.0.0
48
- # @version 1.3.0
48
+ # @version 1.9.0
49
49
  # rubocop:disable Metrics/MethodLength
50
50
  def extract_locks_info(redis_client, lock_keys)
51
51
  # TODO: refactor with RedisQueuedLocks::Acquier::LockInfo
@@ -72,7 +72,7 @@ module RedisQueuedLocks::Acquier::Locks
72
72
  hget_cmd_res.tap do |lock_data|
73
73
  lock_data['ts'] = Float(lock_data['ts'])
74
74
  lock_data['ini_ttl'] = Integer(lock_data['ini_ttl'])
75
- lock_data['rem_ttl'] = ((pttl_cmd_res == -1) ? Infinity : pttl_cmd_res)
75
+ lock_data['rem_ttl'] = ((pttl_cmd_res == -1) ? Float::INFINITY : pttl_cmd_res)
76
76
  lock_data['spc_cnt'] = Integer(lock_data['spc_cnt']) if lock_data['spc_cnt']
77
77
  lock_data['l_spc_ts'] = Float(lock_data['l_spc_ts']) if lock_data['l_spc_ts']
78
78
  lock_data['spc_ext_ttl'] =
@@ -17,8 +17,8 @@ module RedisQueuedLocks::Acquier::QueueInfo
17
17
  # - result format: {
18
18
  # "lock_queue" => "rql:lock_queue:your_lock_name", # lock queue key in redis,
19
19
  # queue: [
20
- # { "acq_id" => "rql:acq:process_id/thread_id", "score" => 123 },
21
- # { "acq_id" => "rql:acq:process_id/thread_id", "score" => 456 },
20
+ # { "acq_id" => "rql:acq:123/456/789/987/identity", "score" => 123 },
21
+ # { "acq_id" => "rql:acq:123/686/789/987/identity", "score" => 456 },
22
22
  # ] # ordered set (by score) with information about an acquier and their position in queue
23
23
  # }
24
24
  #
@@ -40,6 +40,9 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks
40
40
  # - you can provide your own log sampler with bettter algorithm that should realize
41
41
  # `sampling_happened?(percent) => boolean` interface
42
42
  # (see `RedisQueuedLocks::Logging::Sampler` for example);
43
+ # @param log_sample_this [Boolean]
44
+ # - marks the method that everything should be logged despite the enabled log sampling;
45
+ # - makes sense when log sampling is enabled;
43
46
  # @param instr_sampling_enabled [Boolean]
44
47
  # - enables <instrumentaion sampling>: only the configured percent
45
48
  # of RQL cases will be instrumented;
@@ -58,6 +61,10 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks
58
61
  # - you can provide your own log sampler with bettter algorithm that should realize
59
62
  # `sampling_happened?(percent) => boolean` interface
60
63
  # (see `RedisQueuedLocks::Instrument::Sampler` for example);
64
+ # @param instr_sample_this [Boolean]
65
+ # - marks the method that everything should be instrumneted
66
+ # despite the enabled instrumentation sampling;
67
+ # - makes sense when instrumentation sampling is enabled;
61
68
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
62
69
  # Format: { ok: true, result: Hash<Symbol,Numeric> }
63
70
  #
@@ -73,18 +80,21 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks
73
80
  log_sampling_enabled,
74
81
  log_sampling_percent,
75
82
  log_sampler,
83
+ log_sample_this,
76
84
  instr_sampling_enabled,
77
85
  instr_sampling_percent,
78
- instr_sampler
86
+ instr_sampler,
87
+ instr_sample_this
79
88
  )
80
89
  rel_start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC, :microsecond)
81
90
  fully_release_all_locks(redis, batch_size) => { ok:, result: }
82
91
  time_at = Time.now.to_f
83
92
  rel_end_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC, :microsecond)
84
- rel_time = ((rel_end_time - rel_start_time) / 1_000).ceil(2)
93
+ rel_time = ((rel_end_time - rel_start_time) / 1_000.0).ceil(2)
85
94
 
86
95
  instr_sampled = RedisQueuedLocks::Instrument.should_instrument?(
87
96
  instr_sampling_enabled,
97
+ instr_sample_this,
88
98
  instr_sampling_percent,
89
99
  instr_sampler
90
100
  )
@@ -40,6 +40,9 @@ module RedisQueuedLocks::Acquier::ReleaseLock
40
40
  # - you can provide your own log sampler with bettter algorithm that should realize
41
41
  # `sampling_happened?(percent) => boolean` interface
42
42
  # (see `RedisQueuedLocks::Logging::Sampler` for example);
43
+ # @param log_sample_this [Boolean]
44
+ # - marks the method that everything should be logged despite the enabled log sampling;
45
+ # - makes sense when log sampling is enabled;
43
46
  # @param instr_sampling_enabled [Boolean]
44
47
  # - enables <instrumentaion sampling>: only the configured percent
45
48
  # of RQL cases will be instrumented;
@@ -58,6 +61,10 @@ module RedisQueuedLocks::Acquier::ReleaseLock
58
61
  # - you can provide your own log sampler with bettter algorithm that should realize
59
62
  # `sampling_happened?(percent) => boolean` interface
60
63
  # (see `RedisQueuedLocks::Instrument::Sampler` for example);
64
+ # @param instr_sample_this [Boolean]
65
+ # - marks the method that everything should be instrumneted
66
+ # despite the enabled instrumentation sampling;
67
+ # - makes sense when instrumentation sampling is enabled;
61
68
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Boolean<Hash<Symbol,Numeric|String|Symbol>>]
62
69
  # Format: { ok: true/false, result: Hash<Symbol,Numeric|String|Symbol> }
63
70
  #
@@ -73,9 +80,11 @@ module RedisQueuedLocks::Acquier::ReleaseLock
73
80
  log_sampling_enabled,
74
81
  log_sampling_percent,
75
82
  log_sampler,
83
+ log_sample_this,
76
84
  instr_sampling_enabled,
77
85
  instr_sampling_percent,
78
- instr_sampler
86
+ instr_sampler,
87
+ instr_sample_this
79
88
  )
80
89
  lock_key = RedisQueuedLocks::Resource.prepare_lock_key(lock_name)
81
90
  lock_key_queue = RedisQueuedLocks::Resource.prepare_lock_queue(lock_name)
@@ -84,10 +93,11 @@ module RedisQueuedLocks::Acquier::ReleaseLock
84
93
  fully_release_lock(redis, lock_key, lock_key_queue) => { ok:, result: }
85
94
  time_at = Time.now.to_f
86
95
  rel_end_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC, :microsecond)
87
- rel_time = ((rel_end_time - rel_start_time) / 1_000).ceil(2)
96
+ rel_time = ((rel_end_time - rel_start_time) / 1_000.0).ceil(2)
88
97
 
89
98
  instr_sampled = RedisQueuedLocks::Instrument.should_instrument?(
90
99
  instr_sampling_enabled,
100
+ instr_sample_this,
91
101
  instr_sampling_percent,
92
102
  instr_sampler
93
103
  )