redis_queued_locks 0.0.32 → 0.0.34
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 +14 -4
- data/README.md +22 -17
- data/lib/redis_queued_locks/acquier/acquire_lock/try_to_lock.rb +9 -5
- data/lib/redis_queued_locks/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62b1870f7a71fb878167216b1f05a90f82c60b8a0da513dfad1edae8a87618a5
|
4
|
+
data.tar.gz: 705c1e47d0f4823e38f749f24e82700ce33d749e187c0ae98ff9bd5ff21aa142
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cba6bd786d8db210d907bd5af41497aa3f34e026f2ecfb87f53e857f91d2278109c116a91bd767bffa4685c48f6a6d76be6054b93ffaea0e858f0d6a2ed29db1
|
7
|
+
data.tar.gz: 05fa884031b73de440c10442a46d2c328fb118d0e8c7447d241b6d5e2391408affddf964b7ae210038bc40f620009a38537cccbe418c9dc6ea562f7f50b76537
|
data/CHANGELOG.md
CHANGED
@@ -1,20 +1,30 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.0.34] - 2024-03-26
|
4
|
+
### Changed
|
5
|
+
- Removing the acquirer from the request queue during a lock obtaining logic now using more proper and accurate `ZREM` instead of `ZPOPMIN` for this;
|
6
|
+
|
7
|
+
## [0.0.33] - 2024-03-26
|
8
|
+
### Added
|
9
|
+
- Logging: added current lock data info to the detailed `#try_to_lock` log to the cases when lock is still obtained. It is suitable
|
10
|
+
when you pass a custom metadata with lock obtainer (for example: the current string of code) and want to see this information
|
11
|
+
in logs when you can not acquire the concrete lock long time;
|
12
|
+
|
3
13
|
## [0.0.32] - 2024-03-26
|
4
14
|
### Added
|
5
15
|
- Support for custom metadata that merged to the lock data. This data also returned from `RedisQueudLocks::Client#lock_info` method;
|
6
|
-
- Custom metadata
|
16
|
+
- Custom metadata should be represented as a `key => value` `Hash` (`nil` by default);
|
7
17
|
- Custom metadata values is returned as raw data from Redis (commonly as strings);
|
8
18
|
- Custom metadata can not contain reserved lock data keys;
|
9
19
|
- Reduced some memory consuption;
|
10
20
|
### Changed
|
11
|
-
- `RedisQueuedLocks::Client#lock_info
|
12
|
-
- `RedisQueuedLocks::Client#queue_info
|
21
|
+
- `RedisQueuedLocks::Client#lock_info`: hash key types of method result is changed from `Symbol` type to `String` type;
|
22
|
+
- `RedisQueuedLocks::Client#queue_info`: hash key types of method result is changed from `Symbol` type to `String` type;
|
13
23
|
|
14
24
|
## [0.0.31] - 2024-03-25
|
15
25
|
### Changed
|
16
26
|
- `:metadata` renamed to `:instrument` in order to reflect it's domain area;
|
17
|
-
- `:metadata` is renamed to `:meta` and reserved for
|
27
|
+
- `:metadata` is renamed to `:meta` and reserved for future updates;
|
18
28
|
|
19
29
|
## [0.0.30] - 2024-03-23
|
20
30
|
### Fixed
|
data/README.md
CHANGED
@@ -108,7 +108,7 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config|
|
|
108
108
|
config.default_lock_ttl = 5_000
|
109
109
|
|
110
110
|
# (seconds) (default: 15)
|
111
|
-
# - lock request timeout. after this timeout your lock request in queue will be requeued;
|
111
|
+
# - lock request timeout. after this timeout your lock request in queue will be requeued with new position (at the end of the queue);
|
112
112
|
config.default_queue_ttl = 15
|
113
113
|
|
114
114
|
# (default: 100)
|
@@ -140,19 +140,27 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config|
|
|
140
140
|
# (default: RedisQueuedLocks::Logging::VoidLogger)
|
141
141
|
# - the logger object;
|
142
142
|
# - should implement `debug(progname = nil, &block)` (minimal requirement) or be an instance of Ruby's `::Logger` class/subclass;
|
143
|
-
# - at this moment the only debug logs are realised in
|
144
|
-
# -
|
145
|
-
# -
|
146
|
-
# -
|
143
|
+
# - at this moment the only debug logs are realised in following cases:
|
144
|
+
# - "[redis_queued_locks.start_lock_obtaining]" (logs "lock_key", "queue_ttl", "acq_id");
|
145
|
+
# - "[redis_queued_locks.start_try_to_lock_cycle]" (logs "lock_key", "queue_ttl", "acq_id");
|
146
|
+
# - "[redis_queued_locks.dead_score_reached__reset_acquier_position]" (logs "lock_key", "queue_ttl", "acq_id");
|
147
|
+
# - "[redis_queued_locks.lock_obtained]" (logs "lockkey", "queue_ttl", "acq_id", "acq_time");
|
147
148
|
# - by default uses VoidLogger that does nothing;
|
148
149
|
config.logger = RedisQueuedLocks::Logging::VoidLogger
|
149
150
|
|
150
151
|
# (default: false)
|
151
|
-
# -
|
152
|
-
# -
|
153
|
-
#
|
154
|
-
# -
|
155
|
-
#
|
152
|
+
# - adds additional debug logs;
|
153
|
+
# - enables additional logs for each internal try-retry lock acquiring (a lot of logs can be generated depending on your retry configurations);
|
154
|
+
# - it adds following logs in addition to the existing:
|
155
|
+
# - "[redis_queued_locks.try_lock.start]" (logs "lock_key", "queue_ttl", "acq_id");
|
156
|
+
# - "[redis_queued_locks.try_lock.rconn_fetched]" (logs "lock_key", "queue_ttl", "acq_id");
|
157
|
+
# - "[redis_queued_locks.try_lock.acq_added_to_queue]" (logs "lock_key", "queue_ttl", "acq_id)";
|
158
|
+
# - "[redis_queued_locks.try_lock.remove_expired_acqs]" (logs "lock_key", "queue_ttl", "acq_id");
|
159
|
+
# - "[redis_queued_locks.try_lock.get_first_from_queue]" (logs "lock_key", "queue_ttl", "acq_id", "first_acq_id_in_queue");
|
160
|
+
# - "[redis_queued_locks.try_lock.exit__queue_ttl_reached]" (logs "lock_key", "queue_ttl", "acq_id");
|
161
|
+
# - "[redis_queued_locks.try_lock.exit__no_first]" (logs "lock_key", "queue_ttl", "acq_id", "first_acq_id_in_queue", "<current_lock_data>");
|
162
|
+
# - "[redis_queued_locks.try_lock.exit__still_obtained]" (logs "lock_key", "queue_ttl", "acq_id", "first_acq_id_in_queue", "locked_by_acq_id", "<current_lock_data>");
|
163
|
+
# - "[redis_queued_locks.try_lock.run__free_to_acquire]" (logs "lock_key", "queue_ttl", "acq_id");
|
156
164
|
config.log_lock_try = false
|
157
165
|
end
|
158
166
|
```
|
@@ -321,8 +329,7 @@ See `#lock` method [documentation](#lock---obtain-a-lock).
|
|
321
329
|
- `"ts"` - `integer`/`epoch` - the time lock was obtained;
|
322
330
|
- `"init_ttl"` - `integer` - (milliseconds) initial lock key ttl;
|
323
331
|
- `"rem_ttl"` - `integer` - (milliseconds) remaining lock key ttl;
|
324
|
-
- custom metadata
|
325
|
-
methods via `meta:` keyword argument (see [lock]((#lock---obtain-a-lock)) method documentation);
|
332
|
+
- `custom metadata`- `string`/`integer` - custom metadata passed to the `lock`/`lock!` methods via `meta:` keyword argument (see [lock]((#lock---obtain-a-lock)) method documentation);
|
326
333
|
|
327
334
|
```ruby
|
328
335
|
# without custom metadata
|
@@ -631,16 +638,14 @@ Detalized event semantics and payload structure:
|
|
631
638
|
- `100%` test coverage;
|
632
639
|
- per-block-holding-the-lock sidecar `Ractor` and `in progress queue` in RedisDB that will extend
|
633
640
|
the acquired lock for long-running blocks of code (that invoked "under" the lock
|
634
|
-
whose ttl may expire before the block execution completes). It only makes
|
635
|
-
(for those locks where otaned with `timed: false` option);
|
636
|
-
- an ability to add custom metadata to the lock and an ability to read this data;
|
641
|
+
whose ttl may expire before the block execution completes). It only makes sense for non-`timed` locks;
|
637
642
|
- lock prioritization;
|
638
643
|
- support for LIFO strategy;
|
639
|
-
- structured logging;
|
644
|
+
- structured logging (separated docs);
|
640
645
|
- GitHub Actions CI;
|
641
646
|
- `RedisQueuedLocks::Acquier::Try.try_to_lock` - detailed successful result analization;
|
642
647
|
- better code stylization and interesting refactorings;
|
643
|
-
- dead queue cleanup;
|
648
|
+
- dead queue keys cleanup (empty queues);
|
644
649
|
- statistics with UI;
|
645
650
|
- support for `Dragonfly` DB backend;
|
646
651
|
- support for `Garnet` DB backend;
|
@@ -46,7 +46,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
|
|
46
46
|
"[redis_queued_locks.try_lock.start] " \
|
47
47
|
"lock_key => '#{lock_key}' " \
|
48
48
|
"queue_ttl => #{queue_ttl} " \
|
49
|
-
"acq_id => '#{acquier_id}'
|
49
|
+
"acq_id => '#{acquier_id}'"
|
50
50
|
)
|
51
51
|
end
|
52
52
|
end
|
@@ -64,7 +64,9 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
# Step 0:
|
67
|
+
# Step 0:
|
68
|
+
# watch the lock key changes (and discard acquirement if lock is already
|
69
|
+
# obtained by another acquier during the current lock acquiremntt)
|
68
70
|
rconn.multi(watch: [lock_key]) do |transact|
|
69
71
|
# Fast-Step X0: fail-fast check
|
70
72
|
if fail_fast && rconn.call('HGET', lock_key, 'acq_id')
|
@@ -163,7 +165,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
|
|
163
165
|
"lock_key => '#{lock_key}' " \
|
164
166
|
"queue_ttl => #{queue_ttl} " \
|
165
167
|
"acq_id => '#{acquier_id}' " \
|
166
|
-
"first_acq_id_in_queue => '#{waiting_acquier}'"
|
168
|
+
"first_acq_id_in_queue => '#{waiting_acquier}' " \
|
169
|
+
"<current_lock_data> => <<#{rconn.call('HGETALL', lock_key).to_h}>>"
|
167
170
|
)
|
168
171
|
end
|
169
172
|
end
|
@@ -199,7 +202,8 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
|
|
199
202
|
"queue_ttl => #{queue_ttl} " \
|
200
203
|
"acq_id => '#{acquier_id}' " \
|
201
204
|
"first_acq_id_in_queue => '#{waiting_acquier}' " \
|
202
|
-
"locked_by_acq_id => '#{locked_by_acquier}'"
|
205
|
+
"locked_by_acq_id => '#{locked_by_acquier}' " \
|
206
|
+
"<current_lock_data> => <<#{rconn.call('HGETALL', lock_key).to_h}>>"
|
203
207
|
)
|
204
208
|
end
|
205
209
|
end
|
@@ -214,7 +218,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::TryToLock
|
|
214
218
|
# NOTE: required lock is free and ready to be acquired! acquire!
|
215
219
|
|
216
220
|
# Step 6.1: remove our acquier from waiting queue
|
217
|
-
transact.call('
|
221
|
+
transact.call('ZREM', lock_key_queue, acquier_id)
|
218
222
|
|
219
223
|
RedisQueuedLocks.debug(
|
220
224
|
'Step №4: Забираем наш текущий процесс из очереди. [ZPOPMIN]'
|
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.34
|
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-03-
|
11
|
+
date: 2024-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|