sidekiq 5.2.4 → 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.circleci/config.yml +82 -0
- data/.gitignore +0 -2
- data/.standard.yml +20 -0
- data/6.0-Upgrade.md +72 -0
- data/COMM-LICENSE +11 -9
- data/Changes.md +129 -0
- data/Ent-2.0-Upgrade.md +37 -0
- data/Ent-Changes.md +32 -1
- data/Gemfile +12 -17
- data/Gemfile.lock +196 -0
- data/Pro-5.0-Upgrade.md +25 -0
- data/Pro-Changes.md +26 -2
- data/README.md +18 -31
- data/Rakefile +5 -4
- data/bin/sidekiqload +33 -25
- data/bin/sidekiqmon +8 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
- data/lib/generators/sidekiq/worker_generator.rb +20 -12
- data/lib/sidekiq.rb +62 -43
- data/lib/sidekiq/api.rb +196 -175
- data/lib/sidekiq/cli.rb +118 -178
- data/lib/sidekiq/client.rb +51 -46
- data/lib/sidekiq/delay.rb +5 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +10 -20
- data/lib/sidekiq/extensions/active_record.rb +9 -7
- data/lib/sidekiq/extensions/class_methods.rb +9 -7
- data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
- data/lib/sidekiq/fetch.rb +11 -12
- data/lib/sidekiq/job_logger.rb +45 -7
- data/lib/sidekiq/job_retry.rb +67 -58
- data/lib/sidekiq/launcher.rb +57 -51
- data/lib/sidekiq/logger.rb +165 -0
- data/lib/sidekiq/manager.rb +7 -9
- data/lib/sidekiq/middleware/chain.rb +14 -4
- data/lib/sidekiq/middleware/i18n.rb +5 -7
- data/lib/sidekiq/monitor.rb +148 -0
- data/lib/sidekiq/paginator.rb +18 -14
- data/lib/sidekiq/processor.rb +96 -66
- data/lib/sidekiq/rails.rb +23 -29
- data/lib/sidekiq/redis_connection.rb +31 -37
- data/lib/sidekiq/scheduled.rb +28 -29
- data/lib/sidekiq/testing.rb +34 -23
- data/lib/sidekiq/testing/inline.rb +2 -1
- data/lib/sidekiq/util.rb +17 -14
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web.rb +41 -49
- data/lib/sidekiq/web/action.rb +14 -10
- data/lib/sidekiq/web/application.rb +63 -64
- data/lib/sidekiq/web/helpers.rb +92 -68
- data/lib/sidekiq/web/router.rb +17 -14
- data/lib/sidekiq/worker.rb +129 -97
- data/sidekiq.gemspec +16 -16
- data/web/assets/javascripts/dashboard.js +4 -23
- data/web/assets/stylesheets/application-dark.css +125 -0
- data/web/assets/stylesheets/application.css +9 -0
- data/web/assets/stylesheets/bootstrap.css +1 -1
- data/web/locales/ja.yml +2 -1
- data/web/views/_job_info.erb +2 -1
- data/web/views/busy.erb +4 -1
- data/web/views/dead.erb +2 -2
- data/web/views/layout.erb +1 -0
- data/web/views/morgue.erb +4 -1
- data/web/views/queue.erb +10 -1
- data/web/views/queues.erb +1 -1
- data/web/views/retries.erb +4 -1
- data/web/views/retry.erb +2 -2
- data/web/views/scheduled.erb +4 -1
- metadata +20 -30
- data/.travis.yml +0 -17
- data/Appraisals +0 -9
- data/bin/sidekiqctl +0 -237
- data/gemfiles/rails_4.gemfile +0 -31
- data/gemfiles/rails_5.gemfile +0 -31
- data/lib/sidekiq/core_ext.rb +0 -1
- data/lib/sidekiq/logging.rb +0 -122
- data/lib/sidekiq/middleware/server/active_record.rb +0 -23
data/lib/sidekiq/paginator.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Sidekiq
|
3
4
|
module Paginator
|
4
|
-
|
5
|
-
def page(key, pageidx=1, page_size=25, opts=nil)
|
5
|
+
def page(key, pageidx = 1, page_size = 25, opts = nil)
|
6
6
|
current_page = pageidx.to_i < 1 ? 1 : pageidx.to_i
|
7
7
|
pageidx = current_page - 1
|
8
8
|
total_size = 0
|
@@ -12,32 +12,36 @@ module Sidekiq
|
|
12
12
|
|
13
13
|
Sidekiq.redis do |conn|
|
14
14
|
type = conn.type(key)
|
15
|
+
rev = opts && opts[:reverse]
|
15
16
|
|
16
17
|
case type
|
17
|
-
when
|
18
|
-
|
19
|
-
total_size, items = conn.multi do
|
18
|
+
when "zset"
|
19
|
+
total_size, items = conn.multi {
|
20
20
|
conn.zcard(key)
|
21
21
|
if rev
|
22
|
-
conn.zrevrange(key, starting, ending, :
|
22
|
+
conn.zrevrange(key, starting, ending, with_scores: true)
|
23
23
|
else
|
24
|
-
conn.zrange(key, starting, ending, :
|
24
|
+
conn.zrange(key, starting, ending, with_scores: true)
|
25
25
|
end
|
26
|
-
|
26
|
+
}
|
27
27
|
[current_page, total_size, items]
|
28
|
-
when
|
29
|
-
total_size, items = conn.multi
|
28
|
+
when "list"
|
29
|
+
total_size, items = conn.multi {
|
30
30
|
conn.llen(key)
|
31
|
-
|
32
|
-
|
31
|
+
if rev
|
32
|
+
conn.lrange(key, -ending - 1, -starting - 1)
|
33
|
+
else
|
34
|
+
conn.lrange(key, starting, ending)
|
35
|
+
end
|
36
|
+
}
|
37
|
+
items.reverse! if rev
|
33
38
|
[current_page, total_size, items]
|
34
|
-
when
|
39
|
+
when "none"
|
35
40
|
[1, 0, []]
|
36
41
|
else
|
37
42
|
raise "can't page a #{type}"
|
38
43
|
end
|
39
44
|
end
|
40
45
|
end
|
41
|
-
|
42
46
|
end
|
43
47
|
end
|
data/lib/sidekiq/processor.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
2
|
+
|
3
|
+
require "sidekiq/util"
|
4
|
+
require "sidekiq/fetch"
|
5
|
+
require "sidekiq/job_logger"
|
6
|
+
require "sidekiq/job_retry"
|
7
7
|
|
8
8
|
module Sidekiq
|
9
9
|
##
|
@@ -23,7 +23,6 @@ module Sidekiq
|
|
23
23
|
# to replace itself and exits.
|
24
24
|
#
|
25
25
|
class Processor
|
26
|
-
|
27
26
|
include Util
|
28
27
|
|
29
28
|
attr_reader :thread
|
@@ -37,19 +36,19 @@ module Sidekiq
|
|
37
36
|
@thread = nil
|
38
37
|
@strategy = (mgr.options[:fetch] || Sidekiq::BasicFetch).new(mgr.options)
|
39
38
|
@reloader = Sidekiq.options[:reloader]
|
40
|
-
@
|
39
|
+
@job_logger = (mgr.options[:job_logger] || Sidekiq::JobLogger).new
|
41
40
|
@retrier = Sidekiq::JobRetry.new
|
42
41
|
end
|
43
42
|
|
44
|
-
def terminate(wait=false)
|
43
|
+
def terminate(wait = false)
|
45
44
|
@done = true
|
46
|
-
return
|
45
|
+
return unless @thread
|
47
46
|
@thread.value if wait
|
48
47
|
end
|
49
48
|
|
50
|
-
def kill(wait=false)
|
49
|
+
def kill(wait = false)
|
51
50
|
@done = true
|
52
|
-
return
|
51
|
+
return unless @thread
|
53
52
|
# unlike the other actors, terminate does not wait
|
54
53
|
# for the thread to finish because we don't know how
|
55
54
|
# long the job will take to finish. Instead we
|
@@ -66,16 +65,12 @@ module Sidekiq
|
|
66
65
|
private unless $TESTING
|
67
66
|
|
68
67
|
def run
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
@mgr.processor_stopped(self)
|
76
|
-
rescue Exception => ex
|
77
|
-
@mgr.processor_died(self, ex)
|
78
|
-
end
|
68
|
+
process_one until @done
|
69
|
+
@mgr.processor_stopped(self)
|
70
|
+
rescue Sidekiq::Shutdown
|
71
|
+
@mgr.processor_stopped(self)
|
72
|
+
rescue Exception => ex
|
73
|
+
@mgr.processor_died(self, ex)
|
79
74
|
end
|
80
75
|
|
81
76
|
def process_one
|
@@ -85,14 +80,15 @@ module Sidekiq
|
|
85
80
|
end
|
86
81
|
|
87
82
|
def get_one
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
rescue Sidekiq::Shutdown
|
93
|
-
rescue => ex
|
94
|
-
handle_fetch_exception(ex)
|
83
|
+
work = @strategy.retrieve_work
|
84
|
+
if @down
|
85
|
+
logger.info { "Redis is online, #{::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - @down} sec downtime" }
|
86
|
+
@down = nil
|
95
87
|
end
|
88
|
+
work
|
89
|
+
rescue Sidekiq::Shutdown
|
90
|
+
rescue => ex
|
91
|
+
handle_fetch_exception(ex)
|
96
92
|
end
|
97
93
|
|
98
94
|
def fetch
|
@@ -106,7 +102,7 @@ module Sidekiq
|
|
106
102
|
end
|
107
103
|
|
108
104
|
def handle_fetch_exception(ex)
|
109
|
-
|
105
|
+
unless @down
|
110
106
|
@down = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
111
107
|
logger.error("Error fetching job: #{ex}")
|
112
108
|
handle_exception(ex)
|
@@ -119,20 +115,20 @@ module Sidekiq
|
|
119
115
|
# since middleware can mutate the job hash
|
120
116
|
# we clone here so we report the original
|
121
117
|
# job structure to the Web UI
|
122
|
-
pristine =
|
118
|
+
pristine = json_clone(job_hash)
|
123
119
|
|
124
|
-
|
120
|
+
@job_logger.prepare(job_hash) do
|
125
121
|
@retrier.global(pristine, queue) do
|
126
|
-
@
|
122
|
+
@job_logger.call(job_hash, queue) do
|
127
123
|
stats(pristine, queue) do
|
128
124
|
# Rails 5 requires a Reloader to wrap code execution. In order to
|
129
125
|
# constantize the worker and instantiate an instance, we have to call
|
130
126
|
# the Reloader. It handles code loading, db connection management, etc.
|
131
127
|
# Effectively this block denotes a "unit of work" to Rails.
|
132
128
|
@reloader.call do
|
133
|
-
klass
|
129
|
+
klass = constantize(job_hash["class"])
|
134
130
|
worker = klass.new
|
135
|
-
worker.jid = job_hash[
|
131
|
+
worker.jid = job_hash["jid"]
|
136
132
|
@retrier.local(worker, pristine, queue) do
|
137
133
|
yield worker
|
138
134
|
end
|
@@ -147,37 +143,49 @@ module Sidekiq
|
|
147
143
|
jobstr = work.job
|
148
144
|
queue = work.queue_name
|
149
145
|
|
150
|
-
|
146
|
+
# Treat malformed JSON as a special case: job goes straight to the morgue.
|
147
|
+
job_hash = nil
|
151
148
|
begin
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
DeadSet.new.kill(jobstr, notify_failure: false)
|
160
|
-
ack = true
|
161
|
-
raise
|
162
|
-
end
|
149
|
+
job_hash = Sidekiq.load_json(jobstr)
|
150
|
+
rescue => ex
|
151
|
+
handle_exception(ex, {context: "Invalid JSON for job", jobstr: jobstr})
|
152
|
+
# we can't notify because the job isn't a valid hash payload.
|
153
|
+
DeadSet.new.kill(jobstr, notify_failure: false)
|
154
|
+
return work.acknowledge
|
155
|
+
end
|
163
156
|
|
164
|
-
|
157
|
+
ack = false
|
158
|
+
begin
|
165
159
|
dispatch(job_hash, queue) do |worker|
|
166
160
|
Sidekiq.server_middleware.invoke(worker, job_hash, queue) do
|
167
|
-
execute_job(worker,
|
161
|
+
execute_job(worker, job_hash["args"])
|
168
162
|
end
|
169
163
|
end
|
164
|
+
ack = true
|
170
165
|
rescue Sidekiq::Shutdown
|
171
166
|
# Had to force kill this job because it didn't finish
|
172
167
|
# within the timeout. Don't acknowledge the work since
|
173
168
|
# we didn't properly finish it.
|
174
|
-
|
169
|
+
rescue Sidekiq::JobRetry::Handled => h
|
170
|
+
# this is the common case: job raised error and Sidekiq::JobRetry::Handled
|
171
|
+
# signals that we created a retry successfully. We can acknowlege the job.
|
172
|
+
ack = true
|
173
|
+
e = h.cause || h
|
174
|
+
handle_exception(e, {context: "Job raised exception", job: job_hash, jobstr: jobstr})
|
175
|
+
raise e
|
175
176
|
rescue Exception => ex
|
176
|
-
|
177
|
-
|
177
|
+
# Unexpected error! This is very bad and indicates an exception that got past
|
178
|
+
# the retry subsystem (e.g. network partition). We won't acknowledge the job
|
179
|
+
# so it can be rescued when using Sidekiq Pro.
|
180
|
+
handle_exception(ex, {context: "Internal exception!", job: job_hash, jobstr: jobstr})
|
178
181
|
raise e
|
179
182
|
ensure
|
180
|
-
|
183
|
+
if ack
|
184
|
+
# We don't want a shutdown signal to interrupt job acknowledgment.
|
185
|
+
Thread.handle_interrupt(Sidekiq::Shutdown => :never) do
|
186
|
+
work.acknowledge
|
187
|
+
end
|
188
|
+
end
|
181
189
|
end
|
182
190
|
end
|
183
191
|
|
@@ -194,12 +202,16 @@ module Sidekiq
|
|
194
202
|
@lock = Mutex.new
|
195
203
|
end
|
196
204
|
|
197
|
-
def incr(amount=1)
|
198
|
-
@lock.synchronize { @value
|
205
|
+
def incr(amount = 1)
|
206
|
+
@lock.synchronize { @value += amount }
|
199
207
|
end
|
200
208
|
|
201
209
|
def reset
|
202
|
-
@lock.synchronize {
|
210
|
+
@lock.synchronize {
|
211
|
+
val = @value
|
212
|
+
@value = 0
|
213
|
+
val
|
214
|
+
}
|
203
215
|
end
|
204
216
|
end
|
205
217
|
|
@@ -236,8 +248,7 @@ module Sidekiq
|
|
236
248
|
WORKER_STATE = SharedWorkerState.new
|
237
249
|
|
238
250
|
def stats(job_hash, queue)
|
239
|
-
tid
|
240
|
-
WORKER_STATE.set(tid, {:queue => queue, :payload => job_hash, :run_at => Time.now.to_i })
|
251
|
+
WORKER_STATE.set(tid, {queue: queue, payload: job_hash, run_at: Time.now.to_i})
|
241
252
|
|
242
253
|
begin
|
243
254
|
yield
|
@@ -250,23 +261,42 @@ module Sidekiq
|
|
250
261
|
end
|
251
262
|
end
|
252
263
|
|
253
|
-
# Deep clone the arguments passed to the worker so that if
|
254
|
-
# the job fails, what is pushed back onto Redis hasn't
|
255
|
-
# been mutated by the worker.
|
256
|
-
def cloned(thing)
|
257
|
-
Marshal.load(Marshal.dump(thing))
|
258
|
-
end
|
259
|
-
|
260
264
|
def constantize(str)
|
261
|
-
|
265
|
+
return Object.const_get(str) unless str.include?("::")
|
266
|
+
|
267
|
+
names = str.split("::")
|
262
268
|
names.shift if names.empty? || names.first.empty?
|
263
269
|
|
264
270
|
names.inject(Object) do |constant, name|
|
265
271
|
# the false flag limits search for name to under the constant namespace
|
266
272
|
# which mimics Rails' behaviour
|
267
|
-
constant.
|
273
|
+
constant.const_get(name, false)
|
268
274
|
end
|
269
275
|
end
|
270
276
|
|
277
|
+
# Deep clone the arguments passed to the worker so that if
|
278
|
+
# the job fails, what is pushed back onto Redis hasn't
|
279
|
+
# been mutated by the worker.
|
280
|
+
def json_clone(obj)
|
281
|
+
if Integer === obj || Float === obj || TrueClass === obj || FalseClass === obj || NilClass === obj
|
282
|
+
return obj
|
283
|
+
elsif String === obj
|
284
|
+
return obj.dup
|
285
|
+
elsif Array === obj
|
286
|
+
duped = Array.new(obj.size)
|
287
|
+
obj.each_with_index do |value, index|
|
288
|
+
duped[index] = json_clone(value)
|
289
|
+
end
|
290
|
+
elsif Hash === obj
|
291
|
+
duped = obj.dup
|
292
|
+
duped.each_pair do |key, value|
|
293
|
+
duped[key] = json_clone(value)
|
294
|
+
end
|
295
|
+
else
|
296
|
+
duped = obj.dup
|
297
|
+
end
|
298
|
+
|
299
|
+
duped
|
300
|
+
end
|
271
301
|
end
|
272
302
|
end
|
data/lib/sidekiq/rails.rb
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "sidekiq/worker"
|
4
|
+
|
3
5
|
module Sidekiq
|
4
6
|
class Rails < ::Rails::Engine
|
5
|
-
#
|
6
|
-
#
|
7
|
+
# By including the Options module, we allow AJs to directly control sidekiq features
|
8
|
+
# via the *sidekiq_options* class method and, for instance, not use AJ's retry system.
|
9
|
+
# AJ retries don't show up in the Sidekiq UI Retries tab, save any error data, can't be
|
10
|
+
# manually retried, don't automatically die, etc.
|
7
11
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
12
|
+
# class SomeJob < ActiveJob::Base
|
13
|
+
# queue_as :default
|
14
|
+
# sidekiq_options retry: 3, backtrace: 10
|
15
|
+
# def perform
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
initializer "sidekiq.active_job_integration" do
|
19
|
+
ActiveSupport.on_load(:active_job) do
|
20
|
+
include ::Sidekiq::Worker::Options unless respond_to?(:sidekiq_options)
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
24
|
+
# This hook happens after all initializers are run, just before returning
|
25
|
+
# from config/environment.rb back to sidekiq/cli.rb.
|
26
|
+
# We have to add the reloader after initialize to see if cache_classes has
|
27
|
+
# been turned on.
|
28
|
+
#
|
29
|
+
# None of this matters on the client-side, only within the Sidekiq process itself.
|
21
30
|
config.after_initialize do
|
22
|
-
# This hook happens after all initializers are run, just before returning
|
23
|
-
# from config/environment.rb back to sidekiq/cli.rb.
|
24
|
-
# We have to add the reloader after initialize to see if cache_classes has
|
25
|
-
# been turned on.
|
26
|
-
#
|
27
|
-
# None of this matters on the client-side, only within the Sidekiq process itself.
|
28
|
-
#
|
29
31
|
Sidekiq.configure_server do |_|
|
30
|
-
|
31
|
-
Sidekiq.options[:reloader] = Sidekiq::Rails::Reloader.new
|
32
|
-
end
|
32
|
+
Sidekiq.options[:reloader] = Sidekiq::Rails::Reloader.new
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -48,11 +48,5 @@ module Sidekiq
|
|
48
48
|
"#<Sidekiq::Rails::Reloader @app=#{@app.class.name}>"
|
49
49
|
end
|
50
50
|
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
if defined?(::Rails) && ::Rails::VERSION::MAJOR < 4
|
55
|
-
$stderr.puts("**************************************************")
|
56
|
-
$stderr.puts("⛔️ WARNING: Sidekiq server is no longer supported by Rails 3.2 - please ensure your server/workers are updated")
|
57
|
-
$stderr.puts("**************************************************")
|
51
|
+
end
|
58
52
|
end
|
@@ -1,36 +1,38 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
2
|
+
|
3
|
+
require "connection_pool"
|
4
|
+
require "redis"
|
5
|
+
require "uri"
|
5
6
|
|
6
7
|
module Sidekiq
|
7
8
|
class RedisConnection
|
8
9
|
class << self
|
9
|
-
|
10
|
-
def create(options={})
|
10
|
+
def create(options = {})
|
11
11
|
options.keys.each do |key|
|
12
12
|
options[key.to_sym] = options.delete(key)
|
13
13
|
end
|
14
14
|
|
15
|
-
options[:id] = "Sidekiq-#{Sidekiq.server? ? "server" : "client"}-PID-#{
|
15
|
+
options[:id] = "Sidekiq-#{Sidekiq.server? ? "server" : "client"}-PID-#{::Process.pid}" unless options.key?(:id)
|
16
16
|
options[:url] ||= determine_redis_provider
|
17
17
|
|
18
18
|
size = if options[:size]
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
19
|
+
options[:size]
|
20
|
+
elsif Sidekiq.server?
|
21
|
+
# Give ourselves plenty of connections. pool is lazy
|
22
|
+
# so we won't create them until we need them.
|
23
|
+
Sidekiq.options[:concurrency] + 5
|
24
|
+
elsif ENV["RAILS_MAX_THREADS"]
|
25
|
+
Integer(ENV["RAILS_MAX_THREADS"])
|
26
|
+
else
|
27
|
+
5
|
28
|
+
end
|
27
29
|
|
28
30
|
verify_sizing(size, Sidekiq.options[:concurrency]) if Sidekiq.server?
|
29
31
|
|
30
32
|
pool_timeout = options[:pool_timeout] || 1
|
31
33
|
log_info(options)
|
32
34
|
|
33
|
-
ConnectionPool.new(:
|
35
|
+
ConnectionPool.new(timeout: pool_timeout, size: size) do
|
34
36
|
build_client(options)
|
35
37
|
end
|
36
38
|
end
|
@@ -46,7 +48,7 @@ module Sidekiq
|
|
46
48
|
# - enterprise's leader election
|
47
49
|
# - enterprise's cron support
|
48
50
|
def verify_sizing(size, concurrency)
|
49
|
-
raise ArgumentError, "Your Redis connection pool is too small for Sidekiq to work. Your pool has #{size} connections but must have at least #{concurrency + 2}" if size
|
51
|
+
raise ArgumentError, "Your Redis connection pool is too small for Sidekiq to work. Your pool has #{size} connections but must have at least #{concurrency + 2}" if size < (concurrency + 2)
|
50
52
|
end
|
51
53
|
|
52
54
|
def build_client(options)
|
@@ -55,8 +57,8 @@ module Sidekiq
|
|
55
57
|
client = Redis.new client_opts(options)
|
56
58
|
if namespace
|
57
59
|
begin
|
58
|
-
require
|
59
|
-
Redis::Namespace.new(namespace, :
|
60
|
+
require "redis/namespace"
|
61
|
+
Redis::Namespace.new(namespace, redis: client)
|
60
62
|
rescue LoadError
|
61
63
|
Sidekiq.logger.error("Your Redis configuration uses the namespace '#{namespace}' but the redis-namespace gem is not included in the Gemfile." \
|
62
64
|
"Add the gem to your Gemfile to continue using a namespace. Otherwise, remove the namespace parameter.")
|
@@ -78,7 +80,7 @@ module Sidekiq
|
|
78
80
|
opts.delete(:network_timeout)
|
79
81
|
end
|
80
82
|
|
81
|
-
opts[:driver] ||= Redis::Connection.drivers.last ||
|
83
|
+
opts[:driver] ||= Redis::Connection.drivers.last || "ruby"
|
82
84
|
|
83
85
|
# Issue #3303, redis-rb will silently retry an operation.
|
84
86
|
# This can lead to duplicate jobs if Sidekiq::Client's LPUSH
|
@@ -115,30 +117,22 @@ module Sidekiq
|
|
115
117
|
# REDIS_PROVIDER=MY_REDIS_URL
|
116
118
|
# and Sidekiq will find your custom URL variable with no custom
|
117
119
|
# initialization code at all.
|
118
|
-
|
120
|
+
#
|
121
|
+
p = ENV["REDIS_PROVIDER"]
|
119
122
|
if p && p =~ /\:/
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
REDIS_PROVIDER should be set to the **name** of the variable which contains the Redis URL, not a URL itself.
|
125
|
-
Platforms like Heroku sell addons that publish a *_URL variable. You tell Sidekiq with REDIS_PROVIDER, e.g.:
|
123
|
+
raise <<~EOM
|
124
|
+
REDIS_PROVIDER should be set to the name of the variable which contains the Redis URL, not a URL itself.
|
125
|
+
Platforms like Heroku will sell addons that publish a *_URL variable. You need to tell Sidekiq with REDIS_PROVIDER, e.g.:
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
Use REDIS_URL if you wish to point Sidekiq to a URL directly.
|
131
|
-
|
132
|
-
This configuration error will crash starting in Sidekiq 5.3.
|
133
|
-
|
134
|
-
#################################################################################
|
135
|
-
EOM
|
127
|
+
REDISTOGO_URL=redis://somehost.example.com:6379/4
|
128
|
+
REDIS_PROVIDER=REDISTOGO_URL
|
129
|
+
EOM
|
136
130
|
end
|
131
|
+
|
137
132
|
ENV[
|
138
|
-
|
133
|
+
p || "REDIS_URL"
|
139
134
|
]
|
140
135
|
end
|
141
|
-
|
142
136
|
end
|
143
137
|
end
|
144
138
|
end
|