sidekiq_alive 2.2.2 → 2.3.0

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: 6e6b5e84ff746dd5d962f51625919178bc7495308abda9f7a1115adc09604bdb
4
- data.tar.gz: 0764a954ba5e287bfe0086229973582c2dd64ee8e053bd477215dbcbd419ee02
3
+ metadata.gz: 562294aa960a1c1cd11b0a020b0f7cce26f09ee4c2faeb7044e21fd9bf3be8c5
4
+ data.tar.gz: c31918f4c756cc551a3dcab2ea0d2c781c394e23e463c0a2c72ae68bfb52cd16
5
5
  SHA512:
6
- metadata.gz: ad276a94133bef97bfa64532d526f159253071d2ec0ee9447124ab64d10534e2aae634f31e0b390c68a92fb5d5aad544ac4b185c7ac8a74de582042322fbae2a
7
- data.tar.gz: 20408e4c55d5fe5299d71ad7c1a81ebe550abce762875ca23b27b3d7ef40799d3859ff8cd33fda4a40d922c93552c2caaaadcf3d755778166ed8edd4dff5bfa0
6
+ metadata.gz: 595baafc8b0499bb8f900cdaf3eac250d623ba3b51d65b4510d311b2913b1e0560fc967c63dbeaf9145cab43527a5d133b7af6127492103e0caf8538b61ed55e
7
+ data.tar.gz: 05deade6b05eb839fb0c6d1c0d08768b2141cc24c61cdd2edc1aa453338b12bc7b5bce3a8d19692968a7f85939541519fb6c70eb759273c1b2fe5afffce8b413
@@ -7,7 +7,19 @@ module SidekiqAlive
7
7
  raise(NotImplementedError)
8
8
  end
9
9
 
10
- def match(key)
10
+ def zadd(set_key, ex, key)
11
+ raise(NotImplementedError)
12
+ end
13
+
14
+ def zrange(set_key, start, stop)
15
+ raise(NotImplementedError)
16
+ end
17
+
18
+ def zrangebyscore(set_key, min, max)
19
+ raise(NotImplementedError)
20
+ end
21
+
22
+ def zrem(set_key, key)
11
23
  raise(NotImplementedError)
12
24
  end
13
25
 
@@ -16,7 +28,7 @@ module SidekiqAlive
16
28
  end
17
29
 
18
30
  def ttl(...)
19
- Sidekiq.redis { |redis| redis.ttl(...) }
31
+ redis { |r| r.ttl(...) }
20
32
  end
21
33
  end
22
34
  end
@@ -7,20 +7,45 @@ module SidekiqAlive
7
7
  # Wrapper for `redis-client` gem used by `sidekiq` > 7
8
8
  # https://github.com/redis-rb/redis-client
9
9
  class RedisClientGem < Base
10
+ def initialize
11
+ super
12
+
13
+ @capsule = Sidekiq.default_configuration.capsules[CAPSULE_NAME]
14
+ end
15
+
10
16
  def set(key, time:, ex:)
11
- Sidekiq.redis { |redis| redis.call("SET", key, time, ex: ex) }
17
+ redis { |r| r.call("SET", key, time, ex: ex) }
12
18
  end
13
19
 
14
20
  def get(key)
15
- Sidekiq.redis { |redis| redis.call("GET", key) }
21
+ redis { |r| r.call("GET", key) }
22
+ end
23
+
24
+ def zadd(set_key, ex, key)
25
+ redis { |r| r.call("ZADD", set_key, ex, key) }
26
+ end
27
+
28
+ def zrange(set_key, start, stop)
29
+ redis { |r| r.call("ZRANGE", set_key, start, stop) }
30
+ end
31
+
32
+ def zrangebyscore(set_key, min, max)
33
+ redis { |r| r.call("ZRANGEBYSCORE", set_key, min, max) }
16
34
  end
17
35
 
18
- def match(key)
19
- Sidekiq.redis { |redis| redis.scan("MATCH", key).map { |key| key } }
36
+ def zrem(set_key, key)
37
+ redis { |r| r.call("ZREM", set_key, key) }
20
38
  end
21
39
 
22
40
  def delete(key)
23
- Sidekiq.redis { |redis| redis.call("DEL", key) }
41
+ redis { |r| r.call("DEL", key) }
42
+ end
43
+
44
+ private
45
+
46
+ def redis(&block)
47
+ # Default to Sidekiq.redis if capsule is not configured yet but redis adapter is accessed
48
+ (@capsule || Sidekiq).redis(&block)
24
49
  end
25
50
  end
26
51
  end
@@ -8,33 +8,37 @@ module SidekiqAlive
8
8
  # https://github.com/redis/redis-rb
9
9
  class RedisGem < Base
10
10
  def set(key, time:, ex:)
11
- redis.set(key, time, ex: ex)
11
+ redis { |r| r.set(key, time, ex: ex) }
12
12
  end
13
13
 
14
14
  def get(key)
15
- redis.get(key)
15
+ redis { |r| r.get(key) }
16
16
  end
17
17
 
18
- def match(key)
19
- keys = []
20
- cursor = 0
18
+ def zadd(set_key, ex, key)
19
+ redis { |r| r.zadd(set_key, ex, key) }
20
+ end
21
+
22
+ def zrange(set_key, start, stop)
23
+ redis { |r| r.zrange(set_key, start, stop) }
24
+ end
25
+
26
+ def zrangebyscore(set_key, min, max)
27
+ redis { |r| r.zrangebyscore(set_key, min, max) }
28
+ end
21
29
 
22
- loop do
23
- cursor, found_keys = redis.scan(cursor, match: key, count: 1000)
24
- keys += found_keys if found_keys
25
- break if cursor.to_i == 0
26
- end
27
- keys
30
+ def zrem(set_key, key)
31
+ redis { |r| r.zrem(set_key, key) }
28
32
  end
29
33
 
30
34
  def delete(key)
31
- redis.del(key)
35
+ redis { |r| r.del(key) }
32
36
  end
33
37
 
34
38
  private
35
39
 
36
- def redis
37
- Sidekiq.redis { |redis| redis }
40
+ def redis(&block)
41
+ Sidekiq.redis(&block)
38
42
  end
39
43
  end
40
44
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SidekiqAlive
4
- VERSION = "2.2.2"
4
+ VERSION = "2.3.0"
5
5
  end
data/lib/sidekiq_alive.rb CHANGED
@@ -9,25 +9,28 @@ require "sidekiq_alive/helpers"
9
9
  require "sidekiq_alive/redis"
10
10
 
11
11
  module SidekiqAlive
12
+ HOSTNAME_REGISTRY = "sidekiq-alive-hostnames"
13
+ CAPSULE_NAME = "sidekiq-alive"
14
+
12
15
  class << self
13
16
  def start
14
17
  Sidekiq.configure_server do |sq_config|
15
18
  sq_config.on(:startup) do
16
19
  SidekiqAlive::Worker.sidekiq_options(queue: current_queue)
17
- if Helpers.sidekiq_7
18
- sq_config.queues
19
- else
20
- sq_config.respond_to?(:[]) ? sq_config[:queues] : sq_config.options[:queues]
21
- end.unshift(current_queue)
22
20
 
23
- # If no weight is set, webui might not show this queue for given instance/process.
24
21
  if Helpers.sidekiq_7
25
- sq_config.default_capsule.weights[current_queue] = 1
22
+ sq_config.capsule(CAPSULE_NAME) do |cap|
23
+ cap.concurrency = 2
24
+ cap.queues = [current_queue]
25
+ end
26
+ else
27
+ (sq_config.respond_to?(:[]) ? sq_config[:queues] : sq_config.options[:queues]).unshift(current_queue)
26
28
  end
27
29
 
28
30
  logger.info(startup_info)
29
31
 
30
32
  register_current_instance
33
+
31
34
  store_alive_key
32
35
  # Passing the hostname argument it's only for debugging enqueued jobs
33
36
  SidekiqAlive::Worker.perform_async(hostname)
@@ -63,11 +66,13 @@ module SidekiqAlive
63
66
  # Delete any pending jobs for this instance
64
67
  logger.info(shutdown_info)
65
68
  purge_pending_jobs
66
- redis.delete(current_instance_register_key)
69
+ redis.zrem(HOSTNAME_REGISTRY, current_instance_register_key)
67
70
  end
68
71
 
69
72
  def registered_instances
70
- redis.match("#{config.registered_instance_key}::*")
73
+ # before we return we make sure we expire old keys
74
+ expire_old_keys
75
+ redis.zrange(HOSTNAME_REGISTRY, 0, -1)
71
76
  end
72
77
 
73
78
  def purge_pending_jobs
@@ -136,6 +141,7 @@ module SidekiqAlive
136
141
  port: config.port,
137
142
  ttl: config.time_to_live,
138
143
  queue: current_queue,
144
+ register_set: HOSTNAME_REGISTRY,
139
145
  liveness_key: current_lifeness_key,
140
146
  register_key: current_instance_register_key,
141
147
  }
@@ -144,11 +150,21 @@ module SidekiqAlive
144
150
  end
145
151
 
146
152
  def successful_startup_text
147
- "Successfully started sidekiq-alive, registered with key: #{current_instance_register_key}"
153
+ "Successfully started sidekiq-alive, registered with key: "\
154
+ "#{current_instance_register_key} on set #{HOSTNAME_REGISTRY}"
155
+ end
156
+
157
+ def expire_old_keys
158
+ # we get every key that should be expired by now
159
+ keys_to_expire = redis.zrangebyscore(HOSTNAME_REGISTRY, 0, Time.now.to_i)
160
+ # then we remove it
161
+ keys_to_expire.each { |key| redis.zrem(HOSTNAME_REGISTRY, key) }
148
162
  end
149
163
 
150
164
  def register_instance(instance_name)
151
- redis.set(instance_name, time: Time.now.to_i, ex: config.registration_ttl.to_i)
165
+ expiration = Time.now.to_i + config.registration_ttl.to_i
166
+ redis.zadd(HOSTNAME_REGISTRY, expiration, instance_name)
167
+ expire_old_keys
152
168
  end
153
169
  end
154
170
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_alive
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrejs Cunskis
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-05-25 00:00:00.000000000 Z
12
+ date: 2023-09-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -87,14 +87,14 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '3.0'
90
+ version: '4.0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '3.0'
97
+ version: '4.0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rubocop-shopify
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -213,7 +213,7 @@ metadata:
213
213
  homepage_uri: https://github.com/arturictus/sidekiq_alive
214
214
  source_code_uri: https://github.com/arturictus/sidekiq_alive
215
215
  changelog_uri: https://github.com/arturictus/sidekiq_alive/releases
216
- documentation_uri: https://github.com/arturictus/sidekiq_alive/blob/v2.2.2/README.md
216
+ documentation_uri: https://github.com/arturictus/sidekiq_alive/blob/v2.3.0/README.md
217
217
  bug_tracker_uri: https://github.com/arturictus/sidekiq_alive/issues
218
218
  post_install_message:
219
219
  rdoc_options: []