sidekiq-limit_fetch 4.4.0 → 4.4.1
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/.github/workflows/ci.yml +2 -0
- data/.rubocop.yml +29 -0
- data/Appraisals +2 -0
- data/Gemfile +2 -0
- data/Rakefile +2 -0
- data/bench/compare.rb +17 -13
- data/demo/Gemfile +3 -2
- data/demo/Rakefile +6 -5
- data/demo/app/workers/a_worker.rb +2 -0
- data/demo/app/workers/b_worker.rb +2 -0
- data/demo/app/workers/c_worker.rb +2 -1
- data/demo/app/workers/fast_worker.rb +2 -0
- data/demo/app/workers/slow_worker.rb +2 -0
- data/demo/config/application.rb +3 -1
- data/demo/config/boot.rb +4 -2
- data/demo/config/environment.rb +3 -1
- data/demo/config/environments/development.rb +2 -0
- data/docker-compose.dev.yml +2 -2
- data/lib/sidekiq/extensions/manager.rb +20 -17
- data/lib/sidekiq/extensions/queue.rb +16 -13
- data/lib/sidekiq/limit_fetch/global/monitor.rb +64 -58
- data/lib/sidekiq/limit_fetch/global/selector.rb +49 -44
- data/lib/sidekiq/limit_fetch/global/semaphore.rb +130 -123
- data/lib/sidekiq/limit_fetch/instances.rb +22 -16
- data/lib/sidekiq/limit_fetch/queues.rb +163 -137
- data/lib/sidekiq/limit_fetch/unit_of_work.rb +26 -22
- data/lib/sidekiq/limit_fetch.rb +68 -64
- data/lib/sidekiq-limit_fetch.rb +2 -0
- data/sidekiq-limit_fetch.gemspec +18 -10
- data/spec/sidekiq/extensions/manager_spec.rb +19 -0
- data/spec/sidekiq/extensions/queue_spec.rb +2 -0
- data/spec/sidekiq/limit_fetch/global/monitor_spec.rb +59 -32
- data/spec/sidekiq/limit_fetch/queues_spec.rb +34 -18
- data/spec/sidekiq/limit_fetch/semaphore_spec.rb +2 -0
- data/spec/sidekiq/limit_fetch_spec.rb +14 -4
- data/spec/spec_helper.rb +8 -3
- metadata +39 -14
@@ -1,32 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Sidekiq
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module LimitFetch
|
5
|
+
class UnitOfWork < BasicFetch::UnitOfWork
|
6
|
+
def initialize(queue, job)
|
7
|
+
if post_6_5?
|
8
|
+
super(queue, job, Sidekiq)
|
9
|
+
else
|
10
|
+
super
|
11
|
+
end
|
12
|
+
redis_retryable { Queue[queue_name].increase_busy }
|
8
13
|
end
|
9
|
-
redis_retryable { Queue[queue_name].increase_busy }
|
10
|
-
end
|
11
14
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
def acknowledge
|
16
|
+
redis_retryable { Queue[queue_name].decrease_busy }
|
17
|
+
redis_retryable { Queue[queue_name].release }
|
18
|
+
end
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
def requeue
|
21
|
+
super
|
22
|
+
acknowledge
|
23
|
+
end
|
21
24
|
|
22
|
-
|
25
|
+
private
|
23
26
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
+
def post_6_5?
|
28
|
+
Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('6.5.0')
|
29
|
+
end
|
27
30
|
|
28
|
-
|
29
|
-
|
31
|
+
def redis_retryable(&block)
|
32
|
+
Sidekiq::LimitFetch.redis_retryable(&block)
|
33
|
+
end
|
30
34
|
end
|
31
35
|
end
|
32
36
|
end
|
data/lib/sidekiq/limit_fetch.rb
CHANGED
@@ -1,91 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'forwardable'
|
2
4
|
require 'sidekiq'
|
3
5
|
require 'sidekiq/manager'
|
4
6
|
require 'sidekiq/api'
|
5
7
|
|
6
|
-
module Sidekiq
|
7
|
-
|
8
|
+
module Sidekiq
|
9
|
+
module LimitFetch
|
10
|
+
autoload :UnitOfWork, 'sidekiq/limit_fetch/unit_of_work'
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
require_relative 'limit_fetch/instances'
|
13
|
+
require_relative 'limit_fetch/queues'
|
14
|
+
require_relative 'limit_fetch/global/semaphore'
|
15
|
+
require_relative 'limit_fetch/global/selector'
|
16
|
+
require_relative 'limit_fetch/global/monitor'
|
17
|
+
require_relative 'extensions/queue'
|
18
|
+
require_relative 'extensions/manager'
|
16
19
|
|
17
|
-
|
20
|
+
TIMEOUT = Sidekiq::BasicFetch::TIMEOUT
|
18
21
|
|
19
|
-
|
22
|
+
extend self
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
+
def post_7?
|
25
|
+
@post_7 ||= Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('7.0.0')
|
26
|
+
end
|
24
27
|
|
25
|
-
|
26
|
-
|
28
|
+
def post_6_5?
|
29
|
+
@post_6_5 ||= Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('6.5.0')
|
30
|
+
end
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
32
|
+
RedisBaseConnectionError = post_7? ? RedisClient::ConnectionError : Redis::BaseConnectionError
|
33
|
+
RedisCommandError = post_7? ? RedisClient::CommandError : Redis::CommandError
|
31
34
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
UnitOfWork.new(queue, job) if job
|
36
|
-
end
|
35
|
+
def new(_)
|
36
|
+
self
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
def retrieve_work
|
40
|
+
queue, job = redis_brpop(Queues.acquire)
|
41
|
+
Queues.release_except(queue)
|
42
|
+
UnitOfWork.new(queue, job) if job
|
43
|
+
end
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
if Sidekiq::BasicFetch.respond_to?(:bulk_requeue) # < 6.1.0
|
47
|
-
Sidekiq::BasicFetch.bulk_requeue(*args)
|
48
|
-
else # 6.1.0+
|
49
|
-
Sidekiq::BasicFetch.new(config).bulk_requeue(*args)
|
45
|
+
def config
|
46
|
+
# Post 6.5, Sidekiq.options is deprecated and replaced with passing Sidekiq directly
|
47
|
+
post_6_5? ? Sidekiq : Sidekiq.options
|
50
48
|
end
|
51
|
-
end
|
52
49
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
# Backwards compatibility for sidekiq v6.1.0
|
51
|
+
# @see https://github.com/mperham/sidekiq/pull/4602
|
52
|
+
def bulk_requeue(*args)
|
53
|
+
if Sidekiq::BasicFetch.respond_to?(:bulk_requeue) # < 6.1.0
|
54
|
+
Sidekiq::BasicFetch.bulk_requeue(*args)
|
55
|
+
else # 6.1.0+
|
56
|
+
Sidekiq::BasicFetch.new(post_7? ? Sidekiq.default_configuration.default_capsule : config).bulk_requeue(*args)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def redis_retryable
|
61
|
+
yield
|
62
|
+
rescue RedisBaseConnectionError
|
62
63
|
sleep TIMEOUT
|
63
64
|
retry
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
rescue RedisCommandError => e
|
66
|
+
# If Redis was restarted and is still loading its snapshot,
|
67
|
+
# then we should treat this as a temporary connection error too.
|
68
|
+
raise unless e.message =~ /^LOADING/
|
68
69
|
|
69
|
-
|
70
|
+
sleep TIMEOUT
|
71
|
+
retry
|
72
|
+
end
|
70
73
|
|
71
|
-
|
72
|
-
@post_6_5 ||= Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('6.5.0')
|
73
|
-
end
|
74
|
+
private
|
74
75
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
# rubocop:disable Metrics/MethodLength
|
77
|
+
def redis_brpop(queues)
|
78
|
+
if queues.empty?
|
79
|
+
sleep TIMEOUT # there are no queues to handle, so lets sleep
|
80
|
+
[] # and return nothing
|
81
|
+
else
|
82
|
+
redis_retryable do
|
83
|
+
Sidekiq.redis do |it|
|
84
|
+
if post_7?
|
85
|
+
it.blocking_call(false, 'brpop', *queues, TIMEOUT)
|
86
|
+
else
|
87
|
+
it.brpop(*queues, timeout: TIMEOUT)
|
88
|
+
end
|
86
89
|
end
|
87
90
|
end
|
88
91
|
end
|
89
92
|
end
|
93
|
+
# rubocop:enable Metrics/MethodLength
|
90
94
|
end
|
91
95
|
end
|
data/lib/sidekiq-limit_fetch.rb
CHANGED
data/sidekiq-limit_fetch.gemspec
CHANGED
@@ -1,24 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'English'
|
1
4
|
Gem::Specification.new do |gem|
|
2
5
|
gem.name = 'sidekiq-limit_fetch'
|
3
|
-
gem.version = '4.4.
|
6
|
+
gem.version = '4.4.1'
|
4
7
|
gem.license = 'MIT'
|
5
8
|
gem.authors = ['Dean Perry']
|
6
9
|
gem.email = 'dean@deanpcmad.com'
|
7
10
|
gem.summary = 'Sidekiq strategy to support queue limits'
|
8
11
|
gem.homepage = 'https://github.com/deanpcmad/sidekiq-limit_fetch'
|
9
|
-
gem.description =
|
12
|
+
gem.description = 'Sidekiq strategy to restrict number of workers which are able to run specified ' \
|
13
|
+
'queues simultaneously.'
|
14
|
+
|
15
|
+
gem.metadata['homepage_uri'] = gem.homepage
|
16
|
+
gem.metadata['source_code_uri'] = 'https://github.com/deanpcmad/sidekiq-limit_fetch'
|
17
|
+
gem.metadata['changelog_uri'] = 'https://github.com/deanpcmad/sidekiq-limit_fetch/blob/master/CHANGELOG.md'
|
18
|
+
gem.metadata['rubygems_mfa_required'] = 'true'
|
10
19
|
|
11
|
-
gem.
|
12
|
-
gem.
|
13
|
-
gem.metadata["changelog_uri"] = "https://github.com/deanpcmad/sidekiq-limit_fetch/blob/master/CHANGELOG.md"
|
20
|
+
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
21
|
+
gem.require_paths = %w[lib]
|
14
22
|
|
15
|
-
gem.
|
16
|
-
gem.test_files = gem.files.grep %r{^spec/}
|
17
|
-
gem.require_paths = %w(lib)
|
23
|
+
gem.required_ruby_version = '>= 2.7.0'
|
18
24
|
|
19
25
|
gem.add_dependency 'sidekiq', '>= 6'
|
20
|
-
gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
|
21
26
|
gem.add_development_dependency 'appraisal'
|
22
|
-
gem.add_development_dependency 'rspec'
|
23
27
|
gem.add_development_dependency 'rake'
|
28
|
+
gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
|
29
|
+
gem.add_development_dependency 'rspec'
|
30
|
+
gem.add_development_dependency 'rubocop'
|
31
|
+
gem.add_development_dependency 'simplecov'
|
24
32
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Sidekiq::Manager do
|
4
|
+
let(:capsule_or_options) do
|
5
|
+
if Sidekiq::LimitFetch.post_7?
|
6
|
+
Sidekiq.default_configuration.default_capsule
|
7
|
+
elsif Sidekiq::LimitFetch.post_6_5?
|
8
|
+
Sidekiq
|
9
|
+
else
|
10
|
+
Sidekiq.options
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'can be instantiated' do
|
15
|
+
expect(described_class).to be < Sidekiq::Manager::InitLimitFetch
|
16
|
+
manager = described_class.new(capsule_or_options)
|
17
|
+
expect(manager).to respond_to(:start)
|
18
|
+
end
|
19
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
RSpec.describe Sidekiq::LimitFetch::Global::Monitor do
|
2
4
|
let(:monitor) { described_class.start! ttl, timeout }
|
3
5
|
let(:ttl) { 1 }
|
@@ -12,11 +14,11 @@ RSpec.describe Sidekiq::LimitFetch::Global::Monitor do
|
|
12
14
|
|
13
15
|
it 'should remove invalidated old locks' do
|
14
16
|
2.times { queue.acquire }
|
15
|
-
sleep 2
|
17
|
+
sleep ttl * 2
|
16
18
|
expect(queue.probed).to eq 2
|
17
19
|
|
18
20
|
allow(described_class).to receive(:update_heartbeat)
|
19
|
-
sleep 2
|
21
|
+
sleep ttl * 2
|
20
22
|
expect(queue.probed).to eq 0
|
21
23
|
end
|
22
24
|
|
@@ -26,61 +28,86 @@ RSpec.describe Sidekiq::LimitFetch::Global::Monitor do
|
|
26
28
|
Sidekiq.redis do |it|
|
27
29
|
it.del Sidekiq::LimitFetch::Global::Monitor::PROCESS_SET
|
28
30
|
end
|
29
|
-
sleep 2
|
31
|
+
sleep ttl * 2
|
30
32
|
expect(queue.probed).to eq 0
|
31
33
|
end
|
32
|
-
|
33
34
|
end
|
34
35
|
|
35
36
|
context 'dynamic queue' do
|
36
37
|
let(:limits) do
|
37
38
|
{
|
38
39
|
'queue1' => 3,
|
39
|
-
'queue2' => 3
|
40
|
+
'queue2' => 3
|
40
41
|
}
|
41
42
|
end
|
42
43
|
let(:queues) { %w[queue1 queue2] }
|
43
44
|
let(:queue) { Sidekiq::LimitFetch::Queues }
|
44
|
-
let(:options) do
|
45
|
-
{
|
46
|
-
limits: limits,
|
47
|
-
queues: queues,
|
48
|
-
}
|
49
|
-
end
|
50
45
|
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
let(:config) { Sidekiq::Config.new(options) }
|
47
|
+
let(:capsule) do
|
48
|
+
config.capsule('default') do |cap|
|
49
|
+
cap.concurrency = 1
|
50
|
+
cap.queues = config[:queues]
|
51
|
+
end
|
52
|
+
end
|
54
53
|
|
55
|
-
|
54
|
+
let(:capsule_or_options) do
|
55
|
+
Sidekiq::LimitFetch.post_7? ? capsule : options
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
-
|
58
|
+
context 'without excluded queue' do
|
59
|
+
let(:options) do
|
60
|
+
{
|
61
|
+
limits: limits,
|
62
|
+
queues: queues,
|
63
|
+
dynamic: true
|
64
|
+
}
|
59
65
|
end
|
60
66
|
|
61
|
-
|
62
|
-
|
67
|
+
it 'should add dynamic queue' do
|
68
|
+
queue.start(capsule_or_options)
|
69
|
+
monitor
|
63
70
|
|
64
|
-
|
65
|
-
|
71
|
+
expect(queue.instance_variable_get(:@queues)).not_to include('queue3')
|
72
|
+
|
73
|
+
Sidekiq.redis do |it|
|
74
|
+
it.sadd 'queues', 'queue3'
|
75
|
+
end
|
76
|
+
|
77
|
+
sleep ttl * 2
|
78
|
+
expect(queue.instance_variable_get(:@queues)).to include('queue3')
|
79
|
+
|
80
|
+
Sidekiq.redis do |it|
|
81
|
+
it.srem 'queues', 'queue3'
|
82
|
+
end
|
66
83
|
end
|
67
84
|
end
|
68
85
|
|
69
|
-
|
70
|
-
|
71
|
-
|
86
|
+
context 'with excluded queue' do
|
87
|
+
let(:options) do
|
88
|
+
{
|
89
|
+
limits: limits,
|
90
|
+
queues: queues,
|
91
|
+
dynamic: { exclude: ['queue4'] }
|
92
|
+
}
|
93
|
+
end
|
72
94
|
|
73
|
-
|
95
|
+
it 'should exclude excluded dynamic queue' do
|
96
|
+
queue.start(capsule_or_options)
|
97
|
+
monitor
|
74
98
|
|
75
|
-
|
76
|
-
it.sadd 'queues', 'queue4'
|
77
|
-
end
|
99
|
+
expect(queue.instance_variable_get(:@queues)).not_to include('queue4')
|
78
100
|
|
79
|
-
|
80
|
-
|
101
|
+
Sidekiq.redis do |it|
|
102
|
+
it.sadd 'queues', 'queue4'
|
103
|
+
end
|
81
104
|
|
82
|
-
|
83
|
-
|
105
|
+
sleep ttl * 2
|
106
|
+
expect(queue.instance_variable_get(:@queues)).not_to include('queue4')
|
107
|
+
|
108
|
+
Sidekiq.redis do |it|
|
109
|
+
it.srem 'queues', 'queue4'
|
110
|
+
end
|
84
111
|
end
|
85
112
|
end
|
86
113
|
end
|
@@ -1,19 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
RSpec.describe Sidekiq::LimitFetch::Queues do
|
2
4
|
let(:queues) { %w[queue1 queue2] }
|
3
|
-
let(:limits) {{ 'queue1' => 3 }}
|
5
|
+
let(:limits) { { 'queue1' => 3 } }
|
4
6
|
let(:strict) { true }
|
5
|
-
let(:blocking) {}
|
6
|
-
let(:process_limits) {{ 'queue2' => 3 }}
|
7
|
+
let(:blocking) { nil }
|
8
|
+
let(:process_limits) { { 'queue2' => 3 } }
|
7
9
|
|
8
10
|
let(:options) do
|
9
|
-
{ queues:
|
10
|
-
limits:
|
11
|
-
strict:
|
11
|
+
{ queues: queues,
|
12
|
+
limits: limits,
|
13
|
+
strict: strict,
|
12
14
|
blocking: blocking,
|
13
15
|
process_limits: process_limits }
|
14
16
|
end
|
15
17
|
|
16
|
-
|
18
|
+
let(:config) { Sidekiq::Config.new(options) }
|
19
|
+
let(:capsule) do
|
20
|
+
config.capsule('default') do |cap|
|
21
|
+
cap.concurrency = 1
|
22
|
+
cap.queues = config[:queues]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:capsule_or_options) do
|
27
|
+
Sidekiq::LimitFetch.post_7? ? capsule : options
|
28
|
+
end
|
29
|
+
|
30
|
+
before do
|
31
|
+
subject.start(capsule_or_options)
|
32
|
+
end
|
17
33
|
|
18
34
|
def in_thread(&block)
|
19
35
|
thr = Thread.new(&block)
|
@@ -51,36 +67,36 @@ RSpec.describe Sidekiq::LimitFetch::Queues do
|
|
51
67
|
end
|
52
68
|
|
53
69
|
it 'should release queues' do
|
54
|
-
in_thread
|
70
|
+
in_thread do
|
55
71
|
subject.acquire
|
56
72
|
subject.release_except nil
|
57
|
-
|
73
|
+
end
|
58
74
|
expect(Sidekiq::Queue['queue1'].probed).to eq 0
|
59
75
|
expect(Sidekiq::Queue['queue2'].probed).to eq 0
|
60
76
|
end
|
61
77
|
|
62
78
|
it 'should release queues except selected' do
|
63
|
-
in_thread
|
79
|
+
in_thread do
|
64
80
|
subject.acquire
|
65
81
|
subject.release_except 'queue:queue1'
|
66
|
-
|
82
|
+
end
|
67
83
|
expect(Sidekiq::Queue['queue1'].probed).to eq 1
|
68
84
|
expect(Sidekiq::Queue['queue2'].probed).to eq 0
|
69
85
|
end
|
70
86
|
|
71
87
|
it 'should release when no queues was acquired' do
|
72
|
-
queues.each {|name| Sidekiq::Queue[name].pause }
|
73
|
-
in_thread
|
88
|
+
queues.each { |name| Sidekiq::Queue[name].pause }
|
89
|
+
in_thread do
|
74
90
|
subject.acquire
|
75
91
|
expect { subject.release_except nil }.not_to raise_exception
|
76
|
-
|
92
|
+
end
|
77
93
|
end
|
78
94
|
|
79
95
|
context 'blocking' do
|
80
|
-
let(:blocking) { %w
|
96
|
+
let(:blocking) { %w[queue1] }
|
81
97
|
|
82
98
|
it 'should acquire blocking queues' do
|
83
|
-
3.times { in_thread { subject.acquire
|
99
|
+
3.times { in_thread { subject.acquire } }
|
84
100
|
expect(Sidekiq::Queue['queue1'].probed).to eq 3
|
85
101
|
expect(Sidekiq::Queue['queue2'].probed).to eq 1
|
86
102
|
end
|
@@ -101,11 +117,11 @@ RSpec.describe Sidekiq::LimitFetch::Queues do
|
|
101
117
|
let(:strict) { false }
|
102
118
|
|
103
119
|
it 'should retrieve weighted queues' do
|
104
|
-
expect(subject.ordered_queues).to match_array(%w
|
120
|
+
expect(subject.ordered_queues).to match_array(%w[queue1 queue2])
|
105
121
|
end
|
106
122
|
end
|
107
123
|
|
108
124
|
it 'with strict flag should retrieve strictly ordered queues' do
|
109
|
-
expect(subject.ordered_queues).to eq %w
|
125
|
+
expect(subject.ordered_queues).to eq %w[queue1 queue2]
|
110
126
|
end
|
111
127
|
end
|
@@ -1,12 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Thread.abort_on_exception = true
|
2
4
|
|
3
5
|
RSpec.describe Sidekiq::LimitFetch do
|
4
|
-
let(:options) {{ queues: queues, limits: limits }}
|
5
|
-
let(:queues) { %w
|
6
|
-
let(:limits) {{ 'queue1' => 1, 'queue2' => 2 }}
|
6
|
+
let(:options) { { queues: queues, limits: limits } }
|
7
|
+
let(:queues) { %w[queue1 queue1 queue2 queue2] }
|
8
|
+
let(:limits) { { 'queue1' => 1, 'queue2' => 2 } }
|
9
|
+
let(:config) { Sidekiq::Config.new(options) }
|
10
|
+
let(:capsule) do
|
11
|
+
config.capsule('default') do |cap|
|
12
|
+
cap.concurrency = 1
|
13
|
+
cap.queues = config[:queues]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
let(:capsule_or_config) { Sidekiq::LimitFetch.post_7? ? capsule : options }
|
7
17
|
|
8
18
|
before do
|
9
|
-
subject::Queues.start
|
19
|
+
subject::Queues.start(capsule_or_config)
|
10
20
|
|
11
21
|
Sidekiq.redis do |it|
|
12
22
|
it.del 'queue:queue1'
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start
|
5
|
+
|
1
6
|
require 'sidekiq/limit_fetch'
|
2
7
|
|
3
8
|
if Sidekiq::LimitFetch.post_7?
|
@@ -6,7 +11,7 @@ if Sidekiq::LimitFetch.post_7?
|
|
6
11
|
end
|
7
12
|
else
|
8
13
|
Sidekiq.logger = nil
|
9
|
-
Sidekiq.redis = { namespace: ENV
|
14
|
+
Sidekiq.redis = { namespace: ENV.fetch('namespace', nil) }
|
10
15
|
end
|
11
16
|
|
12
17
|
RSpec.configure do |config|
|
@@ -16,7 +21,7 @@ RSpec.configure do |config|
|
|
16
21
|
config.before do
|
17
22
|
Sidekiq::Queue.reset_instances!
|
18
23
|
Sidekiq.redis do |it|
|
19
|
-
clean_redis =
|
24
|
+
clean_redis = lambda do |queue|
|
20
25
|
it.pipelined do |pipeline|
|
21
26
|
pipeline.del "limit_fetch:limit:#{queue}"
|
22
27
|
pipeline.del "limit_fetch:process_limit:#{queue}"
|
@@ -28,7 +33,7 @@ RSpec.configure do |config|
|
|
28
33
|
end
|
29
34
|
|
30
35
|
clean_redis.call(name) if defined?(name)
|
31
|
-
queues.each(&clean_redis) if defined?(queues)
|
36
|
+
queues.each(&clean_redis) if defined?(queues) && queues.is_a?(Array)
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|