redis_queued_locks 1.3.0 → 1.3.1
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 +6 -0
- data/README.md +24 -13
- data/lib/redis_queued_locks/acquier/acquire_lock.rb +2 -2
- data/lib/redis_queued_locks/version.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cac51b8b6c2a4986c188d7b419e11a282c4a18d6a32689000a2c9127f77eec3
|
4
|
+
data.tar.gz: d159e30574e503a714081dfda22d9085553818573ad968f745e302efe93edfde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ee000a0470297832a593a8719a192feb5fdf583003d49f8dfb3335dad4c63aff45730cc8d4481a02eb41f629e60d929349fcc1842025117bd5b35304a09c8cd
|
7
|
+
data.tar.gz: c7e52ef09012e29a2ac1495fedc287c7a51c5fee8ceac466f78d5de548e8231b7a5c8fc29626db28ca82629ac0294b4ded991cbf5902f97a76619279bed4e353
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [1.3.1] - 2024-05-10
|
4
|
+
### Fixed
|
5
|
+
- `:meta` attribute type validation of `#lock`/`#lock!` was incorrect;
|
6
|
+
### Added
|
7
|
+
- documentation updates and clarifications;
|
8
|
+
|
3
9
|
## [1.3.0] - 2024-05-08
|
4
10
|
### Added
|
5
11
|
- **Major Feature**: support for **Reentrant Locks**;
|
data/README.md
CHANGED
@@ -151,7 +151,9 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config|
|
|
151
151
|
config.is_timed_by_default = false
|
152
152
|
|
153
153
|
# (symbol) (default: :wait_for_lock)
|
154
|
-
# -
|
154
|
+
# - Global default conflict strategy mode;
|
155
|
+
# - Can be customized in methods `#lock` and `#lock` via `:conflict_strategy` attribute (see method signatures of #lock and #lock! methods);
|
156
|
+
# - Conflict strategy is a logical behavior for cases when the process that obtained the lock want to acquire this lock again;
|
155
157
|
# - Realizes "reentrant locks" abstraction (same process conflict / same process deadlock);
|
156
158
|
# - By default uses `:wait_for_lock` strategy (classic way);
|
157
159
|
# - Strategies:
|
@@ -159,7 +161,6 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config|
|
|
159
161
|
# - `:extendable_work_through` - continue working under the lock <with> lock's TTL extension;
|
160
162
|
# - `:wait_for_lock` - (default) - work in classic way (with timeouts, retry delays, retry limits, etc - in classic way :));
|
161
163
|
# - `:dead_locking` - fail with deadlock exception;
|
162
|
-
# - Can be customized in methods via `:conflict_strategy` attribute (see method signatures of #lock and #lock! methods);
|
163
164
|
# - See "Dead locks and Reentrant Locks" documentation section in REDME.md for details;
|
164
165
|
config.default_conflict_strategy = :wait_for_lock
|
165
166
|
|
@@ -262,10 +263,14 @@ end
|
|
262
263
|
|
263
264
|
<sup>\[[back to top](#usage)\]</sup>
|
264
265
|
|
265
|
-
-
|
266
|
-
- If block is
|
267
|
-
-
|
268
|
-
-
|
266
|
+
- `#lock` - obtain a lock;
|
267
|
+
- If block is passed:
|
268
|
+
- the obtained lock will be released after the block execution or the lock's ttl (what will happen first);
|
269
|
+
- if you want to timeout (fail with timeout) the block execution with lock's TTL use `timed: true` option;
|
270
|
+
- the block's result will be returned;
|
271
|
+
- If block is not passed:
|
272
|
+
- the obtained lock will be released after lock's ttl;
|
273
|
+
- the lock information will be returned (hash with technical info that contains: lock key, acquier identifier, acquirement timestamp, lock's ttl, type of obtaining process, etc);
|
269
274
|
|
270
275
|
```ruby
|
271
276
|
def lock(
|
@@ -543,10 +548,12 @@ rql.lock("my_lock", queue_ttl: 5, timeout: 10_000, retry_count: nil)
|
|
543
548
|
|
544
549
|
<sup>\[[back to top](#usage)\]</sup>
|
545
550
|
|
551
|
+
- `#lock!` - exceptional lock obtaining;
|
546
552
|
- fails when (and with):
|
547
553
|
- (`RedisQueuedLocks::LockAlreadyObtainedError`) when `fail_fast` is `true` and lock is already obtained;
|
548
554
|
- (`RedisQueuedLocks::LockAcquiermentTimeoutError`) `timeout` limit reached before lock is obtained;
|
549
555
|
- (`RedisQueuedLocks::LockAcquiermentRetryLimitError`) `retry_count` limit reached before lock is obtained;
|
556
|
+
- (`RedisQueuedLocks::ConflictLockObtainError`) when `conflict_strategy: :dead_locking` is used and the "same-process-dead-lock" is happened (see [Dead locks and Reentrant locks](#dead-locks-and-reentrant-locks) for details);
|
550
557
|
|
551
558
|
```ruby
|
552
559
|
def lock!(
|
@@ -648,7 +655,7 @@ rql.lock_info("your_lock_name")
|
|
648
655
|
# ==> keys for extendable reentarnt locks with `:extendable_work_through` strategy:
|
649
656
|
"spc_ext_ttl" => 5_000, # sum of TTL of the each <extendable> reentrant lock (3_000 + 2_000)
|
650
657
|
"l_spc_ext_ini_ttl" => 2_000, # TTL of the last <extendable> reentrant lock
|
651
|
-
"l_spc_ext_ts" => 123456792.12345 # timestamp of the last <extendable> reentrant lock obtaining
|
658
|
+
"l_spc_ext_ts" => 123456792.12345, # timestamp of the last <extendable> reentrant lock obtaining
|
652
659
|
# ==> keys for non-extendable locks with `:work_through` strategy:
|
653
660
|
"l_spc_ts" => 123456.789 # timestamp of the last <non-extendable> reentrant lock obtaining
|
654
661
|
}
|
@@ -1073,13 +1080,17 @@ rql.clear_dead_requests(dead_ttl: 60 * 60 * 1000) # 1 hour in milliseconds
|
|
1073
1080
|
|
1074
1081
|
<sup>\[[back to top](#table-of-contents)\]</sup>
|
1075
1082
|
|
1076
|
-
- **documentation is in progress
|
1077
|
-
- (little details for a context of current implementation and feautres):
|
1078
|
-
- at this moment we support only **reentrant locks**: they works via customizable conflict strategy behavior
|
1079
|
-
|
1083
|
+
- **this documentation section is in progress**;
|
1084
|
+
- (little details for a context of the current implementation and feautres):
|
1085
|
+
- at this moment we support only **reentrant locks**: they works via customizable conflict strategy behavior
|
1086
|
+
(`:wait_for_lock` (default), `:work_through`, `:extendable_work_through`, `:dead_locking`);
|
1087
|
+
- by default behavior (`:wait_for_lock`) your lock obtaining process will work in a classic way (limits, retries, etc);
|
1088
|
+
- `:work_through`, `:extendable_work_through` works with limits too (timeouts, delays, etc), but the decision of
|
1089
|
+
"is your lock are obtained or not" is made as you work with **reentrant locks** (your process continues to use the lock without/without
|
1090
|
+
lock's TTL accordingly);
|
1080
1091
|
- for current implementation details check:
|
1081
|
-
- (
|
1082
|
-
- (#lock)
|
1092
|
+
- [Configuration](#configuration) documentation: see `config.default_conflict_strategy` config docs;
|
1093
|
+
- [#lock](#lock---obtain-a-lock) method documentation: see `conflict_strategy` attribute docs and the method result data;
|
1083
1094
|
|
1084
1095
|
---
|
1085
1096
|
|
@@ -94,7 +94,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
|
|
94
94
|
#
|
95
95
|
# @api private
|
96
96
|
# @since 1.0.0
|
97
|
-
# @version 1.3.
|
97
|
+
# @version 1.3.1
|
98
98
|
def acquire_lock(
|
99
99
|
redis,
|
100
100
|
lock_name,
|
@@ -132,7 +132,7 @@ module RedisQueuedLocks::Acquier::AcquireLock
|
|
132
132
|
end
|
133
133
|
|
134
134
|
# Step 0.2: prevent :meta incompatabiltiies (structure)
|
135
|
-
if meta
|
135
|
+
if meta.is_a?(::Hash) && (meta.keys.any? do |key|
|
136
136
|
key == 'acq_id' ||
|
137
137
|
key == 'ts' ||
|
138
138
|
key == 'ini_ttl' ||
|
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: 1.3.
|
4
|
+
version: 1.3.1
|
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-05-
|
11
|
+
date: 2024-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|
@@ -108,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
|
-
rubygems_version: 3.
|
111
|
+
rubygems_version: 3.5.1
|
112
112
|
signing_key:
|
113
113
|
specification_version: 4
|
114
114
|
summary: Queued distributed locks based on Redis.
|