sidekiq-limit_fetch 3.3.1 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +42 -0
  3. data/Appraisals +35 -0
  4. data/CHANGELOG.md +22 -0
  5. data/LICENSE +22 -0
  6. data/README.md +52 -51
  7. data/demo/Gemfile +0 -2
  8. data/demo/Rakefile +1 -1
  9. data/gemfiles/sidekiq_5.0.gemfile +7 -0
  10. data/gemfiles/sidekiq_5.0.gemfile.lock +57 -0
  11. data/gemfiles/sidekiq_5.1.gemfile +7 -0
  12. data/gemfiles/sidekiq_5.1.gemfile.lock +57 -0
  13. data/gemfiles/sidekiq_5.2.gemfile +7 -0
  14. data/gemfiles/sidekiq_5.2.gemfile.lock +56 -0
  15. data/gemfiles/sidekiq_6.0.gemfile +7 -0
  16. data/gemfiles/sidekiq_6.0.gemfile.lock +56 -0
  17. data/gemfiles/sidekiq_6.1.gemfile +7 -0
  18. data/gemfiles/sidekiq_6.1.gemfile.lock +53 -0
  19. data/gemfiles/sidekiq_6.2.gemfile +7 -0
  20. data/gemfiles/sidekiq_6.2.gemfile.lock +53 -0
  21. data/gemfiles/sidekiq_6.3.gemfile +7 -0
  22. data/gemfiles/sidekiq_6.3.gemfile.lock +53 -0
  23. data/gemfiles/sidekiq_6.4.gemfile +7 -0
  24. data/gemfiles/sidekiq_6.4.gemfile.lock +53 -0
  25. data/gemfiles/sidekiq_master.gemfile +7 -0
  26. data/gemfiles/sidekiq_master.gemfile.lock +58 -0
  27. data/lib/sidekiq/extensions/queue.rb +2 -1
  28. data/lib/sidekiq/limit_fetch/global/monitor.rb +7 -7
  29. data/lib/sidekiq/limit_fetch/global/semaphore.rb +8 -0
  30. data/lib/sidekiq/limit_fetch/instances.rb +4 -0
  31. data/lib/sidekiq/limit_fetch/queues.rb +85 -26
  32. data/lib/sidekiq/limit_fetch.rb +19 -4
  33. data/sidekiq-limit_fetch.gemspec +11 -8
  34. data/spec/sidekiq/limit_fetch/queues_spec.rb +23 -12
  35. data/spec/sidekiq/limit_fetch_spec.rb +1 -1
  36. data/spec/spec_helper.rb +7 -7
  37. metadata +62 -12
  38. data/.travis.yml +0 -10
  39. data/LICENSE.txt +0 -22
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ sidekiq-limit_fetch (3.4.0)
5
+ redis (>= 4.6.0)
6
+ sidekiq (>= 4)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ appraisal (2.4.1)
12
+ bundler
13
+ rake
14
+ thor (>= 0.14.0)
15
+ connection_pool (2.2.5)
16
+ diff-lcs (1.5.0)
17
+ rack (2.2.3)
18
+ rake (13.0.6)
19
+ redis (4.6.0)
20
+ redis-namespace (1.8.2)
21
+ redis (>= 3.0.4)
22
+ rspec (3.11.0)
23
+ rspec-core (~> 3.11.0)
24
+ rspec-expectations (~> 3.11.0)
25
+ rspec-mocks (~> 3.11.0)
26
+ rspec-core (3.11.0)
27
+ rspec-support (~> 3.11.0)
28
+ rspec-expectations (3.11.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.11.0)
31
+ rspec-mocks (3.11.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.11.0)
34
+ rspec-support (3.11.0)
35
+ sidekiq (6.2.1)
36
+ connection_pool (>= 2.2.2)
37
+ rack (~> 2.0)
38
+ redis (>= 4.2.0)
39
+ thor (1.2.1)
40
+
41
+ PLATFORMS
42
+ x86_64-linux
43
+
44
+ DEPENDENCIES
45
+ appraisal
46
+ rake
47
+ redis-namespace (~> 1.5, >= 1.5.2)
48
+ rspec
49
+ sidekiq (~> 6.2.0)
50
+ sidekiq-limit_fetch!
51
+
52
+ BUNDLED WITH
53
+ 2.3.6
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sidekiq", "~> 6.3.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ sidekiq-limit_fetch (3.4.0)
5
+ redis (>= 4.6.0)
6
+ sidekiq (>= 4)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ appraisal (2.4.1)
12
+ bundler
13
+ rake
14
+ thor (>= 0.14.0)
15
+ connection_pool (2.2.5)
16
+ diff-lcs (1.5.0)
17
+ rack (2.2.3)
18
+ rake (13.0.6)
19
+ redis (4.6.0)
20
+ redis-namespace (1.8.2)
21
+ redis (>= 3.0.4)
22
+ rspec (3.11.0)
23
+ rspec-core (~> 3.11.0)
24
+ rspec-expectations (~> 3.11.0)
25
+ rspec-mocks (~> 3.11.0)
26
+ rspec-core (3.11.0)
27
+ rspec-support (~> 3.11.0)
28
+ rspec-expectations (3.11.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.11.0)
31
+ rspec-mocks (3.11.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.11.0)
34
+ rspec-support (3.11.0)
35
+ sidekiq (6.3.1)
36
+ connection_pool (>= 2.2.2)
37
+ rack (~> 2.0)
38
+ redis (>= 4.2.0)
39
+ thor (1.2.1)
40
+
41
+ PLATFORMS
42
+ x86_64-linux
43
+
44
+ DEPENDENCIES
45
+ appraisal
46
+ rake
47
+ redis-namespace (~> 1.5, >= 1.5.2)
48
+ rspec
49
+ sidekiq (~> 6.3.0)
50
+ sidekiq-limit_fetch!
51
+
52
+ BUNDLED WITH
53
+ 2.3.6
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sidekiq", "~> 6.4.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ sidekiq-limit_fetch (3.4.0)
5
+ redis (>= 4.6.0)
6
+ sidekiq (>= 4)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ appraisal (2.4.1)
12
+ bundler
13
+ rake
14
+ thor (>= 0.14.0)
15
+ connection_pool (2.2.5)
16
+ diff-lcs (1.5.0)
17
+ rack (2.2.3)
18
+ rake (13.0.6)
19
+ redis (4.6.0)
20
+ redis-namespace (1.8.2)
21
+ redis (>= 3.0.4)
22
+ rspec (3.11.0)
23
+ rspec-core (~> 3.11.0)
24
+ rspec-expectations (~> 3.11.0)
25
+ rspec-mocks (~> 3.11.0)
26
+ rspec-core (3.11.0)
27
+ rspec-support (~> 3.11.0)
28
+ rspec-expectations (3.11.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.11.0)
31
+ rspec-mocks (3.11.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.11.0)
34
+ rspec-support (3.11.0)
35
+ sidekiq (6.4.1)
36
+ connection_pool (>= 2.2.2)
37
+ rack (~> 2.0)
38
+ redis (>= 4.2.0)
39
+ thor (1.2.1)
40
+
41
+ PLATFORMS
42
+ x86_64-linux
43
+
44
+ DEPENDENCIES
45
+ appraisal
46
+ rake
47
+ redis-namespace (~> 1.5, >= 1.5.2)
48
+ rspec
49
+ sidekiq (~> 6.4.0)
50
+ sidekiq-limit_fetch!
51
+
52
+ BUNDLED WITH
53
+ 2.3.6
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sidekiq", github: "mperham/sidekiq"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,58 @@
1
+ GIT
2
+ remote: https://github.com/mperham/sidekiq.git
3
+ revision: cf7b067c89ae3b1303e35d29408099cf40991f6d
4
+ specs:
5
+ sidekiq (6.4.2)
6
+ connection_pool (>= 2.2.2)
7
+ rack (~> 2.0)
8
+ redis (>= 4.2.0)
9
+
10
+ PATH
11
+ remote: ..
12
+ specs:
13
+ sidekiq-limit_fetch (3.4.0)
14
+ redis (>= 4.6.0)
15
+ sidekiq (>= 4)
16
+
17
+ GEM
18
+ remote: https://rubygems.org/
19
+ specs:
20
+ appraisal (2.4.1)
21
+ bundler
22
+ rake
23
+ thor (>= 0.14.0)
24
+ connection_pool (2.2.5)
25
+ diff-lcs (1.5.0)
26
+ rack (2.2.3)
27
+ rake (13.0.6)
28
+ redis (4.6.0)
29
+ redis-namespace (1.8.2)
30
+ redis (>= 3.0.4)
31
+ rspec (3.11.0)
32
+ rspec-core (~> 3.11.0)
33
+ rspec-expectations (~> 3.11.0)
34
+ rspec-mocks (~> 3.11.0)
35
+ rspec-core (3.11.0)
36
+ rspec-support (~> 3.11.0)
37
+ rspec-expectations (3.11.0)
38
+ diff-lcs (>= 1.2.0, < 2.0)
39
+ rspec-support (~> 3.11.0)
40
+ rspec-mocks (3.11.0)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.11.0)
43
+ rspec-support (3.11.0)
44
+ thor (1.2.1)
45
+
46
+ PLATFORMS
47
+ x86_64-linux
48
+
49
+ DEPENDENCIES
50
+ appraisal
51
+ rake
52
+ redis-namespace (~> 1.5, >= 1.5.2)
53
+ rspec
54
+ sidekiq!
55
+ sidekiq-limit_fetch!
56
+
57
+ BUNDLED WITH
58
+ 2.3.6
@@ -14,7 +14,8 @@ module Sidekiq
14
14
  :probed, :busy,
15
15
  :increase_busy, :decrease_busy,
16
16
  :local_busy?, :explain,
17
- :remove_locks_except!
17
+ :remove_locks_except!,
18
+ :clear_limits
18
19
 
19
20
  def lock
20
21
  @lock ||= LimitFetch::Global::Semaphore.new name
@@ -11,7 +11,7 @@ module Sidekiq::LimitFetch::Global
11
11
  Thread.new do
12
12
  loop do
13
13
  Sidekiq::LimitFetch.redis_retryable do
14
- add_dynamic_queues
14
+ handle_dynamic_queues
15
15
  update_heartbeat ttl
16
16
  invalidate_old_processes
17
17
  end
@@ -37,19 +37,19 @@ module Sidekiq::LimitFetch::Global
37
37
  end
38
38
  end
39
39
 
40
- def add_dynamic_queues
40
+ def handle_dynamic_queues
41
41
  queues = Sidekiq::LimitFetch::Queues
42
- queues.add Sidekiq::Queue.all.map(&:name) if queues.dynamic?
42
+ queues.handle Sidekiq::Queue.all.map(&:name) if queues.dynamic?
43
43
  end
44
44
 
45
45
  private
46
46
 
47
47
  def update_heartbeat(ttl)
48
48
  Sidekiq.redis do |it|
49
- it.multi do
50
- it.set heartbeat_key, true
51
- it.sadd PROCESS_SET, Selector.uuid
52
- it.expire heartbeat_key, ttl
49
+ it.multi do |pipeline|
50
+ pipeline.set heartbeat_key, true
51
+ pipeline.sadd PROCESS_SET, Selector.uuid
52
+ pipeline.expire heartbeat_key, ttl
53
53
  end
54
54
  end
55
55
  end
@@ -109,6 +109,14 @@ module Sidekiq::LimitFetch::Global
109
109
  redis {|it| it.get "#{PREFIX}:block:#@name" }
110
110
  end
111
111
 
112
+ def clear_limits
113
+ redis do |it|
114
+ %w(block busy limit pause probed process_limit).each do |key|
115
+ it.del "#{PREFIX}:#{key}:#@name"
116
+ end
117
+ end
118
+ end
119
+
112
120
  def increase_local_busy
113
121
  @lock.synchronize { @local_busy += 1 }
114
122
  end
@@ -16,4 +16,8 @@ module Sidekiq::LimitFetch::Instances
16
16
  def reset_instances!
17
17
  @instances = {}
18
18
  end
19
+
20
+ def delete_instance(name)
21
+ @instances.delete [name]
22
+ end
19
23
  end
@@ -4,26 +4,33 @@ module Sidekiq::LimitFetch::Queues
4
4
  THREAD_KEY = :acquired_queues
5
5
 
6
6
  def start(options)
7
- @queues = options[:queues]
8
- @dynamic = options[:dynamic]
7
+ @queues = options[:queues]
8
+ @startup_queues = options[:queues].dup
9
+ @dynamic = options[:dynamic]
10
+
11
+ @limits = options[:limits] || {}
12
+ @process_limits = options[:process_limits] || {}
13
+ @blocks = options[:blocking] || []
9
14
 
10
15
  options[:strict] ? strict_order! : weighted_order!
11
16
 
12
- set :process_limit, options[:process_limits]
13
- set :limit, options[:limits]
14
- set_blocks options[:blocking]
17
+ apply_process_limit_to_queues
18
+ apply_limit_to_queues
19
+ apply_blocks_to_queues
15
20
  end
16
21
 
17
22
  def acquire
18
- selector.acquire(ordered_queues, namespace)
19
- .tap {|it| save it }
20
- .map {|it| "queue:#{it}" }
23
+ queues = saved
24
+ queues ||= Sidekiq::LimitFetch.redis_retryable do
25
+ selector.acquire(ordered_queues, namespace)
26
+ end
27
+ save queues
28
+ queues.map { |it| "queue:#{it}" }
21
29
  end
22
30
 
23
31
  def release_except(full_name)
24
32
  queues = restore
25
33
  queues.delete full_name[/queue:(.*)/, 1] if full_name
26
-
27
34
  Sidekiq::LimitFetch.redis_retryable do
28
35
  selector.release queues, namespace
29
36
  end
@@ -33,12 +40,40 @@ module Sidekiq::LimitFetch::Queues
33
40
  @dynamic
34
41
  end
35
42
 
43
+ def startup_queue?(queue)
44
+ @startup_queues.include?(queue)
45
+ end
46
+
36
47
  def add(queues)
48
+ return unless queues
37
49
  queues.each do |queue|
38
- @queues.push queue unless @queues.include? queue
50
+ unless @queues.include? queue
51
+ if startup_queue?(queue)
52
+ apply_process_limit_to_queue(queue)
53
+ apply_limit_to_queue(queue)
54
+ end
55
+
56
+ @queues.push queue
57
+ end
39
58
  end
40
59
  end
41
60
 
61
+ def remove(queues)
62
+ return unless queues
63
+ queues.each do |queue|
64
+ if @queues.include? queue
65
+ clear_limits_for_queue(queue)
66
+ @queues.delete queue
67
+ Sidekiq::Queue.delete_instance(queue)
68
+ end
69
+ end
70
+ end
71
+
72
+ def handle(queues)
73
+ add(queues - @queues)
74
+ remove(@queues - queues)
75
+ end
76
+
42
77
  def strict_order!
43
78
  @queues.uniq!
44
79
  def ordered_queues; @queues end
@@ -60,22 +95,37 @@ module Sidekiq::LimitFetch::Queues
60
95
 
61
96
  private
62
97
 
63
- def selector
64
- Sidekiq::LimitFetch::Global::Selector
98
+ def apply_process_limit_to_queues
99
+ @queues.uniq.each do |queue_name|
100
+ apply_process_limit_to_queue(queue_name)
101
+ end
65
102
  end
66
103
 
67
- def set(limit_type, limits)
68
- limits ||= {}
69
- each_queue do |queue|
70
- limit = limits[queue.name.to_s] || limits[queue.name.to_sym]
71
- queue.send "#{limit_type}=", limit unless queue.limit_changed?
104
+ def apply_process_limit_to_queue(queue_name)
105
+ queue = Sidekiq::Queue[queue_name]
106
+ queue.process_limit = @process_limits[queue_name.to_s] || @process_limits[queue_name.to_sym]
107
+ end
108
+
109
+ def apply_limit_to_queues
110
+ @queues.uniq.each do |queue_name|
111
+ apply_limit_to_queue(queue_name)
72
112
  end
73
113
  end
74
114
 
75
- def set_blocks(blocks)
76
- each_queue(&:unblock)
115
+ def apply_limit_to_queue(queue_name)
116
+ queue = Sidekiq::Queue[queue_name]
117
+
118
+ unless queue.limit_changed?
119
+ queue.limit = @limits[queue_name.to_s] || @limits[queue_name.to_sym]
120
+ end
121
+ end
77
122
 
78
- blocks.to_a.each do |it|
123
+ def apply_blocks_to_queues
124
+ @queues.uniq.each do |queue_name|
125
+ Sidekiq::Queue[queue_name].unblock
126
+ end
127
+
128
+ @blocks.to_a.each do |it|
79
129
  if it.is_a? Array
80
130
  it.each {|name| Sidekiq::Queue[name].block_except it }
81
131
  else
@@ -84,17 +134,26 @@ module Sidekiq::LimitFetch::Queues
84
134
  end
85
135
  end
86
136
 
137
+ def clear_limits_for_queue(queue_name)
138
+ queue = Sidekiq::Queue[queue_name]
139
+ queue.clear_limits
140
+ end
141
+
142
+ def selector
143
+ Sidekiq::LimitFetch::Global::Selector
144
+ end
145
+
146
+ def saved
147
+ Thread.current[THREAD_KEY]
148
+ end
149
+
87
150
  def save(queues)
88
151
  Thread.current[THREAD_KEY] = queues
89
152
  end
90
153
 
91
154
  def restore
92
- Thread.current[THREAD_KEY] || []
155
+ saved || []
93
156
  ensure
94
- Thread.current[THREAD_KEY] = nil
95
- end
96
-
97
- def each_queue
98
- @queues.uniq.each {|it| yield Sidekiq::Queue[it] }
157
+ save nil
99
158
  end
100
159
  end
@@ -14,6 +14,8 @@ module Sidekiq::LimitFetch
14
14
  require_relative 'extensions/queue'
15
15
  require_relative 'extensions/manager'
16
16
 
17
+ TIMEOUT = Sidekiq::BasicFetch::TIMEOUT
18
+
17
19
  extend self
18
20
 
19
21
  def new(_)
@@ -26,21 +28,34 @@ module Sidekiq::LimitFetch
26
28
  UnitOfWork.new(queue, job) if job
27
29
  end
28
30
 
31
+ # Backwards compatibility for sidekiq v6.1.0
32
+ # @see https://github.com/mperham/sidekiq/pull/4602
29
33
  def bulk_requeue(*args)
30
- Sidekiq::BasicFetch.bulk_requeue(*args)
34
+ if Sidekiq::BasicFetch.respond_to?(:bulk_requeue) # < 6.1.0
35
+ Sidekiq::BasicFetch.bulk_requeue(*args)
36
+ else # 6.1.0+
37
+ Sidekiq::BasicFetch.new(Sidekiq.options).bulk_requeue(*args)
38
+ end
31
39
  end
32
40
 
33
41
  def redis_retryable
34
42
  yield
35
43
  rescue Redis::BaseConnectionError
36
- sleep 1
44
+ sleep TIMEOUT
37
45
  retry
46
+ rescue Redis::CommandError => error
47
+ # If Redis was restarted and is still loading its snapshot,
48
+ # then we should treat this as a temporary connection error too.
49
+ if error.message =~ /^LOADING/
50
+ sleep TIMEOUT
51
+ retry
52
+ else
53
+ raise
54
+ end
38
55
  end
39
56
 
40
57
  private
41
58
 
42
- TIMEOUT = Sidekiq::BasicFetch::TIMEOUT
43
-
44
59
  def redis_brpop(queues)
45
60
  if queues.empty?
46
61
  sleep TIMEOUT # there are no queues to handle, so lets sleep
@@ -1,22 +1,25 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'sidekiq-limit_fetch'
3
- gem.version = '3.3.1'
3
+ gem.version = '4.1.0'
4
4
  gem.license = 'MIT'
5
- gem.authors = 'brainopia'
6
- gem.email = 'brainopia@evilmartians.com'
5
+ gem.authors = ['Dean Perry', 'brainopia']
6
+ gem.email = 'dean@deanpcmad.com'
7
7
  gem.summary = 'Sidekiq strategy to support queue limits'
8
- gem.homepage = 'https://github.com/brainopia/sidekiq-limit_fetch'
9
- gem.description = <<-DESCRIPTION
10
- Sidekiq strategy to restrict number of workers
11
- which are able to run specified queues simultaneously.
12
- DESCRIPTION
8
+ gem.homepage = 'https://github.com/deanpcmad/sidekiq-limit_fetch'
9
+ gem.description = "Sidekiq strategy to restrict number of workers which are able to run specified queues simultaneously."
10
+
11
+ gem.metadata["homepage_uri"] = gem.homepage
12
+ gem.metadata["source_code_uri"] = "https://github.com/deanpcmad/sidekiq-limit_fetch"
13
+ gem.metadata["changelog_uri"] = "https://github.com/deanpcmad/sidekiq-limit_fetch/blob/master/CHANGELOG.md"
13
14
 
14
15
  gem.files = `git ls-files`.split($/)
15
16
  gem.test_files = gem.files.grep %r{^spec/}
16
17
  gem.require_paths = %w(lib)
17
18
 
18
19
  gem.add_dependency 'sidekiq', '>= 4'
20
+ gem.add_dependency 'redis', '>= 4.6.0'
19
21
  gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
22
+ gem.add_development_dependency 'appraisal'
20
23
  gem.add_development_dependency 'rspec'
21
24
  gem.add_development_dependency 'rake'
22
25
  end
@@ -15,61 +15,72 @@ RSpec.describe Sidekiq::LimitFetch::Queues do
15
15
 
16
16
  before { subject.start options }
17
17
 
18
+ def in_thread(&block)
19
+ thr = Thread.new(&block)
20
+ thr.join
21
+ end
22
+
18
23
  it 'should acquire queues' do
19
- subject.acquire
24
+ in_thread { subject.acquire }
20
25
  expect(Sidekiq::Queue['queue1'].probed).to eq 1
21
26
  expect(Sidekiq::Queue['queue2'].probed).to eq 1
22
27
  end
23
28
 
24
29
  it 'should acquire dynamically blocking queues' do
25
- subject.acquire
30
+ in_thread { subject.acquire }
26
31
  expect(Sidekiq::Queue['queue1'].probed).to eq 1
27
32
  expect(Sidekiq::Queue['queue2'].probed).to eq 1
28
33
 
29
34
  Sidekiq::Queue['queue1'].block
30
35
 
31
- subject.acquire
36
+ in_thread { subject.acquire }
32
37
  expect(Sidekiq::Queue['queue1'].probed).to eq 2
33
38
  expect(Sidekiq::Queue['queue2'].probed).to eq 1
34
39
  end
35
40
 
36
41
  it 'should block except given queues' do
37
42
  Sidekiq::Queue['queue1'].block_except 'queue2'
38
- subject.acquire
43
+ in_thread { subject.acquire }
39
44
  expect(Sidekiq::Queue['queue1'].probed).to eq 1
40
45
  expect(Sidekiq::Queue['queue2'].probed).to eq 1
41
46
 
42
47
  Sidekiq::Queue['queue1'].block_except 'queue404'
43
- subject.acquire
48
+ in_thread { subject.acquire }
44
49
  expect(Sidekiq::Queue['queue1'].probed).to eq 2
45
50
  expect(Sidekiq::Queue['queue2'].probed).to eq 1
46
51
  end
47
52
 
48
53
  it 'should release queues' do
49
- subject.acquire
50
- subject.release_except nil
54
+ in_thread {
55
+ subject.acquire
56
+ subject.release_except nil
57
+ }
51
58
  expect(Sidekiq::Queue['queue1'].probed).to eq 0
52
59
  expect(Sidekiq::Queue['queue2'].probed).to eq 0
53
60
  end
54
61
 
55
62
  it 'should release queues except selected' do
56
- subject.acquire
57
- subject.release_except 'queue:queue1'
63
+ in_thread {
64
+ subject.acquire
65
+ subject.release_except 'queue:queue1'
66
+ }
58
67
  expect(Sidekiq::Queue['queue1'].probed).to eq 1
59
68
  expect(Sidekiq::Queue['queue2'].probed).to eq 0
60
69
  end
61
70
 
62
71
  it 'should release when no queues was acquired' do
63
72
  queues.each {|name| Sidekiq::Queue[name].pause }
64
- subject.acquire
65
- expect { subject.release_except nil }.not_to raise_exception
73
+ in_thread {
74
+ subject.acquire
75
+ expect { subject.release_except nil }.not_to raise_exception
76
+ }
66
77
  end
67
78
 
68
79
  context 'blocking' do
69
80
  let(:blocking) { %w(queue1) }
70
81
 
71
82
  it 'should acquire blocking queues' do
72
- 3.times { subject.acquire }
83
+ 3.times { in_thread { subject.acquire } }
73
84
  expect(Sidekiq::Queue['queue1'].probed).to eq 3
74
85
  expect(Sidekiq::Queue['queue2'].probed).to eq 1
75
86
  end
@@ -6,7 +6,7 @@ RSpec.describe Sidekiq::LimitFetch do
6
6
  let(:limits) {{ 'queue1' => 1, 'queue2' => 2 }}
7
7
 
8
8
  before do
9
- subject::Queues.start options
9
+ subject::Queues.start options
10
10
 
11
11
  Sidekiq.redis do |it|
12
12
  it.del 'queue:queue1'
data/spec/spec_helper.rb CHANGED
@@ -11,13 +11,13 @@ RSpec.configure do |config|
11
11
  Sidekiq::Queue.reset_instances!
12
12
  Sidekiq.redis do |it|
13
13
  clean_redis = ->(queue) do
14
- it.pipelined do
15
- it.del "limit_fetch:limit:#{queue}"
16
- it.del "limit_fetch:process_limit:#{queue}"
17
- it.del "limit_fetch:busy:#{queue}"
18
- it.del "limit_fetch:probed:#{queue}"
19
- it.del "limit_fetch:pause:#{queue}"
20
- it.del "limit_fetch:block:#{queue}"
14
+ it.pipelined do |pipeline|
15
+ pipeline.del "limit_fetch:limit:#{queue}"
16
+ pipeline.del "limit_fetch:process_limit:#{queue}"
17
+ pipeline.del "limit_fetch:busy:#{queue}"
18
+ pipeline.del "limit_fetch:probed:#{queue}"
19
+ pipeline.del "limit_fetch:pause:#{queue}"
20
+ pipeline.del "limit_fetch:block:#{queue}"
21
21
  end
22
22
  end
23
23