redis_queued_locks 1.17.0 → 1.19.0

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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/project-overview.md +87 -10
  3. data/.claude/rules/acquirer.md +31 -11
  4. data/.claude/rules/arguments.md +2 -1
  5. data/.claude/rules/git.md +46 -0
  6. data/.claude/rules/logic.md +9 -3
  7. data/.claude/rules/swarm.md +4 -3
  8. data/.claude/rules/tests.md +9 -3
  9. data/.claude/rules/type-checking.md +10 -2
  10. data/.claude/rules/visitors.md +12 -7
  11. data/CHANGELOG.md +68 -0
  12. data/CLAUDE.md +7 -2
  13. data/README.md +427 -79
  14. data/lib/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue/log_visitor.rb +6 -3
  15. data/lib/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue.rb +9 -7
  16. data/lib/redis_queued_locks/acquirer/acquire_lock/instr_visitor.rb +20 -10
  17. data/lib/redis_queued_locks/acquirer/acquire_lock/log_visitor.rb +34 -16
  18. data/lib/redis_queued_locks/acquirer/acquire_lock/try_to_lock/log_visitor.rb +240 -28
  19. data/lib/redis_queued_locks/acquirer/acquire_lock/try_to_lock.rb +398 -129
  20. data/lib/redis_queued_locks/acquirer/acquire_lock/yield_expire/log_visitor.rb +12 -6
  21. data/lib/redis_queued_locks/acquirer/acquire_lock/yield_expire.rb +32 -8
  22. data/lib/redis_queued_locks/acquirer/acquire_lock.rb +73 -20
  23. data/lib/redis_queued_locks/acquirer/clear_dead_requests.rb +9 -1
  24. data/lib/redis_queued_locks/acquirer/extend_lock_ttl.rb +182 -3
  25. data/lib/redis_queued_locks/acquirer/is_locked.rb +19 -2
  26. data/lib/redis_queued_locks/acquirer/is_queued.rb +6 -2
  27. data/lib/redis_queued_locks/acquirer/lock_info.rb +96 -6
  28. data/lib/redis_queued_locks/acquirer/lock_series_poc/instr_visitor.rb +8 -2
  29. data/lib/redis_queued_locks/acquirer/lock_series_poc/log_visitor.rb +18 -6
  30. data/lib/redis_queued_locks/acquirer/lock_series_poc.rb +126 -27
  31. data/lib/redis_queued_locks/acquirer/locks.rb +103 -6
  32. data/lib/redis_queued_locks/acquirer/queue_info.rb +38 -9
  33. data/lib/redis_queued_locks/acquirer/queues.rb +28 -4
  34. data/lib/redis_queued_locks/acquirer/release_all_locks.rb +35 -1
  35. data/lib/redis_queued_locks/acquirer/release_lock.rb +40 -9
  36. data/lib/redis_queued_locks/acquirer/release_locks_of.rb +43 -3
  37. data/lib/redis_queued_locks/acquirer/release_read_lock.rb +143 -0
  38. data/lib/redis_queued_locks/acquirer.rb +1 -0
  39. data/lib/redis_queued_locks/client.rb +143 -14
  40. data/lib/redis_queued_locks/resource.rb +117 -9
  41. data/lib/redis_queued_locks/swarm/flush_zombies.rb +38 -0
  42. data/lib/redis_queued_locks/swarm/zombie_info.rb +42 -0
  43. data/lib/redis_queued_locks/version.rb +2 -2
  44. data/rbs_collection.lock.yaml +10 -2
  45. data/rbs_collection.yaml +0 -2
  46. data/sig/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue/log_visitor.rbs +2 -1
  47. data/sig/redis_queued_locks/acquirer/acquire_lock/dequeue_from_lock_queue.rbs +0 -1
  48. data/sig/redis_queued_locks/acquirer/acquire_lock/instr_visitor.rbs +5 -0
  49. data/sig/redis_queued_locks/acquirer/acquire_lock/log_visitor.rbs +12 -6
  50. data/sig/redis_queued_locks/acquirer/acquire_lock/try_to_lock/log_visitor.rbs +74 -7
  51. data/sig/redis_queued_locks/acquirer/acquire_lock/try_to_lock.rbs +4 -2
  52. data/sig/redis_queued_locks/acquirer/acquire_lock/yield_expire.rbs +3 -0
  53. data/sig/redis_queued_locks/acquirer/acquire_lock/yield_with_expire/log_visitor.rbs +4 -2
  54. data/sig/redis_queued_locks/acquirer/extend_lock_ttl.rbs +19 -1
  55. data/sig/redis_queued_locks/acquirer/lock_info.rbs +9 -1
  56. data/sig/redis_queued_locks/acquirer/locks.rbs +10 -1
  57. data/sig/redis_queued_locks/acquirer/queue_info.rbs +2 -4
  58. data/sig/redis_queued_locks/acquirer/queues.rbs +1 -1
  59. data/sig/redis_queued_locks/acquirer/release_lock.rbs +8 -1
  60. data/sig/redis_queued_locks/acquirer/release_read_lock.rbs +44 -0
  61. data/sig/redis_queued_locks/client.rbs +23 -2
  62. data/sig/redis_queued_locks/resource.rbs +9 -2
  63. data/sig/redis_queued_locks/swarm/zombie_info.rbs +5 -0
  64. metadata +4 -1
@@ -44,7 +44,7 @@ module RedisQueuedLocks
44
44
  ?raise_errors: bool,
45
45
  ?fail_fast: bool,
46
46
  ?conflict_strategy: Symbol,
47
- ?read_write_mode: Symbol,
47
+ ?read_write_mode: :read | :write,
48
48
  ?access_strategy: Symbol,
49
49
  ?identity: String,
50
50
  ?meta: Hash[String|Symbol,untyped]?,
@@ -74,7 +74,7 @@ module RedisQueuedLocks
74
74
  ?retry_jitter: Integer,
75
75
  ?fail_fast: bool,
76
76
  ?conflict_strategy: Symbol,
77
- ?read_write_mode: Symbol,
77
+ ?read_write_mode: :read | :write,
78
78
  ?access_strategy: Symbol,
79
79
  ?identity: String,
80
80
  ?instrumenter: RQL::instrObj,
@@ -109,6 +109,24 @@ module RedisQueuedLocks
109
109
  ) -> RQL::Acquirer::ReleaseLock::releaseResult
110
110
  alias release_lock unlock
111
111
 
112
+ def unlock_read: (
113
+ String lock_name,
114
+ ?acquirer_id: String?,
115
+ ?identity: String,
116
+ ?logger: RQL::loggerObj,
117
+ ?instrumenter: RQL::instrObj,
118
+ ?instrument: untyped?,
119
+ ?log_sampling_enabled: bool,
120
+ ?log_sampling_percent: Integer,
121
+ ?log_sampler: RQL::Logging::samplerObj,
122
+ ?log_sample_this: bool,
123
+ ?instr_sampling_enabled: bool,
124
+ ?instr_sampling_percent: Integer,
125
+ ?instr_sampler: RQL::Instrument::samplerObj,
126
+ ?instr_sample_this: bool
127
+ ) -> RQL::Acquirer::ReleaseReadLock::releaseResult
128
+ alias release_read_lock unlock_read
129
+
112
130
  def locked?: (String lock_name) -> bool
113
131
  def queued?: (String lock_name) -> bool
114
132
  def lock_info: (String lock_name) -> RQL::Acquirer::LockInfo::lockInfo?
@@ -138,6 +156,9 @@ module RedisQueuedLocks
138
156
  def extend_lock_ttl: (
139
157
  String lock_name,
140
158
  Integer milliseconds,
159
+ ?read_write_mode: :read | :write,
160
+ ?all_read_locks: bool,
161
+ ?identity: String,
141
162
  ?logger: RQL::loggerObj,
142
163
  ?instrumenter: RQL::instrObj,
143
164
  ?instrument: untyped?,
@@ -4,7 +4,8 @@ module RedisQueuedLocks
4
4
  LOCK_PATTERN: String
5
5
  LOCK_QUEUE_PATTERN: String
6
6
  READ_LOCK_QUEUE_PATTERN: String
7
- WRITE_LOCK_QUEUE_PATTERN: String
7
+ LOCK_READERS_PATTERN: String
8
+ READ_LOCK_PATTERN: String
8
9
  SWARM_KEY: String
9
10
  REDIS_TIMESHIFT_ERROR: Integer
10
11
 
@@ -27,7 +28,13 @@ module RedisQueuedLocks
27
28
  def self.prepare_lock_key: (String lock_name) -> String
28
29
  def self.prepare_lock_queue: (String lock_name) -> String
29
30
  def self.prepare_read_lock_queue: (String lock_name) -> String
30
- def self.prepare_write_lock_queue: (String lock_name) -> String
31
+ def self.prepare_lock_readers: (String lock_name) -> String
32
+ def self.prepare_read_lock_key: (String lock_name, String acquirer_id) -> String
33
+ def self.lock_queue_rw_mode: (String lock_queue) -> String?
34
+ def self.lock_name_from_readers: (String lock_readers_key) -> String
35
+ def self.lock_key_from_readers: (String lock_readers_key) -> String
36
+ def self.host_identifier_from_acquirer: (String acquirer_id) -> String
37
+ def self.redis_time_ms: (Array[String] redis_time) -> Integer
31
38
  def self.calc_initial_acquirer_position: () -> Float
32
39
  def self.acquirer_dead_score: (Integer|Float queue_ttl) -> Float
33
40
  def self.calc_zombie_score: (Float zombie_ttl) -> Float
@@ -19,6 +19,11 @@ module RedisQueuedLocks
19
19
  private def self.extract_zombie_locks: (RC::client rconn, Integer zombie_ttl, Integer lock_scan_size) -> zombieLocks
20
20
  private def self.extract_zombie_acquirers: (RC::client rconn, Integer zombie_ttl, Integer lock_scan_size) -> zombieAcquirers
21
21
  private def self.extract_all: (RC::client rconn, Integer zombie_ttl, Integer lock_scan_size) -> zombieInfo
22
+ private def self.each_zombie_read_lock: (
23
+ RC::client rconn,
24
+ Set[String] zombie_hosts,
25
+ Integer lock_scan_size
26
+ ) { (String lock_readers_key, String acquirer_id) -> void } -> void
22
27
  end
23
28
  end
24
29
  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: 1.17.0
4
+ version: 1.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
@@ -38,6 +38,7 @@ files:
38
38
  - ".claude/project-overview.md"
39
39
  - ".claude/rules/acquirer.md"
40
40
  - ".claude/rules/arguments.md"
41
+ - ".claude/rules/git.md"
41
42
  - ".claude/rules/logic.md"
42
43
  - ".claude/rules/swarm.md"
43
44
  - ".claude/rules/tests.md"
@@ -83,6 +84,7 @@ files:
83
84
  - lib/redis_queued_locks/acquirer/release_all_locks.rb
84
85
  - lib/redis_queued_locks/acquirer/release_lock.rb
85
86
  - lib/redis_queued_locks/acquirer/release_locks_of.rb
87
+ - lib/redis_queued_locks/acquirer/release_read_lock.rb
86
88
  - lib/redis_queued_locks/client.rb
87
89
  - lib/redis_queued_locks/config.rb
88
90
  - lib/redis_queued_locks/config/dsl.rb
@@ -140,6 +142,7 @@ files:
140
142
  - sig/redis_queued_locks/acquirer/release_all_locks.rbs
141
143
  - sig/redis_queued_locks/acquirer/release_lock.rbs
142
144
  - sig/redis_queued_locks/acquirer/release_locks_of.rbs
145
+ - sig/redis_queued_locks/acquirer/release_read_lock.rbs
143
146
  - sig/redis_queued_locks/client.rbs
144
147
  - sig/redis_queued_locks/config.rbs
145
148
  - sig/redis_queued_locks/config/dsl.rbs