sidekiq-limit_fetch 3.3.1 → 4.1.0

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.
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