redis_queued_locks 0.0.17 → 0.0.18
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +2 -1
- data/lib/redis_queued_locks/acquier/release.rb +4 -4
- data/lib/redis_queued_locks/acquier/try.rb +9 -6
- data/lib/redis_queued_locks/acquier.rb +27 -13
- data/lib/redis_queued_locks/client.rb +7 -4
- data/lib/redis_queued_locks/data.rb +5 -0
- data/lib/redis_queued_locks/version.rb +2 -2
- data/lib/redis_queued_locks.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0993079d1a7cca97094c741d65c4ef1e8a5694184212b6597960e0b3c91d83cb'
|
4
|
+
data.tar.gz: 22535e254fa22db6bfb0225f391e3d4606ad680bb401034fcbdfcd8e93a1fc5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7db77251aefc59a83a9727d756774f5eb6b30a156fd058d69ec5170d252cc8fb875b2f213da2e15a4bdf9f5565565aa5ca699545ac0a83dcbc333fbed8c7aec1
|
7
|
+
data.tar.gz: 659c47a6aaa421ade9c7ffaea000a7133c1ba72f5ab0a2e66bc56f5ad72f84f4d9525fc86024e5d52b8196a6dfc7b0a714100462915a91405c97c3b3d77d3e26
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.0.18] - 2024-03-04
|
4
|
+
### Changed
|
5
|
+
- Semantic results for methods returning `{ ok: true/false, result: Any }` hash objects.
|
6
|
+
Now these objects are represented as `RedisQueuedLocks::Data` objects inherited from `Hash`;
|
7
|
+
|
3
8
|
## [0.0.17] - 2024-02-29
|
4
9
|
### Added
|
5
10
|
- `RedisQueuedLocks::Client#locks` - list of obtained locks;
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# RedisQueuedLocks
|
1
|
+
# RedisQueuedLocks
|
2
2
|
|
3
3
|
Distributed locks with "lock acquisition queue" capabilities based on the Redis Database.
|
4
4
|
|
@@ -244,6 +244,7 @@ Return value:
|
|
244
244
|
#### #lock! - exceptional lock obtaining
|
245
245
|
|
246
246
|
- fails when (and with):
|
247
|
+
- (`RedisQueuedLocks::LockAlreadyObtainedError`) when `fail_fast` is `true` and lock is already obtained;
|
247
248
|
- (`RedisQueuedLocks::LockAcquiermentTimeoutError`) `timeout` limit reached before lock is obtained;
|
248
249
|
- (`RedisQueuedLocks::LockAcquiermentRetryLimitError`) `retry_count` limit reached before lock is obtained;
|
249
250
|
|
@@ -8,7 +8,7 @@ module RedisQueuedLocks::Acquier::Release
|
|
8
8
|
# @param redis [RedisClient]
|
9
9
|
# @param lock_key [String]
|
10
10
|
# @param lock_key_queue [String]
|
11
|
-
# @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
|
11
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
|
12
12
|
#
|
13
13
|
# @api private
|
14
14
|
# @since 0.1.0
|
@@ -18,14 +18,14 @@ module RedisQueuedLocks::Acquier::Release
|
|
18
18
|
transact.call('EXPIRE', lock_key, '0')
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
RedisQueuedLocks::Data[ok: true, result:]
|
22
22
|
end
|
23
23
|
|
24
24
|
# Release all locks: clear all lock queus and expire all locks.
|
25
25
|
#
|
26
26
|
# @param redis [RedisClient]
|
27
27
|
# @param batch_size [Integer]
|
28
|
-
# @return [Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
|
28
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>] Format: { ok: true/false, result: Any }
|
29
29
|
#
|
30
30
|
# @api private
|
31
31
|
# @since 0.1.0
|
@@ -55,6 +55,6 @@ module RedisQueuedLocks::Acquier::Release
|
|
55
55
|
|
56
56
|
rel_keys = result.count { |red_res| red_res == 0 }
|
57
57
|
|
58
|
-
|
58
|
+
RedisQueuedLocks::Data[ok: true, result: { rel_keys: rel_keys }]
|
59
59
|
end
|
60
60
|
end
|
@@ -130,13 +130,13 @@ module RedisQueuedLocks::Acquier::Try
|
|
130
130
|
case
|
131
131
|
when fail_fast && inter_result == :fail_fast_no_try
|
132
132
|
# Step 7.a: lock is still acquired and we should exit from the logic as soon as possible
|
133
|
-
|
133
|
+
RedisQueuedLocks::Data[ok: false, result: inter_result]
|
134
134
|
when inter_result == :lock_is_still_acquired || inter_result == :acquier_is_not_first_in_queue
|
135
135
|
# Step 7.b: lock is still acquired by another process => failed to acquire
|
136
|
-
|
136
|
+
RedisQueuedLocks::Data[ok: false, result: inter_result]
|
137
137
|
when result == nil || (result.is_a?(::Array) && result.empty?)
|
138
138
|
# Step 7.c: lock is already acquired durign the acquire race => failed to acquire
|
139
|
-
|
139
|
+
RedisQueuedLocks::Data[ok: false, result: :lock_is_acquired_during_acquire_race]
|
140
140
|
when result.is_a?(::Array) && result.size == 3 # NOTE: 3 is a count of redis lock commands
|
141
141
|
# TODO:
|
142
142
|
# => (!) analyze the command result and do actions with the depending on it;
|
@@ -147,10 +147,13 @@ module RedisQueuedLocks::Acquier::Try
|
|
147
147
|
# 3. pexpire should return 1 (expiration time is successfully applied)
|
148
148
|
|
149
149
|
# Step 7.d: locked! :) let's go! => successfully acquired
|
150
|
-
|
150
|
+
RedisQueuedLocks::Data[
|
151
|
+
ok: true,
|
152
|
+
result: { lock_key: lock_key, acq_id: acquier_id, ts: timestamp, ttl: ttl }
|
153
|
+
]
|
151
154
|
else
|
152
155
|
# Ste 7.3: unknown behaviour :thinking:
|
153
|
-
|
156
|
+
RedisQueuedLocks::Data[ok: false, result: :unknown]
|
154
157
|
end
|
155
158
|
# rubocop:enable Lint/DuplicateBranch
|
156
159
|
end
|
@@ -170,6 +173,6 @@ module RedisQueuedLocks::Acquier::Try
|
|
170
173
|
"Step ~ [СМЕРТЬ ПРОЦЕССА]: [#{acquier_id} :: #{lock_key_queue}] РЕЗУЛЬТАТ: #{result}"
|
171
174
|
)
|
172
175
|
|
173
|
-
|
176
|
+
RedisQueuedLocks::Data[ok: true, result: result]
|
174
177
|
end
|
175
178
|
end
|
@@ -63,7 +63,7 @@ module RedisQueuedLocks::Acquier
|
|
63
63
|
# already obtained.
|
64
64
|
# @param [Block]
|
65
65
|
# A block of code that should be executed after the successfully acquired lock.
|
66
|
-
# @return [Hash<Symbol,Any>,yield]
|
66
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
|
67
67
|
# - Format: { ok: true/false, result: Any }
|
68
68
|
# - If block is given the result of block's yeld will be returned.
|
69
69
|
#
|
@@ -232,7 +232,7 @@ module RedisQueuedLocks::Acquier
|
|
232
232
|
end
|
233
233
|
end
|
234
234
|
else
|
235
|
-
|
235
|
+
RedisQueuedLocks::Data[ok: true, result: acq_process[:lock_info]]
|
236
236
|
end
|
237
237
|
else
|
238
238
|
if acq_process[:result] != :retry_limit_reached &&
|
@@ -245,7 +245,7 @@ module RedisQueuedLocks::Acquier
|
|
245
245
|
acq_process[:result] = :timeout_reached
|
246
246
|
end
|
247
247
|
# Step 3.b: lock is not acquired (acquier is dequeued by timeout callback)
|
248
|
-
|
248
|
+
RedisQueuedLocks::Data[ok: false, result: acq_process[:result]]
|
249
249
|
end
|
250
250
|
end
|
251
251
|
# rubocop:enable Metrics/MethodLength, Metrics/BlockNesting
|
@@ -257,10 +257,14 @@ module RedisQueuedLocks::Acquier
|
|
257
257
|
# It is safe because the lock obtain logic is transactional and
|
258
258
|
# watches the original lock for changes.
|
259
259
|
#
|
260
|
-
# @param redis [RedisClient]
|
261
|
-
#
|
262
|
-
# @param
|
263
|
-
#
|
260
|
+
# @param redis [RedisClient]
|
261
|
+
# Redis connection client.
|
262
|
+
# @param lock_name [String]
|
263
|
+
# The lock name that should be released.
|
264
|
+
# @param isntrumenter [#notify]
|
265
|
+
# See RedisQueuedLocks::Instrument::ActiveSupport for example.
|
266
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
|
267
|
+
# Format: { ok: true/false, result: Hash<Symbil,Numeric|String> }
|
264
268
|
#
|
265
269
|
# @api private
|
266
270
|
# @since 0.1.0
|
@@ -283,17 +287,24 @@ module RedisQueuedLocks::Acquier
|
|
283
287
|
})
|
284
288
|
end
|
285
289
|
|
286
|
-
|
290
|
+
RedisQueuedLocks::Data[
|
291
|
+
ok: true,
|
292
|
+
result: { rel_time: rel_time, rel_key: lock_key, rel_queue: lock_key_queue }
|
293
|
+
]
|
287
294
|
end
|
288
295
|
|
289
296
|
# Release all locks:
|
290
297
|
# - 1. clear all lock queus: drop them all from Redis database by the lock queue pattern;
|
291
298
|
# - 2. delete all locks: drop lock keys from Redis by the lock key pattern;
|
292
299
|
#
|
293
|
-
# @param redis [RedisClient]
|
294
|
-
#
|
295
|
-
# @param
|
296
|
-
#
|
300
|
+
# @param redis [RedisClient]
|
301
|
+
# Redis connection client.
|
302
|
+
# @param batch_size [Integer]
|
303
|
+
# The number of lock keys that should be released in a time.
|
304
|
+
# @param isntrumenter [#notify]
|
305
|
+
# See RedisQueuedLocks::Instrument::ActiveSupport for example.
|
306
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
|
307
|
+
# Format: { ok: true/false, result: Hash<Symbol,Numeric> }
|
297
308
|
#
|
298
309
|
# @api private
|
299
310
|
# @since 0.1.0
|
@@ -312,7 +323,10 @@ module RedisQueuedLocks::Acquier
|
|
312
323
|
})
|
313
324
|
end
|
314
325
|
|
315
|
-
|
326
|
+
RedisQueuedLocks::Data[
|
327
|
+
ok: true,
|
328
|
+
result: { rel_key_cnt: result[:rel_keys], rel_time: rel_time }
|
329
|
+
]
|
316
330
|
end
|
317
331
|
|
318
332
|
# @param redis_client [RedisClient]
|
@@ -92,7 +92,7 @@ class RedisQueuedLocks::Client
|
|
92
92
|
# by another process while the lock request queue was initially empty;
|
93
93
|
# @param block [Block]
|
94
94
|
# A block of code that should be executed after the successfully acquired lock.
|
95
|
-
# @return [Hash<Symbol,Any>,yield]
|
95
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
|
96
96
|
# - Format: { ok: true/false, result: Symbol/Hash }.
|
97
97
|
# - If block is given the result of block's yeld will be returned.
|
98
98
|
#
|
@@ -163,8 +163,10 @@ class RedisQueuedLocks::Client
|
|
163
163
|
)
|
164
164
|
end
|
165
165
|
|
166
|
-
# @param lock_name [String]
|
167
|
-
#
|
166
|
+
# @param lock_name [String]
|
167
|
+
# The lock name that should be released.
|
168
|
+
# @return [RedisQueuedLocks::Data, Hash<Symbol,Any>]
|
169
|
+
# Format: { ok: true/false, result: Symbol/Hash }.
|
168
170
|
#
|
169
171
|
# @api public
|
170
172
|
# @since 0.1.0
|
@@ -219,7 +221,8 @@ class RedisQueuedLocks::Client
|
|
219
221
|
end
|
220
222
|
|
221
223
|
# @option batch_size [Integer]
|
222
|
-
# @return [Hash<Symbol,Any>]
|
224
|
+
# @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
|
225
|
+
# Format: { ok: true/false, result: Symbol/Hash }.
|
223
226
|
#
|
224
227
|
# @api public
|
225
228
|
# @since 0.1.0
|
data/lib/redis_queued_locks.rb
CHANGED
@@ -10,6 +10,7 @@ require 'securerandom'
|
|
10
10
|
module RedisQueuedLocks
|
11
11
|
require_relative 'redis_queued_locks/version'
|
12
12
|
require_relative 'redis_queued_locks/errors'
|
13
|
+
require_relative 'redis_queued_locks/data'
|
13
14
|
require_relative 'redis_queued_locks/debugger'
|
14
15
|
require_relative 'redis_queued_locks/resource'
|
15
16
|
require_relative 'redis_queued_locks/acquier'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_queued_locks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rustam Ibragimov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- lib/redis_queued_locks/acquier/release.rb
|
62
62
|
- lib/redis_queued_locks/acquier/try.rb
|
63
63
|
- lib/redis_queued_locks/client.rb
|
64
|
+
- lib/redis_queued_locks/data.rb
|
64
65
|
- lib/redis_queued_locks/debugger.rb
|
65
66
|
- lib/redis_queued_locks/debugger/interface.rb
|
66
67
|
- lib/redis_queued_locks/errors.rb
|