sidekiq-pool 0.1.7 → 1.0.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 +18 -11
- data/lib/sidekiq/pool/cli.rb +47 -48
- data/lib/sidekiq/pool/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e74bb16b2feb36fa68a28e744185d26383037361
|
4
|
+
data.tar.gz: 9a00a58fca89b6fb52f389f88ceb29d65a6d6e61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cbccc3d4aab0e5ef4c6e8d50fd001ced4efb6b67cfa74e2d23508f6e986e8fc72ec75d9e33cef23433c41c5ffc82d4e5b3ab237a6597193f05c373198627eaa
|
7
|
+
data.tar.gz: 70dd6d7a38ade7d05470aff93906659cb4aca5944f77ec00c786b07c3c14dc58d45d3f2fbe0bedc784320ec1c48370afc77bdf6a4245a796b9a6f1f12bc34cb4
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Sidekiq::Pool
|
2
2
|
|
3
3
|
Allows Sidekiq using more CPU cores on Ruby MRI by forking multiple processes.
|
4
|
+
Also adds an option to use different command line option workers in the same pool.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
@@ -10,28 +11,34 @@ Add this line to your application's Gemfile:
|
|
10
11
|
gem 'sidekiq-pool'
|
11
12
|
```
|
12
13
|
|
14
|
+
Create a config file and specify it's path with the *p* command line option (the default is config/sidekiq-pool.yml)
|
15
|
+
|
16
|
+
Paste the following config and modify it to your needs:
|
17
|
+
|
18
|
+
```yaml
|
19
|
+
:workers:
|
20
|
+
-
|
21
|
+
:command: '-q default -q high'
|
22
|
+
:amount: 2
|
23
|
+
-
|
24
|
+
:command: '-q high -L high_logfile.txt'
|
25
|
+
:amount: 1
|
26
|
+
```
|
27
|
+
|
13
28
|
## Usage
|
14
29
|
|
15
30
|
Help
|
16
31
|
|
17
32
|
$ bundle exec sidekiq-pool -h
|
18
33
|
|
19
|
-
Start pool with
|
34
|
+
Start pool with a non-default path config
|
20
35
|
|
21
|
-
$ bundle exec sidekiq-pool
|
36
|
+
$ bundle exec sidekiq-pool -p config/pool_config.yml
|
22
37
|
|
23
38
|
## Signals
|
24
39
|
|
25
40
|
Signals `USR1`, `USR2` are forwarded to the children.
|
26
|
-
|
27
|
-
`TTIN` forks new child
|
28
|
-
|
29
|
-
$ kill -TTIN masterpid
|
30
|
-
|
31
|
-
`TTOU` stops one child
|
32
|
-
|
33
|
-
$ kill -TTOU masterpid
|
34
|
-
|
41
|
+
|
35
42
|
## Contributing
|
36
43
|
|
37
44
|
Bug reports and pull requests are welcome on GitHub at https://github.com/laurynas/sidekiq-pool.
|
data/lib/sidekiq/pool/cli.rb
CHANGED
@@ -14,21 +14,36 @@ module Sidekiq
|
|
14
14
|
alias_method :run_child, :run
|
15
15
|
|
16
16
|
def run
|
17
|
-
|
18
|
-
|
17
|
+
@settings = parse_config_file(@pool_config)
|
18
|
+
@types = @settings[:workers]
|
19
19
|
@master_pid = $$
|
20
20
|
|
21
21
|
trap_signals
|
22
22
|
update_process_name
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
@types.each do |type|
|
24
|
+
type[:amount].times do
|
25
|
+
sleep @fork_wait || DEFAULT_FORK_WAIT
|
26
|
+
add_child(type[:command])
|
27
|
+
end
|
27
28
|
end
|
28
29
|
|
29
30
|
wait_for_signals
|
30
31
|
end
|
31
32
|
|
33
|
+
def parse_config_file(filename)
|
34
|
+
config = YAML.load(ERB.new(File.read(filename)).result)
|
35
|
+
unless config.key?(:workers)
|
36
|
+
raise ArgumentError, 'Invalid configuration file - "workers" key must be present'
|
37
|
+
end
|
38
|
+
unless config[:workers].is_a?(Array)
|
39
|
+
raise ArgumentError, 'Invalid configuration file - "workers" key must be a list'
|
40
|
+
end
|
41
|
+
unless config[:workers].size > 0
|
42
|
+
raise ArgumentError, 'Invalid configuration file - Atleast one worker must be present'
|
43
|
+
end
|
44
|
+
config
|
45
|
+
end
|
46
|
+
|
32
47
|
private
|
33
48
|
|
34
49
|
DEFAULT_FORK_WAIT = 1
|
@@ -37,10 +52,6 @@ module Sidekiq
|
|
37
52
|
opts = {}
|
38
53
|
|
39
54
|
@parser = OptionParser.new do |o|
|
40
|
-
o.on '--pool-size INT', "pool size" do |arg|
|
41
|
-
@pool_size = Integer(arg)
|
42
|
-
end
|
43
|
-
|
44
55
|
o.on '-c', '--concurrency INT', "processor threads to use" do |arg|
|
45
56
|
opts[:concurrency] = Integer(arg)
|
46
57
|
end
|
@@ -90,6 +101,10 @@ module Sidekiq
|
|
90
101
|
opts[:pidfile] = arg
|
91
102
|
end
|
92
103
|
|
104
|
+
o.on '-p', '--pool-config PATH', "path to pool config file" do |arg|
|
105
|
+
@pool_config = arg
|
106
|
+
end
|
107
|
+
|
93
108
|
o.on '-V', '--version', "Print version and exit" do |arg|
|
94
109
|
puts "Sidekiq #{Sidekiq::VERSION}"
|
95
110
|
die(0)
|
@@ -107,18 +122,17 @@ module Sidekiq
|
|
107
122
|
opts[:config_file] ||= filename if File.exist?(filename)
|
108
123
|
end
|
109
124
|
|
110
|
-
|
111
|
-
|
125
|
+
%w[config/sidekiq-pool.yml config/sidekiq-pool.yml.erb].each do |filename|
|
126
|
+
@pool_config ||= filename if File.exist?(filename)
|
127
|
+
end
|
112
128
|
|
113
|
-
|
114
|
-
raise ArgumentError, 'Please specify pool size using --pool-size N' unless @pool_size
|
115
|
-
super
|
129
|
+
opts
|
116
130
|
end
|
117
131
|
|
118
132
|
def trap_signals
|
119
133
|
@self_read, @self_write = IO.pipe
|
120
134
|
|
121
|
-
%w(INT TERM USR1 USR2
|
135
|
+
%w(INT TERM USR1 USR2 CHLD).each do |sig|
|
122
136
|
begin
|
123
137
|
trap sig do
|
124
138
|
@self_write.puts(sig) unless fork?
|
@@ -129,13 +143,15 @@ module Sidekiq
|
|
129
143
|
end
|
130
144
|
end
|
131
145
|
|
132
|
-
def fork_child
|
133
|
-
|
146
|
+
def fork_child(command)
|
147
|
+
pid = fork do
|
148
|
+
setup_options(command.split)
|
134
149
|
@self_write.close
|
135
150
|
$0 = 'sidekiq starting'
|
136
151
|
options[:index] = @child_index++
|
137
152
|
run_child
|
138
153
|
end
|
154
|
+
@pool << { pid: pid, command: command }
|
139
155
|
end
|
140
156
|
|
141
157
|
def wait_for_signals
|
@@ -151,42 +167,25 @@ module Sidekiq
|
|
151
167
|
stop_children
|
152
168
|
logger.info 'Bye!'
|
153
169
|
exit(0)
|
154
|
-
when 'TTIN'
|
155
|
-
add_child
|
156
|
-
when 'TTOU'
|
157
|
-
remove_child
|
158
170
|
when 'CHLD'
|
159
171
|
check_pool
|
160
172
|
when 'USR1'
|
161
173
|
@done = true
|
162
174
|
update_process_name
|
163
|
-
|
164
|
-
signal_to_pool(sig)
|
165
|
-
when 'USR2'
|
175
|
+
when 'USR1', 'USR2'
|
166
176
|
logger.info "Sending #{sig} signal to the pool"
|
167
177
|
signal_to_pool(sig)
|
168
178
|
end
|
169
179
|
end
|
170
180
|
|
171
|
-
def add_child
|
172
|
-
logger.info
|
173
|
-
fork_child
|
181
|
+
def add_child(*arg)
|
182
|
+
logger.info "Adding child with args: #{arg}"
|
183
|
+
fork_child(*arg)
|
174
184
|
end
|
175
185
|
|
176
|
-
def remove_child
|
177
|
-
return if @pool.empty?
|
178
|
-
|
179
|
-
if @pool.size == 1
|
180
|
-
logger.info 'Cowardly refusing to kill the last child'
|
181
|
-
return
|
182
|
-
end
|
183
|
-
|
184
|
-
logger.info 'Removing child'
|
185
|
-
signal_to_child('TERM', @pool.shift)
|
186
|
-
end
|
187
186
|
|
188
187
|
def signal_to_pool(sig)
|
189
|
-
@pool.each { |
|
188
|
+
@pool.each { |child| signal_to_child(sig, child[:pid]) }
|
190
189
|
end
|
191
190
|
|
192
191
|
def signal_to_child(sig, pid)
|
@@ -197,16 +196,16 @@ module Sidekiq
|
|
197
196
|
|
198
197
|
def check_pool
|
199
198
|
::Process.waitpid2(-1, ::Process::WNOHANG)
|
200
|
-
@pool.each do |
|
201
|
-
next if alive?(pid)
|
202
|
-
handle_dead_child(
|
199
|
+
@pool.each do |child|
|
200
|
+
next if alive?(child[:pid])
|
201
|
+
handle_dead_child(child)
|
203
202
|
end
|
204
203
|
end
|
205
204
|
|
206
|
-
def handle_dead_child(
|
207
|
-
logger.info "Child #{pid} died"
|
208
|
-
@pool.delete(
|
209
|
-
add_child
|
205
|
+
def handle_dead_child(child)
|
206
|
+
logger.info "Child #{child[:pid]} died"
|
207
|
+
@pool.delete(child)
|
208
|
+
add_child(child[:command])
|
210
209
|
end
|
211
210
|
|
212
211
|
def alive?(pid)
|
@@ -232,7 +231,7 @@ module Sidekiq
|
|
232
231
|
end
|
233
232
|
sleep(1)
|
234
233
|
::Process.waitpid2(-1, ::Process::WNOHANG)
|
235
|
-
break if @pool.none? { |
|
234
|
+
break if @pool.none? { |child| alive?(child[:pid]) }
|
236
235
|
end
|
237
236
|
end
|
238
237
|
|
data/lib/sidekiq/pool/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Laurynas Butkus
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|