sidekiq_alive 1.1.1 → 1.2.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: 353fe633b29953f77cd04c9c7f3fe956c2c258c925de88c98f9ef8bf7338c4fd
4
- data.tar.gz: 2f2e3845a01d3b546cd9dc16829bf7ba196ad53edbd71d6b7a01f7e940f6fb34
3
+ metadata.gz: e7b89d09d3a01cd0774ea9a4955a407f3fa397a5799e9d01d65c71e7e448bdca
4
+ data.tar.gz: 5241eee33524f7115bc9345aec7803e54c5035cb5071dfd92ac1479bcc40fd7d
5
5
  SHA512:
6
- metadata.gz: 67ae1f11a7b5f436552c80ef9a389c80b3945444b8ffd04f9ab1c732d8d78ea26ad54fef7e2365ad89f73db33a441429f4a38c57eebad16ba4e3d22c7c7754bb
7
- data.tar.gz: 578c4786ec814f79d6a2acb623a66ad6a732e7365397e573d1b582f051e7b9968971accc824481c0dc6d50e6de89281bdc83650c92e4db5d9d551e4cf2084d64
6
+ metadata.gz: 5bef84e7c6f9ab1f28c3512f2628918676f7df835d1c389defb4e50ad47eca6e13cf82a2b6453cc4b9776ecf7e37a4d84d845b3af510222045e115e0316cae9a
7
+ data.tar.gz: ee57bf4f7d780d5b8b45b7775989a30af47d77a2faa0db1877280a69ea374471d0143a5ab4edb004f08e28e12a8c9cc8c59e7a4fa9e972a8162b1ab82f8fa1d7
data/.travis.yml CHANGED
@@ -5,9 +5,13 @@ cache: bundler
5
5
  rvm:
6
6
  - 2.3.7
7
7
  - 2.4.4
8
- - 2.5.1
8
+ - 2.5.5
9
+ - 2.6.2
9
10
  - ruby-head
10
- before_install: gem install bundler -v 1.16.1
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: ruby-head
14
+ before_install: gem install bundler -v 1.17.3
11
15
  env:
12
16
  global:
13
17
  - CC_TEST_REPORTER_ID=571b470a2b61f8a58b2a0ebbcf297805efa07c548e45bac9d1c9ce0c5edcfc20
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq_alive (1.1.1)
4
+ sidekiq_alive (1.2.0)
5
5
  sidekiq
6
6
  sinatra
7
7
 
@@ -9,46 +9,47 @@ GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  coderay (1.1.2)
12
- concurrent-ruby (1.0.5)
13
- connection_pool (2.2.1)
12
+ connection_pool (2.2.2)
14
13
  diff-lcs (1.3)
15
- method_source (0.9.0)
16
- mock_redis (0.18.0)
17
- pry (0.11.3)
14
+ method_source (0.9.2)
15
+ mock_redis (0.19.0)
16
+ mustermann (1.0.3)
17
+ pry (0.12.2)
18
18
  coderay (~> 1.1.0)
19
19
  method_source (~> 0.9.0)
20
- rack (1.6.8)
21
- rack-protection (1.5.3)
20
+ rack (2.0.6)
21
+ rack-protection (2.0.5)
22
22
  rack
23
- rack-test (1.0.0)
23
+ rack-test (1.1.0)
24
24
  rack (>= 1.0, < 3)
25
25
  rake (10.5.0)
26
- redis (3.3.5)
27
- rspec (3.7.0)
28
- rspec-core (~> 3.7.0)
29
- rspec-expectations (~> 3.7.0)
30
- rspec-mocks (~> 3.7.0)
31
- rspec-core (3.7.1)
32
- rspec-support (~> 3.7.0)
33
- rspec-expectations (3.7.0)
26
+ redis (4.1.0)
27
+ rspec (3.8.0)
28
+ rspec-core (~> 3.8.0)
29
+ rspec-expectations (~> 3.8.0)
30
+ rspec-mocks (~> 3.8.0)
31
+ rspec-core (3.8.0)
32
+ rspec-support (~> 3.8.0)
33
+ rspec-expectations (3.8.2)
34
34
  diff-lcs (>= 1.2.0, < 2.0)
35
- rspec-support (~> 3.7.0)
36
- rspec-mocks (3.7.0)
35
+ rspec-support (~> 3.8.0)
36
+ rspec-mocks (3.8.0)
37
37
  diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.7.0)
38
+ rspec-support (~> 3.8.0)
39
39
  rspec-sidekiq (3.0.3)
40
40
  rspec-core (~> 3.0, >= 3.0.0)
41
41
  sidekiq (>= 2.4.0)
42
- rspec-support (3.7.1)
43
- sidekiq (4.2.10)
44
- concurrent-ruby (~> 1.0)
45
- connection_pool (~> 2.2, >= 2.2.0)
42
+ rspec-support (3.8.0)
43
+ sidekiq (5.2.5)
44
+ connection_pool (~> 2.2, >= 2.2.2)
45
+ rack (>= 1.5.0)
46
46
  rack-protection (>= 1.5.0)
47
- redis (~> 3.2, >= 3.2.1)
48
- sinatra (1.4.8)
49
- rack (~> 1.5)
50
- rack-protection (~> 1.4)
51
- tilt (>= 1.3, < 3)
47
+ redis (>= 3.3.5, < 5)
48
+ sinatra (2.0.5)
49
+ mustermann (~> 1.0)
50
+ rack (~> 2.0)
51
+ rack-protection (= 2.0.5)
52
+ tilt (~> 2.0)
52
53
  tilt (2.0.9)
53
54
 
54
55
  PLATFORMS
@@ -65,4 +66,4 @@ DEPENDENCIES
65
66
  sidekiq_alive!
66
67
 
67
68
  BUNDLED WITH
68
- 1.17.1
69
+ 1.17.3
data/README.md CHANGED
@@ -167,6 +167,17 @@ SidekiqAlive.setup do |config|
167
167
  # default: :sidekiq_alive
168
168
  #
169
169
  # config.preferred_queue = :other
170
+
171
+ # ==> delay_between_async_other_host_queue
172
+ # When instance receives a job from another instance it requeues itself again
173
+ # until the owner instance process it. This was causing a lot of read/writes in big deployments
174
+ # with a lot of replicas.
175
+ # Delaying the requeue proves to be less read/write intensive
176
+ # default: 1
177
+ #
178
+ # config.delay_between_async_other_host_queue = 0.5
179
+ # #or
180
+ # config.delay_between_async_other_host_queue = false
170
181
  end
171
182
  ```
172
183
 
data/lib/sidekiq_alive.rb CHANGED
@@ -1,12 +1,12 @@
1
- require "sidekiq"
2
- require "singleton"
3
- require "sidekiq_alive/version"
4
- require "sidekiq_alive/config"
1
+ require 'sidekiq'
2
+ require 'sidekiq/api'
3
+ require 'singleton'
4
+ require 'sidekiq_alive/version'
5
+ require 'sidekiq_alive/config'
5
6
 
6
7
  module SidekiqAlive
7
8
  def self.start
8
9
  Sidekiq.configure_server do |config|
9
-
10
10
  SidekiqAlive::Worker.sidekiq_options queue: SidekiqAlive.select_queue(config.options[:queues])
11
11
 
12
12
  config.on(:startup) do
@@ -15,7 +15,9 @@ module SidekiqAlive
15
15
  sa.register_current_instance
16
16
  sa.store_alive_key
17
17
  sa::Worker.perform_async(hostname)
18
- sa::Server.start
18
+ @server_pid = fork do
19
+ sa::Server.run!
20
+ end
19
21
  sa.logger.info(successful_startup_text)
20
22
  end
21
23
  end
@@ -24,10 +26,11 @@ module SidekiqAlive
24
26
  SidekiqAlive.unregister_current_instance
25
27
  end
26
28
  config.on(:shutdown) do
29
+ Process.kill('TERM', @server_pid) unless @server_pid.nil?
30
+ Process.wait(@server_pid) unless @server_pid.nil?
27
31
  SidekiqAlive.unregister_current_instance
28
32
  end
29
33
  end
30
-
31
34
  end
32
35
 
33
36
  def self.select_queue(queues)
@@ -43,6 +46,9 @@ module SidekiqAlive
43
46
  end
44
47
 
45
48
  def self.unregister_current_instance
49
+ # Delete any pending jobs for this instance
50
+ logger.info(shutdown_info)
51
+ purge_pending_jobs
46
52
  redis.del(current_instance_register_key)
47
53
  end
48
54
 
@@ -50,6 +56,13 @@ module SidekiqAlive
50
56
  redis.keys("#{config.registered_instance_key}::*")
51
57
  end
52
58
 
59
+ def self.purge_pending_jobs
60
+ scheduled_set = Sidekiq::ScheduledSet.new
61
+ jobs = scheduled_set.select { |job| job.klass == 'SidekiqAlive::Worker' && job.args[0] == hostname }
62
+ logger.info("Purging #{jobs.count} pending for #{hostname}")
63
+ jobs.each(&:delete)
64
+ end
65
+
53
66
  def self.current_instance_register_key
54
67
  "#{config.registered_instance_key}::#{hostname}"
55
68
  end
@@ -57,7 +70,7 @@ module SidekiqAlive
57
70
  def self.store_alive_key
58
71
  redis.set(current_lifeness_key,
59
72
  Time.now.to_i,
60
- { ex: config.time_to_live.to_i })
73
+ ex: config.time_to_live.to_i)
61
74
  end
62
75
 
63
76
  def self.redis
@@ -65,7 +78,7 @@ module SidekiqAlive
65
78
  end
66
79
 
67
80
  def self.alive?
68
- redis.ttl(current_lifeness_key) == -2 ? false : true
81
+ redis.ttl(current_lifeness_key) != -2
69
82
  end
70
83
 
71
84
  # CONFIG ---------------------------------------
@@ -90,8 +103,20 @@ module SidekiqAlive
90
103
  ENV['HOSTNAME'] || 'HOSTNAME_NOT_SET'
91
104
  end
92
105
 
106
+ def self.shutdown_info
107
+ <<~BANNER
108
+
109
+ =================== Shutting down SidekiqAlive =================
110
+
111
+ Hostname: #{hostname}
112
+ Liveness key: #{current_lifeness_key}
113
+ Current instance register key: #{current_instance_register_key}
114
+
115
+ BANNER
116
+ end
117
+
93
118
  def self.banner
94
- <<-BANNER.strip_heredoc
119
+ <<~BANNER
95
120
 
96
121
  =================== SidekiqAlive =================
97
122
 
@@ -108,7 +133,7 @@ module SidekiqAlive
108
133
  end
109
134
 
110
135
  def self.successful_startup_text
111
- <<-BANNER.strip_heredoc
136
+ <<~BANNER
112
137
  Registered instances:
113
138
 
114
139
  - #{registered_instances.join("\n\s\s- ")}
@@ -120,11 +145,11 @@ module SidekiqAlive
120
145
  def self.register_instance(instance_name)
121
146
  redis.set(instance_name,
122
147
  Time.now.to_i,
123
- { ex: config.time_to_live.to_i + 60 })
148
+ ex: config.registration_ttl.to_i)
124
149
  end
125
150
  end
126
151
 
127
- require "sidekiq_alive/worker"
128
- require "sidekiq_alive/server"
152
+ require 'sidekiq_alive/worker'
153
+ require 'sidekiq_alive/server'
129
154
 
130
155
  SidekiqAlive.start unless ENV['DISABLE_SIDEKIQ_ALIVE']
@@ -7,7 +7,8 @@ module SidekiqAlive
7
7
  :time_to_live,
8
8
  :callback,
9
9
  :registered_instance_key,
10
- :preferred_queue
10
+ :preferred_queue,
11
+ :delay_between_async_other_host_queue
11
12
 
12
13
  def initialize
13
14
  set_defaults
@@ -18,9 +19,13 @@ module SidekiqAlive
18
19
  @liveness_key = 'SIDEKIQ::LIVENESS_PROBE_TIMESTAMP'
19
20
  @time_to_live = 10 * 60
20
21
  @callback = proc {}
21
- @registered_instance_key = "SIDEKIQ_REGISTERED_INSTANCE"
22
+ @registered_instance_key = 'SIDEKIQ_REGISTERED_INSTANCE'
22
23
  @preferred_queue = :sidekiq_alive
24
+ @delay_between_async_other_host_queue = 1
23
25
  end
24
26
 
27
+ def registration_ttl
28
+ @registration_ttl ? @registration_ttl : time_to_live + 60
29
+ end
25
30
  end
26
31
  end
@@ -1,25 +1,13 @@
1
- require "sinatra/base"
2
- require_relative "./config"
1
+ require 'sinatra/base'
3
2
  module SidekiqAlive
4
3
  class Server < Sinatra::Base
5
4
  set :bind, '0.0.0.0'
6
-
7
- class << self
8
- def start
9
- set :port, SidekiqAlive.config.port
10
- Thread.start { run! }
11
- end
12
-
13
- def quit!
14
- super
15
- exit
16
- end
17
- end
5
+ set :port, SidekiqAlive.config.port
18
6
 
19
7
  get '/' do
20
8
  if SidekiqAlive.alive?
21
9
  status 200
22
- body "Alive!"
10
+ body 'Alive!'
23
11
  else
24
12
  response = "Can't find the alive key"
25
13
  SidekiqAlive.logger.error(response)
@@ -1,3 +1,3 @@
1
1
  module SidekiqAlive
2
- VERSION = "1.1.1"
2
+ VERSION = '1.2.0'.freeze
3
3
  end
@@ -11,7 +11,11 @@ module SidekiqAlive
11
11
  self.class.perform_in(config.time_to_live / 2, current_hostname)
12
12
  else
13
13
  # requeue for hostname to validate it's own liveness probe
14
- self.class.perform_async(hostname)
14
+ if config.delay_between_async_other_host_queue
15
+ self.class.perform_in(config.delay_between_async_other_host_queue, hostname)
16
+ else
17
+ self.class.perform_async(hostname)
18
+ end
15
19
  end
16
20
  end
17
21
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_alive
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artur Pañach
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-20 00:00:00.000000000 Z
11
+ date: 2019-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler