sidekiq-limit_fetch 2.1.3 → 2.2.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.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/demo/README.md +37 -2
- data/demo/Rakefile +40 -2
- data/demo/app/workers/a_worker.rb +8 -0
- data/demo/app/workers/b_worker.rb +8 -0
- data/demo/app/workers/c_worker.rb +9 -0
- data/lib/sidekiq/limit_fetch/global/selector.rb +3 -1
- data/lib/sidekiq/limit_fetch/global/semaphore.rb +19 -2
- data/lib/sidekiq/limit_fetch/queues.rb +10 -3
- data/sidekiq-limit_fetch.gemspec +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99b2b29e276cbdb7e9c974939f367eba90ad62f4
|
4
|
+
data.tar.gz: 5076f7ceff7dd7e1e90d70fe8dd0e31dd48b8d6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a46d655a1c87cb0712fa22b134914992269aa3130469a2db05f1d8be107893aec01876e508a90178f736ae76d2f0b55e3aea6b27652782bd4635a80450ca5d8f
|
7
|
+
data.tar.gz: c47afed022d59b2c60183e02abfa3c11af41b55d35500b91b35c0e913a1bb037170500e8de3da46e7ed0950a99508635e4c8b2e3eaca06bfe2ced16171ee491c
|
data/README.md
CHANGED
@@ -26,6 +26,8 @@ https://devcenter.heroku.com/articles/redistogo#redis-2-6
|
|
26
26
|
|
27
27
|
**Important note:** At this moment, `sidekiq-limit_fetch` is incompatible with Sidekiq Pro's `reliable_fetch`.
|
28
28
|
|
29
|
+
https://github.com/mperham/sidekiq/issues/1508 — a sidekiq admin busy page is unreliable, so if you need to check how many workers are running a queue use a `#busy` method described below.
|
30
|
+
|
29
31
|
## Usage
|
30
32
|
|
31
33
|
### Limits
|
data/demo/README.md
CHANGED
@@ -1,2 +1,37 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
This is a demo rails app with a configured sidekiq-limit_fetch.
|
2
|
+
|
3
|
+
Its purpose is to check whether plugin works in certain situations.
|
4
|
+
|
5
|
+
Application is preconfigured with two workers:
|
6
|
+
- `app/workers/fast_worker.rb` which does `sleep 0.2`
|
7
|
+
- `app/workers/slow_worker.rb` which does `sleep 1`
|
8
|
+
|
9
|
+
There is also a rake task which can be invoked as `bundle exec rake demo:limit`:
|
10
|
+
|
11
|
+
- it prefills sidekiq tasks
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
100.times do
|
15
|
+
SlowWorker.perform_async
|
16
|
+
FastWorker.perform_async
|
17
|
+
end
|
18
|
+
```
|
19
|
+
- sets sidekiq config
|
20
|
+
|
21
|
+
```yaml
|
22
|
+
:verbose: false
|
23
|
+
:concurrency: 4
|
24
|
+
:queues:
|
25
|
+
- slow
|
26
|
+
- fast
|
27
|
+
:limits:
|
28
|
+
slow: 1
|
29
|
+
```
|
30
|
+
|
31
|
+
- and launches a sidekiq admin page with overview of queues in browser.
|
32
|
+
The page is set to live-poll so effects of limits can be seen directly.
|
33
|
+
|
34
|
+
|
35
|
+
To change simulation modify `Rakefile` or workers.
|
36
|
+
|
37
|
+
Any bugs related to the plugin should be demonstrated with a reproduction from this base app.
|
data/demo/Rakefile
CHANGED
@@ -22,6 +22,45 @@ namespace :demo do
|
|
22
22
|
YAML
|
23
23
|
end
|
24
24
|
|
25
|
+
task blocking: :environment do
|
26
|
+
puts '=> Creating sidekiq tasks'
|
27
|
+
|
28
|
+
AWorker.perform_async
|
29
|
+
BWorker.perform_async
|
30
|
+
CWorker.perform_async
|
31
|
+
|
32
|
+
run_sidekiq_monitoring
|
33
|
+
run_sidekiq_workers config: <<-YAML
|
34
|
+
:verbose: false
|
35
|
+
:concurrency: 4
|
36
|
+
:queues:
|
37
|
+
- a
|
38
|
+
- b
|
39
|
+
- c
|
40
|
+
:blocking:
|
41
|
+
- a
|
42
|
+
YAML
|
43
|
+
end
|
44
|
+
|
45
|
+
task advanced_blocking: :environment do
|
46
|
+
puts '=> Creating sidekiq tasks'
|
47
|
+
|
48
|
+
AWorker.perform_async
|
49
|
+
BWorker.perform_async
|
50
|
+
CWorker.perform_async
|
51
|
+
|
52
|
+
run_sidekiq_monitoring
|
53
|
+
run_sidekiq_workers config: <<-YAML
|
54
|
+
:verbose: false
|
55
|
+
:concurrency: 4
|
56
|
+
:queues:
|
57
|
+
- a
|
58
|
+
- b
|
59
|
+
- c
|
60
|
+
:blocking:
|
61
|
+
- [a, b]
|
62
|
+
YAML
|
63
|
+
end
|
25
64
|
def with_sidekiq_config(config)
|
26
65
|
whitespace_offset = config[/\A */].size
|
27
66
|
config.gsub! /^ {#{whitespace_offset}}/, ''
|
@@ -51,8 +90,7 @@ namespace :demo do
|
|
51
90
|
end
|
52
91
|
|
53
92
|
with_sidekiq_config options[:config] do
|
54
|
-
|
55
|
-
Sidekiq.options.merge! config
|
93
|
+
cli.send :setup_options, []
|
56
94
|
end
|
57
95
|
|
58
96
|
cli.run
|
@@ -82,7 +82,9 @@ module Sidekiq::LimitFetch::Global
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
|
85
|
+
if not blocking_mode then
|
86
|
+
blocking_mode = can_block and locks > 0
|
87
|
+
end
|
86
88
|
|
87
89
|
if blocking_mode and can_block ~= 'true' then
|
88
90
|
for unblocked_queue in string.gmatch(can_block, "[^,]+") do
|
@@ -18,7 +18,11 @@ module Sidekiq::LimitFetch::Global
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def limit=(value)
|
21
|
-
|
21
|
+
if value
|
22
|
+
redis {|it| it.set "#{PREFIX}:limit:#@name", value }
|
23
|
+
else
|
24
|
+
redis {|it| it.del "#{PREFIX}:limit:#@name" }
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
def process_limit
|
@@ -27,7 +31,11 @@ module Sidekiq::LimitFetch::Global
|
|
27
31
|
end
|
28
32
|
|
29
33
|
def process_limit=(value)
|
30
|
-
|
34
|
+
if value
|
35
|
+
redis {|it| it.set "#{PREFIX}:process_limit:#@name", value }
|
36
|
+
else
|
37
|
+
redis {|it| it.del "#{PREFIX}:process_limit:#@name" }
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
def acquire
|
@@ -120,6 +128,15 @@ module Sidekiq::LimitFetch::Global
|
|
120
128
|
|
121
129
|
Busy queue processes:
|
122
130
|
#{busy_processes.sort.join "\n"}
|
131
|
+
|
132
|
+
Limit:
|
133
|
+
#{limit.inspect}
|
134
|
+
|
135
|
+
Process limit:
|
136
|
+
#{process_limit.inspect}
|
137
|
+
|
138
|
+
Blocking:
|
139
|
+
#{blocking?}
|
123
140
|
END
|
124
141
|
end
|
125
142
|
|
@@ -32,13 +32,16 @@ class Sidekiq::LimitFetch
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def set(limit_type, limits)
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
limits ||= {}
|
36
|
+
each_queue do |queue|
|
37
|
+
limit = limits[queue.name.to_s] || limits[queue.name.to_sym]
|
38
|
+
queue.send "#{limit_type}=", limit
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
42
|
def set_blocks(blocks)
|
43
|
+
each_queue(&:unblock)
|
44
|
+
|
42
45
|
blocks.to_a.each do |it|
|
43
46
|
if it.is_a? Array
|
44
47
|
it.each {|name| Sidekiq::Queue[name].block_except it }
|
@@ -66,5 +69,9 @@ class Sidekiq::LimitFetch
|
|
66
69
|
ensure
|
67
70
|
Thread.current[THREAD_KEY] = nil
|
68
71
|
end
|
72
|
+
|
73
|
+
def each_queue
|
74
|
+
@queues.uniq.each {|it| yield Sidekiq::Queue[it] }
|
75
|
+
end
|
69
76
|
end
|
70
77
|
end
|
data/sidekiq-limit_fetch.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-limit_fetch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- brainopia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -76,6 +76,9 @@ files:
|
|
76
76
|
- demo/Gemfile
|
77
77
|
- demo/README.md
|
78
78
|
- demo/Rakefile
|
79
|
+
- demo/app/workers/a_worker.rb
|
80
|
+
- demo/app/workers/b_worker.rb
|
81
|
+
- demo/app/workers/c_worker.rb
|
79
82
|
- demo/app/workers/fast_worker.rb
|
80
83
|
- demo/app/workers/slow_worker.rb
|
81
84
|
- demo/config/application.rb
|