redis_queued_locks 0.0.23 → 0.0.24

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05a8fc14cae41bf9870bedf4eae9fa298c3704b57d25df428c2e2c8bd9bf0223
4
- data.tar.gz: 14a941048edc7679df1d80805a96d3db4019d45acfc80ac5444d99e12cc3eadc
3
+ metadata.gz: b0c873b666d2c9f618789e6ef957e1ce7375da840bcbc1ce797d9e457bcc7d72
4
+ data.tar.gz: 9f9c4637fae7ca1a1e8bdc247e23f5c11977af7962f545ae084d05126106dad0
5
5
  SHA512:
6
- metadata.gz: 292f4ed74242a1a53b96e290e7759db0b1c918070f0875805bedbe78360fac71b6ac81ec09b63836002b2a17ab247ca06f9cf7ff828a4a07f924b2588e24fd3f
7
- data.tar.gz: 270749b6a32418e2a57b3995b5ef3b826b6066a97a56efd08f9305f0ed314ed7da13f9f395f891ab619ceea3d4bde53c880278758fbf42fb1e84b98fa5b14690
6
+ metadata.gz: 06c3a4ee60f8c5da6d9272ed99bff10315496c79e6c922431529b7f34da896e17fb08c73b389080f82c54e3714d89780950517e3beff469661bbbf6c4bdbaf0e
7
+ data.tar.gz: a0d7c9287c0a22923f2ddd4573ec6be63c0e274cff23fb5b2744b9cbd44368b7803b1ced3ffe9eefc53f0f2f23729177641535835bb6f97ede5f79074a308c4f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.0.24] - 2024-03-21
4
+ ### Added
5
+ - An optional ability to log each try of lock obtaining (see `RedisQueuedLocks::Acquier::AcquireLock::TryToLock.try_to_lock`);
6
+
3
7
  ## [0.0.23] - 2024-03-21
4
8
  ### Changed
5
9
  - Composed redis commands are invoked on the one conenction
data/README.md CHANGED
@@ -144,6 +144,11 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config|
144
144
  # - start of the lock expiration after `yield`: "[redis_queud_locks.expire_lock] lock_key => 'rql:lock:your_lock'"
145
145
  # - by default uses VoidLogger that does nothing;
146
146
  config.logger = RedisQueuedLocks::Logging::VoidLogger
147
+
148
+ # (default: false)
149
+ # - should be logged the each try of lock acquiring (a lot of logs can be generated depending on your retry configurations);
150
+ # - if logger is not cofnigured this option does not lead to any effect;
151
+ config.log_lock_try = false
147
152
  end
148
153
  ```
149
154
 
@@ -187,6 +192,8 @@ def lock(
187
192
  fail_fast: false,
188
193
  identity: uniq_identity, # (attr_accessor) calculated during client instantiation via config[:uniq_identifier] proc;
189
194
  metadata: nil,
195
+ logger: config[:logger],
196
+ log_lock_try: config[:log_lock_try],
190
197
  &block
191
198
  )
192
199
  ```
@@ -224,6 +231,12 @@ def lock(
224
231
  ivar (accessed via `uniq_dentity` accessor method);
225
232
  - `metadata` - `[NilClass,Any]`
226
233
  - A custom metadata wich will be passed to the instrumenter's payload with `:meta` key;
234
+ - `logger` - `[::Logger,#debug]`
235
+ - Logger object used from the configuration layer (see config[:logger]);
236
+ - See `RedisQueuedLocks::Logging::VoidLogger` for example;
237
+ - `log_lock_try` - `[Boolean]`
238
+ - should be logged the each try of lock acquiring (a lot of logs can be generated depending on your retry configurations);
239
+ - see `config[:log_lock_try]`;
227
240
  - `block` - `[Block]`
228
241
  - A block of code that should be executed after the successfully acquired lock.
229
242
  - If block is **passed** the obtained lock will be released after the block execution or it's ttl (what will happen first);
@@ -278,6 +291,8 @@ def lock!(
278
291
  identity: uniq_identity,
279
292
  fail_fast: false,
280
293
  metadata: nil,
294
+ logger: config[:logger],
295
+ log_lock_try: config[:log_lock_try],
281
296
  &block
282
297
  )
283
298
  ```
@@ -2,8 +2,14 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
+ # rubocop:disable Metrics/ModuleLength
5
6
  module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
7
+ # @since 0.1.0
8
+ extend RedisQueuedLocks::Utilities
9
+
6
10
  # @param redis [RedisClient]
11
+ # @param logger [::Logger,#debug]
12
+ # @param log_lock_try [Boolean]
7
13
  # @param lock_key [String]
8
14
  # @param lock_key_queue [String]
9
15
  # @param acquier_id [String]
@@ -18,6 +24,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
18
24
  # rubocop:disable Metrics/MethodLength
19
25
  def try_to_lock(
20
26
  redis,
27
+ logger,
28
+ log_lock_try,
21
29
  lock_key,
22
30
  lock_key_queue,
23
31
  acquier_id,
@@ -30,8 +38,20 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
30
38
  inter_result = nil
31
39
  timestamp = nil
32
40
 
41
+ if log_lock_try
42
+ run_non_critical do
43
+ logger.debug("[redis_queued_locks.try_lock_start] lock_key => '#{lock_key}'")
44
+ end
45
+ end
46
+
33
47
  # Step 0: watch the lock key changes (and discard acquirement if lock is already acquired)
34
48
  result = redis.with do |rconn|
49
+ if log_lock_try
50
+ run_non_critical do
51
+ logger.debug("[redis_queued_locks.try_lock_rconn_fetched] lock_key => '#{lock_key}'")
52
+ end
53
+ end
54
+
35
55
  rconn.multi(watch: [lock_key]) do |transact|
36
56
  # Fast-Step X0: fail-fast check
37
57
  if fail_fast && rconn.call('HGET', lock_key, 'acq_id')
@@ -182,3 +202,4 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
182
202
  RedisQueuedLocks::Data[ok: true, result: result]
183
203
  end
184
204
  end
205
+ # rubocop:enable Metrics/ModuleLength
@@ -7,7 +7,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldWithExpire
7
7
  extend RedisQueuedLocks::Utilities
8
8
 
9
9
  # @param redis [RedisClient] Redis connection manager.
10
- # @param logger [#debug] Logger object.
10
+ # @param logger [::Logger,#debug] Logger object.
11
11
  # @param lock_key [String] Lock key to be expired.
12
12
  # @param timed [Boolean] Should the lock be wrapped by Tiemlout with with lock's ttl
13
13
  # @param ttl_shift [Float] Lock's TTL shifting. Should affect block's ttl. In millisecodns.
@@ -69,9 +69,13 @@ module RedisQueuedLocks::Acquier::AcquireLock
69
69
  # already obtained.
70
70
  # @option metadata [NilClass,Any]
71
71
  # - A custom metadata wich will be passed to the instrumenter's payload with :meta key;
72
- # @option logger [#debug]
73
- # - Logger object used from `configuration` layer (see config[:logger]);
72
+ # @option logger [::Logger,#debug]
73
+ # - Logger object used from the configuration layer (see config[:logger]);
74
74
  # - See RedisQueuedLocks::Logging::VoidLogger for example;
75
+ # @option log_lock_try [Boolean]
76
+ # - should be logged the each try of lock acquiring (a lot of logs can be generated depending
77
+ # on your retry configurations);
78
+ # - see `config[:log_lock_try]`;
75
79
  # @param [Block]
76
80
  # A block of code that should be executed after the successfully acquired lock.
77
81
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
@@ -100,6 +104,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
100
104
  fail_fast:,
101
105
  metadata:,
102
106
  logger:,
107
+ log_lock_try:,
103
108
  &block
104
109
  )
105
110
  # Step 1: prepare lock requirements (generate lock name, calc lock ttl, etc).
@@ -146,6 +151,8 @@ module RedisQueuedLocks::Acquier::AcquireLock
146
151
  while acq_process[:should_try]
147
152
  try_to_lock(
148
153
  redis,
154
+ logger,
155
+ log_lock_try,
149
156
  lock_key,
150
157
  lock_key_queue,
151
158
  acquier_id,
@@ -7,7 +7,7 @@ module RedisQueuedLocks::Acquier::ExtendLockTTL
7
7
  # @param redis_client [RedisClient]
8
8
  # @param lock_name [String]
9
9
  # @param milliseconds [Integer]
10
- # @param logger [#debug]
10
+ # @param logger [::Logger,#debug]
11
11
  # @return [?]
12
12
  #
13
13
  # @api private
@@ -17,7 +17,7 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks
17
17
  # The number of lock keys that should be released in a time.
18
18
  # @param isntrumenter [#notify]
19
19
  # See RedisQueuedLocks::Instrument::ActiveSupport for example.
20
- # @param logger [#debug]
20
+ # @param logger [::Logger,#debug]
21
21
  # - Logger object used from `configuration` layer (see config[:logger]);
22
22
  # - See RedisQueuedLocks::Logging::VoidLogger for example;
23
23
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
@@ -20,7 +20,7 @@ module RedisQueuedLocks::Acquier::ReleaseLock
20
20
  # The lock name that should be released.
21
21
  # @param isntrumenter [#notify]
22
22
  # See RedisQueuedLocks::Instrument::ActiveSupport for example.
23
- # @param logger [#debug]
23
+ # @param logger [::Logger,#debug]
24
24
  # - Logger object used from `configuration` layer (see config[:logger]);
25
25
  # - See RedisQueuedLocks::Logging::VoidLogger for example;
26
26
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
@@ -19,6 +19,7 @@ class RedisQueuedLocks::Client
19
19
  setting :instrumenter, RedisQueuedLocks::Instrument::VoidNotifier
20
20
  setting :uniq_identifier, -> { RedisQueuedLocks::Resource.calc_uniq_identity }
21
21
  setting :logger, RedisQueuedLocks::Logging::VoidLogger
22
+ setting :log_lock_try, false
22
23
 
23
24
  validate('retry_count') { |val| val == nil || (val.is_a?(::Integer) && val >= 0) }
24
25
  validate('retry_delay') { |val| val.is_a?(::Integer) && val >= 0 }
@@ -28,8 +29,9 @@ class RedisQueuedLocks::Client
28
29
  validate('default_queue_ttl', :integer)
29
30
  validate('lock_release_batch_size', :integer)
30
31
  validate('instrumenter') { |val| RedisQueuedLocks::Instrument.valid_interface?(val) }
31
- validate('logger') { |val| RedisQueuedLocks::Logging.valid_interface?(val) }
32
32
  validate('uniq_identifier', :proc)
33
+ validate('logger') { |val| RedisQueuedLocks::Logging.valid_interface?(val) }
34
+ validate('log_lock_try', :boolean)
33
35
  end
34
36
 
35
37
  # @return [RedisClient]
@@ -93,6 +95,13 @@ class RedisQueuedLocks::Client
93
95
  # by another process while the lock request queue was initially empty;
94
96
  # @option metadata [NilClass,Any]
95
97
  # - A custom metadata wich will be passed to the instrumenter's payload with :meta key;
98
+ # @option logger [::Logger,#debug]
99
+ # - Logger object used from the configuration layer (see config[:logger]);
100
+ # - See `RedisQueuedLocks::Logging::VoidLogger` for example;
101
+ # @option log_lock_try [Boolean]
102
+ # - should be logged the each try of lock acquiring (a lot of logs can
103
+ # be generated depending on your retry configurations);
104
+ # - see `config[:log_lock_try]`;
96
105
  # @param block [Block]
97
106
  # A block of code that should be executed after the successfully acquired lock.
98
107
  # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
@@ -114,6 +123,8 @@ class RedisQueuedLocks::Client
114
123
  fail_fast: false,
115
124
  identity: uniq_identity,
116
125
  metadata: nil,
126
+ logger: config[:logger],
127
+ log_lock_try: config[:log_lock_try],
117
128
  &block
118
129
  )
119
130
  RedisQueuedLocks::Acquier::AcquireLock.acquire_lock(
@@ -136,6 +147,7 @@ class RedisQueuedLocks::Client
136
147
  fail_fast:,
137
148
  metadata:,
138
149
  logger: config[:logger],
150
+ log_lock_try: config[:log_lock_try],
139
151
  &block
140
152
  )
141
153
  end
@@ -156,6 +168,8 @@ class RedisQueuedLocks::Client
156
168
  fail_fast: false,
157
169
  identity: uniq_identity,
158
170
  metadata: nil,
171
+ logger: config[:logger],
172
+ log_lock_try: config[:log_lock_try],
159
173
  &block
160
174
  )
161
175
  lock(
@@ -6,7 +6,7 @@ module RedisQueuedLocks::Logging
6
6
  require_relative 'logging/void_logger'
7
7
 
8
8
  class << self
9
- # @param logger [#debug]
9
+ # @param logger [::Logger,#debug]
10
10
  # @return [Boolean]
11
11
  #
12
12
  # @api public
@@ -5,6 +5,6 @@ module RedisQueuedLocks
5
5
  #
6
6
  # @api public
7
7
  # @since 0.0.1
8
- # @version 0.0.23
9
- VERSION = '0.0.23'
8
+ # @version 0.0.24
9
+ VERSION = '0.0.24'
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_queued_locks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.23
4
+ version: 0.0.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov