delayed_job_worker_pool 0.2.3 → 0.3.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 +5 -5
- data/.rubocop.yml +8 -0
- data/.travis.yml +9 -4
- data/CHANGELOG.md +7 -1
- data/Gemfile +2 -0
- data/README.md +28 -6
- data/Rakefile +2 -0
- data/bin/delayed_job_worker_pool +1 -0
- data/delayed_job_worker_pool.gemspec +8 -5
- data/lib/delayed_job_worker_pool.rb +4 -0
- data/lib/delayed_job_worker_pool/application.rb +3 -1
- data/lib/delayed_job_worker_pool/dsl.rb +24 -6
- data/lib/delayed_job_worker_pool/registry.rb +63 -0
- data/lib/delayed_job_worker_pool/version.rb +3 -1
- data/lib/delayed_job_worker_pool/worker.rb +2 -0
- data/lib/delayed_job_worker_pool/worker_group_options.rb +17 -0
- data/lib/delayed_job_worker_pool/worker_info.rb +4 -2
- data/lib/delayed_job_worker_pool/worker_pool.rb +58 -37
- metadata +58 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a0273d86b923b9ab445381d365eb26bce6253433bee7a8a8ad8882846ab5626f
|
4
|
+
data.tar.gz: 8b0db9639c8d1107f4eda74accc59253b9e2e55ffdcbbae167324a895d6c7bc9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed7f9139bdaebf583aa2bae0420f253a88c759d2bda97b4cfd88c5f11f77ec08361f9ddb866ad32bc66569848d8ba41b5629531b2a02e123a60eec86fbbd3435
|
7
|
+
data.tar.gz: e0974480bd81a01d60e48ac5db9a2f4cc29d6ad62b0c8af9e426b2c4da28fc950b8e408aa9f20a948c7eb2fb9130e5d2db13a9b0a8f6c27a1e85314091f4ab83
|
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
sudo: false
|
2
4
|
rvm:
|
3
|
-
- 2.
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
before_install: gem install bundler -v 1
|
5
|
+
- 2.7.1
|
6
|
+
- 2.6.6
|
7
|
+
- 2.5.8
|
8
|
+
before_install: gem install bundler -v '~> 2.1'
|
9
|
+
script:
|
10
|
+
- bundle exec rspec
|
11
|
+
- bundle exec rubocop
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
### 0.
|
3
|
+
### 0.3.0
|
4
|
+
* Require Ruby 2.5 or higher.
|
5
|
+
* Support for running multiple worker pools on a single node.
|
6
|
+
See [#7](https://github.com/salsify/delayed_job_worker_pool/pull/7) for details.
|
7
|
+
Thanks to Severin Räz!
|
8
|
+
|
9
|
+
### 0.2.3
|
4
10
|
* Explicitly require 'fcntl' to fix uninitialized constant IO::Fcntl. Thanks to Stefan Wrobel!
|
5
11
|
|
6
12
|
### 0.2.2
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -41,9 +41,11 @@ delayed_job_worker_pool
|
|
41
41
|
The config file is a Ruby DSL inspired by the [Puma](https://github.com/puma/puma) configuration DSL. Here's an example:
|
42
42
|
|
43
43
|
```ruby
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
worker_group do |g|
|
45
|
+
g.workers = Integer(ENV['NUM_WORKERS'] || 1)
|
46
|
+
g.queues = (ENV['QUEUES'] || ENV['QUEUE'] || '').split(',')
|
47
|
+
g.sleep_delay = ENV['WORKER_SLEEP_DELAY']
|
48
|
+
end
|
47
49
|
|
48
50
|
preload_app
|
49
51
|
|
@@ -77,10 +79,26 @@ after_worker_shutdown do |worker_info|
|
|
77
79
|
end
|
78
80
|
```
|
79
81
|
|
82
|
+
You can configure multiple worker groups, i.e.:
|
83
|
+
|
84
|
+
```
|
85
|
+
worker_group(:default) do |g|
|
86
|
+
g.workers = 1
|
87
|
+
g.queues = ['default']
|
88
|
+
end
|
89
|
+
|
90
|
+
worker_group(:mails) do |g|
|
91
|
+
g.workers = 1
|
92
|
+
g.queues = ['mail]
|
93
|
+
end
|
94
|
+
|
95
|
+
```
|
96
|
+
|
80
97
|
Here's more information on each setting:
|
81
98
|
|
82
|
-
* `
|
83
|
-
*
|
99
|
+
* `worker_group` - You need at least one worker group. Group settings can be set as illustrated above. Worker group settings:
|
100
|
+
* `workers` - The number of Delayed Job worker processes to fork. The master process will relaunch workers that fail.
|
101
|
+
* Delayed Job worker settings (`queues`, `min_priority`, `max_priority`, `sleep_delay`, `read_ahead`) - These are passed through to the Delayed Job worker.
|
84
102
|
* `preload_app` - This forces the master process to load Rails before forking worker processes causing the memory consumed by the code to be shared between workers. **If you use this setting make sure you re-establish any necessary connections in the on_worker_boot callback.**
|
85
103
|
* `after_preload_app` - A callback that runs in the master process after preloading the app but before forking any workers.
|
86
104
|
* `on_worker_boot` - A callback that runs in the worker process after it has been forked.
|
@@ -89,11 +107,15 @@ Here's more information on each setting:
|
|
89
107
|
|
90
108
|
All settings are optional and nil values are ignored.
|
91
109
|
|
110
|
+
## Upgrading from v0.2.x
|
111
|
+
|
112
|
+
* Convert your worker settings to a single worker group (see _Usage_)
|
113
|
+
* Please note the delayed job worker names changed to include ` group: <group_name>`, e.g. if you are monitoring them by their name
|
114
|
+
|
92
115
|
## Contributing
|
93
116
|
|
94
117
|
Bug reports and pull requests are welcome on GitHub at https://github.com/salsify/delayed_job_worker_pool.
|
95
118
|
|
96
|
-
|
97
119
|
## License
|
98
120
|
|
99
121
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
data/bin/delayed_job_worker_pool
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'delayed_job_worker_pool/version'
|
5
6
|
|
@@ -17,14 +18,16 @@ Gem::Specification.new do |spec|
|
|
17
18
|
spec.executables = ['delayed_job_worker_pool']
|
18
19
|
spec.require_paths = ['lib']
|
19
20
|
|
20
|
-
spec.required_ruby_version = '>= 2.
|
21
|
+
spec.required_ruby_version = '>= 2.5'
|
21
22
|
|
22
23
|
spec.add_dependency 'delayed_job', ['>= 3.0', '< 4.2']
|
23
24
|
|
25
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
24
26
|
spec.add_development_dependency 'delayed_job_active_record'
|
25
|
-
spec.add_development_dependency '
|
27
|
+
spec.add_development_dependency 'rails', '>= 4.2', '< 6'
|
26
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
29
|
spec.add_development_dependency 'rspec', '>= 3.3'
|
30
|
+
spec.add_development_dependency 'salsify_rubocop', '0.85.0'
|
31
|
+
spec.add_development_dependency 'sprockets', '< 4'
|
28
32
|
spec.add_development_dependency 'sqlite3', '>= 1.3'
|
29
|
-
spec.add_development_dependency 'rails', '>= 4.2'
|
30
33
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'delayed_job_worker_pool/application'
|
2
4
|
require 'delayed_job_worker_pool/dsl'
|
5
|
+
require 'delayed_job_worker_pool/registry'
|
3
6
|
require 'delayed_job_worker_pool/worker'
|
4
7
|
require 'delayed_job_worker_pool/worker_info'
|
5
8
|
require 'delayed_job_worker_pool/worker_pool'
|
9
|
+
require 'delayed_job_worker_pool/worker_group_options'
|
6
10
|
require 'delayed_job_worker_pool/version'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DelayedJobWorkerPool
|
2
4
|
module Application
|
3
5
|
extend self
|
@@ -6,7 +8,7 @@ module DelayedJobWorkerPool
|
|
6
8
|
require(base_application_filename)
|
7
9
|
rescue LoadError
|
8
10
|
raise "Could not find Rails initialization file #{full_application_filename}. " \
|
9
|
-
|
11
|
+
'Make sure delayed_job_worker_pool is run from the Rails root directory.'
|
10
12
|
end
|
11
13
|
|
12
14
|
private
|
@@ -1,29 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DelayedJobWorkerPool
|
2
4
|
class DSL
|
3
|
-
|
5
|
+
class NoWorkerGroupsDefined < StandardError; end
|
6
|
+
class NonUniqueGroupName < StandardError; end
|
7
|
+
|
4
8
|
CALLBACK_SETTINGS = [:after_preload_app, :on_worker_boot, :after_worker_boot, :after_worker_shutdown].freeze
|
9
|
+
DEFAULT_WORKER_GROUP_NAME = :default
|
5
10
|
|
6
11
|
def self.load(path)
|
7
12
|
options = {}
|
8
13
|
|
9
14
|
dsl = new(options)
|
10
15
|
dsl.instance_eval(File.read(path), path, 1)
|
16
|
+
dsl.assert_groups_defined!
|
11
17
|
|
12
18
|
options
|
13
19
|
end
|
14
20
|
|
15
21
|
def initialize(options)
|
16
22
|
@options = options
|
23
|
+
@options[:worker_groups] ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def preload_app(preload = true)
|
27
|
+
@options[:preload_app] = preload
|
17
28
|
end
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
def worker_group(name = DEFAULT_WORKER_GROUP_NAME)
|
31
|
+
name_sym = name.to_sym
|
32
|
+
if @options[:worker_groups].key?(name_sym)
|
33
|
+
raise NonUniqueGroupName.new("Worker group name #{name_sym} is already in use")
|
22
34
|
end
|
35
|
+
|
36
|
+
group_options = WorkerGroupOptions.new
|
37
|
+
yield(group_options)
|
38
|
+
@options[:worker_groups][name_sym] = group_options
|
23
39
|
end
|
24
40
|
|
25
|
-
def
|
26
|
-
@options[:
|
41
|
+
def assert_groups_defined!
|
42
|
+
return unless @options[:worker_groups].empty?
|
43
|
+
|
44
|
+
raise NoWorkerGroupsDefined.new('No worker groups defined. Define groups using `worker_group`.')
|
27
45
|
end
|
28
46
|
|
29
47
|
CALLBACK_SETTINGS.each do |option_name|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DelayedJobWorkerPool
|
4
|
+
# Keeps track of worker groups and their workers.
|
5
|
+
class Registry
|
6
|
+
class GroupAlreadyExists < StandardError; end
|
7
|
+
class GroupDoesNotExist < StandardError; end
|
8
|
+
class GroupNotFound < StandardError; end
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@groups = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def include_worker?(pid)
|
15
|
+
worker_pids.include?(pid)
|
16
|
+
end
|
17
|
+
|
18
|
+
def workers?
|
19
|
+
!worker_pids.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_group(name, options)
|
23
|
+
raise GroupAlreadyExists.new("Group #{group} already exists") if @groups.key?(name)
|
24
|
+
|
25
|
+
@groups[name] = {
|
26
|
+
options: options,
|
27
|
+
pids: []
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_worker(group_name, pid)
|
32
|
+
group_by_name(group_name)[:pids] << pid
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_worker(pid)
|
36
|
+
@groups[group(pid)][:pids].delete(pid)
|
37
|
+
end
|
38
|
+
|
39
|
+
def options(group_name)
|
40
|
+
group_by_name(group_name)[:options]
|
41
|
+
end
|
42
|
+
|
43
|
+
def worker_pids
|
44
|
+
@groups.values.flat_map { |v| v[:pids] }
|
45
|
+
end
|
46
|
+
|
47
|
+
def group(pid)
|
48
|
+
@groups.each do |name, group|
|
49
|
+
return name if group[:pids].include?(pid)
|
50
|
+
end
|
51
|
+
raise GroupNotFound.new("No group found for PID #{pid}")
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def group_by_name(name)
|
57
|
+
match = @groups[name]
|
58
|
+
return match unless match.nil?
|
59
|
+
|
60
|
+
raise GroupDoesNotExist.new("No group with name #{name.inspect} found")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DelayedJobWorkerPool
|
4
|
+
class WorkerGroupOptions
|
5
|
+
DJ_SETTINGS = [:queues, :min_priority, :max_priority, :sleep_delay, :read_ahead].freeze
|
6
|
+
GROUP_SETTINGS = [:workers].freeze
|
7
|
+
|
8
|
+
attr_accessor *DJ_SETTINGS, *GROUP_SETTINGS
|
9
|
+
|
10
|
+
# @return an options hash for `Delayed::Worker`
|
11
|
+
def dj_worker_options
|
12
|
+
DJ_SETTINGS.each_with_object({}) do |setting, memo|
|
13
|
+
memo[setting] = send(setting)
|
14
|
+
end.compact
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DelayedJobWorkerPool
|
2
4
|
class WorkerInfo
|
3
|
-
attr_reader :process_id, :name
|
5
|
+
attr_reader :process_id, :name, :worker_group
|
4
6
|
|
5
7
|
def initialize(attributes)
|
6
8
|
@process_id = attributes.fetch(:process_id)
|
7
9
|
@name = attributes.fetch(:name)
|
10
|
+
@worker_group = attributes.fetch(:worker_group)
|
8
11
|
end
|
9
|
-
|
10
12
|
end
|
11
13
|
end
|
@@ -1,12 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fcntl'
|
4
|
+
require 'socket'
|
2
5
|
|
3
6
|
module DelayedJobWorkerPool
|
4
7
|
class WorkerPool
|
8
|
+
|
5
9
|
SIGNALS = ['TERM', 'INT'].map(&:freeze).freeze
|
10
|
+
DEFAULT_WORKER_COUNT = 1
|
6
11
|
|
7
12
|
def initialize(options = {})
|
8
13
|
@options = options
|
9
|
-
@
|
14
|
+
@registry = Registry.new
|
10
15
|
@pending_signals = []
|
11
16
|
@pending_signal_read_pipe, @pending_signal_write_pipe = create_pipe(inheritable: false)
|
12
17
|
@master_alive_read_pipe, @master_alive_write_pipe = create_pipe(inheritable: true)
|
@@ -25,7 +30,7 @@ module DelayedJobWorkerPool
|
|
25
30
|
|
26
31
|
log_uninheritable_threads
|
27
32
|
|
28
|
-
|
33
|
+
fork_workers
|
29
34
|
|
30
35
|
monitor_workers
|
31
36
|
|
@@ -37,7 +42,7 @@ module DelayedJobWorkerPool
|
|
37
42
|
|
38
43
|
private
|
39
44
|
|
40
|
-
attr_reader :options, :
|
45
|
+
attr_reader :options, :registry, :master_alive_read_pipe, :master_alive_write_pipe,
|
41
46
|
:pending_signals, :pending_signal_read_pipe, :pending_signal_write_pipe
|
42
47
|
attr_accessor :shutting_down
|
43
48
|
|
@@ -59,8 +64,10 @@ module DelayedJobWorkerPool
|
|
59
64
|
def log_uninheritable_threads
|
60
65
|
Thread.list.each do |t|
|
61
66
|
next if t == Thread.current
|
67
|
+
|
62
68
|
if t.respond_to?(:backtrace)
|
63
|
-
log("WARNING: Thread will not be inherited by workers: #{t.inspect} -
|
69
|
+
log("WARNING: Thread will not be inherited by workers: #{t.inspect} - " \
|
70
|
+
"#{t.backtrace ? t.backtrace.first : ''}")
|
64
71
|
else
|
65
72
|
log("WARNING: Thread will not be inherited by workers: #{t.inspect}")
|
66
73
|
end
|
@@ -74,15 +81,16 @@ module DelayedJobWorkerPool
|
|
74
81
|
def shutdown(signal)
|
75
82
|
log("Shutting down master #{Process.pid} with signal #{signal}")
|
76
83
|
self.shutting_down = true
|
77
|
-
worker_pids.each do |child_pid|
|
78
|
-
|
84
|
+
registry.worker_pids.each do |child_pid|
|
85
|
+
group = registry.group(child_pid)
|
86
|
+
log("Telling worker #{child_pid} from group #{group} to shutdown with signal #{signal}")
|
79
87
|
Process.kill(signal, child_pid)
|
80
88
|
end
|
81
89
|
end
|
82
90
|
|
83
91
|
def monitor_workers
|
84
|
-
while
|
85
|
-
if
|
92
|
+
while workers?
|
93
|
+
if pending_signal?
|
86
94
|
shutdown(pending_signals.pop)
|
87
95
|
elsif (wait_result = Process.wait2(-1, Process::WNOHANG))
|
88
96
|
handle_dead_worker(wait_result.first, wait_result.last)
|
@@ -93,19 +101,22 @@ module DelayedJobWorkerPool
|
|
93
101
|
end
|
94
102
|
|
95
103
|
def handle_dead_worker(worker_pid, status)
|
96
|
-
return unless
|
104
|
+
return unless registry.include_worker?(worker_pid)
|
97
105
|
|
98
106
|
log("Worker #{worker_pid} exited with status #{status.to_i}")
|
99
|
-
|
100
|
-
|
101
|
-
|
107
|
+
|
108
|
+
group = registry.group(worker_pid)
|
109
|
+
invoke_callback(:after_worker_shutdown, worker_info(worker_pid, group))
|
110
|
+
|
111
|
+
registry.remove_worker(worker_pid)
|
112
|
+
fork_worker(group) unless shutting_down
|
102
113
|
end
|
103
114
|
|
104
|
-
def
|
105
|
-
|
115
|
+
def workers?
|
116
|
+
registry.workers?
|
106
117
|
end
|
107
118
|
|
108
|
-
def
|
119
|
+
def pending_signal?
|
109
120
|
!pending_signals.empty?
|
110
121
|
end
|
111
122
|
|
@@ -113,14 +124,26 @@ module DelayedJobWorkerPool
|
|
113
124
|
options[callback_name].call(*args) if options[callback_name]
|
114
125
|
end
|
115
126
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
127
|
+
def fork_workers
|
128
|
+
options.fetch(:worker_groups).each do |name, group|
|
129
|
+
workers = group.workers || DEFAULT_WORKER_COUNT
|
130
|
+
|
131
|
+
registry.add_group(name, group.dj_worker_options)
|
132
|
+
|
133
|
+
workers.times { fork_worker(name) }
|
134
|
+
end
|
121
135
|
end
|
122
136
|
|
123
|
-
def
|
137
|
+
def fork_worker(group)
|
138
|
+
worker_pid = Kernel.fork { run_worker(group) }
|
139
|
+
log("Started worker in group #{group}: #{worker_pid}")
|
140
|
+
|
141
|
+
registry.add_worker(group, worker_pid)
|
142
|
+
|
143
|
+
invoke_callback(:after_worker_boot, worker_info(worker_pid, group))
|
144
|
+
end
|
145
|
+
|
146
|
+
def run_worker(group)
|
124
147
|
master_alive_write_pipe.close
|
125
148
|
|
126
149
|
uninstall_signal_handlers
|
@@ -133,32 +156,32 @@ module DelayedJobWorkerPool
|
|
133
156
|
|
134
157
|
load_app unless preload_app?
|
135
158
|
|
136
|
-
invoke_callback(:on_worker_boot, worker_info(Process.pid))
|
159
|
+
invoke_callback(:on_worker_boot, worker_info(Process.pid, group))
|
137
160
|
|
138
|
-
DelayedJobWorkerPool::Worker.run(worker_options(Process.pid))
|
139
|
-
rescue => e
|
161
|
+
DelayedJobWorkerPool::Worker.run(worker_options(Process.pid, group))
|
162
|
+
rescue StandardError => e
|
140
163
|
log("Worker failed with error: #{e.message}\n#{e.backtrace.join("\n")}")
|
141
164
|
exit(1)
|
142
165
|
end
|
143
166
|
|
144
|
-
def worker_info(worker_pid)
|
145
|
-
DelayedJobWorkerPool::WorkerInfo.new(
|
167
|
+
def worker_info(worker_pid, group)
|
168
|
+
DelayedJobWorkerPool::WorkerInfo.new(
|
169
|
+
name: worker_name(worker_pid, group),
|
170
|
+
process_id: worker_pid,
|
171
|
+
worker_group: group
|
172
|
+
)
|
146
173
|
end
|
147
174
|
|
148
|
-
def worker_name(worker_pid)
|
149
|
-
"host:#{Socket.gethostname} pid:#{worker_pid}"
|
150
|
-
end
|
151
|
-
|
152
|
-
def num_workers
|
153
|
-
options.fetch(:workers, 1)
|
175
|
+
def worker_name(worker_pid, group)
|
176
|
+
"host:#{Socket.gethostname} pid:#{worker_pid} group:#{group}"
|
154
177
|
end
|
155
178
|
|
156
179
|
def preload_app?
|
157
180
|
options.fetch(:preload_app, false)
|
158
181
|
end
|
159
182
|
|
160
|
-
def worker_options(worker_pid)
|
161
|
-
options
|
183
|
+
def worker_options(worker_pid, group)
|
184
|
+
registry.options(group).merge(name: worker_name(worker_pid, group))
|
162
185
|
end
|
163
186
|
|
164
187
|
def create_pipe(inheritable: true)
|
@@ -175,9 +198,7 @@ module DelayedJobWorkerPool
|
|
175
198
|
end
|
176
199
|
|
177
200
|
def wait_for_signal(timeout)
|
178
|
-
if IO.select([pending_signal_read_pipe], [], [], timeout)
|
179
|
-
drain_pipe(pending_signal_read_pipe)
|
180
|
-
end
|
201
|
+
drain_pipe(pending_signal_read_pipe) if IO.select([pending_signal_read_pipe], [], [], timeout)
|
181
202
|
end
|
182
203
|
|
183
204
|
def drain_pipe(pipe)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_worker_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Turkel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayed_job
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '4.2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.1'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.1'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: delayed_job_active_record
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,19 +59,25 @@ dependencies:
|
|
45
59
|
- !ruby/object:Gem::Version
|
46
60
|
version: '0'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
62
|
+
name: rails
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
|
-
- - "
|
65
|
+
- - ">="
|
52
66
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
67
|
+
version: '4.2'
|
68
|
+
- - "<"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '6'
|
54
71
|
type: :development
|
55
72
|
prerelease: false
|
56
73
|
version_requirements: !ruby/object:Gem::Requirement
|
57
74
|
requirements:
|
58
|
-
- - "
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '4.2'
|
78
|
+
- - "<"
|
59
79
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
80
|
+
version: '6'
|
61
81
|
- !ruby/object:Gem::Dependency
|
62
82
|
name: rake
|
63
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,34 +107,48 @@ dependencies:
|
|
87
107
|
- !ruby/object:Gem::Version
|
88
108
|
version: '3.3'
|
89
109
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
110
|
+
name: salsify_rubocop
|
91
111
|
requirement: !ruby/object:Gem::Requirement
|
92
112
|
requirements:
|
93
|
-
- -
|
113
|
+
- - '='
|
94
114
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
115
|
+
version: 0.85.0
|
96
116
|
type: :development
|
97
117
|
prerelease: false
|
98
118
|
version_requirements: !ruby/object:Gem::Requirement
|
99
119
|
requirements:
|
100
|
-
- -
|
120
|
+
- - '='
|
101
121
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
122
|
+
version: 0.85.0
|
103
123
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
124
|
+
name: sprockets
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "<"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '4'
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "<"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '4'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: sqlite3
|
105
139
|
requirement: !ruby/object:Gem::Requirement
|
106
140
|
requirements:
|
107
141
|
- - ">="
|
108
142
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
143
|
+
version: '1.3'
|
110
144
|
type: :development
|
111
145
|
prerelease: false
|
112
146
|
version_requirements: !ruby/object:Gem::Requirement
|
113
147
|
requirements:
|
114
148
|
- - ">="
|
115
149
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
117
|
-
description:
|
150
|
+
version: '1.3'
|
151
|
+
description:
|
118
152
|
email:
|
119
153
|
- jturkel@salsify.com
|
120
154
|
executables:
|
@@ -123,6 +157,7 @@ extensions: []
|
|
123
157
|
extra_rdoc_files: []
|
124
158
|
files:
|
125
159
|
- ".gitignore"
|
160
|
+
- ".rubocop.yml"
|
126
161
|
- ".travis.yml"
|
127
162
|
- CHANGELOG.md
|
128
163
|
- Gemfile
|
@@ -134,15 +169,17 @@ files:
|
|
134
169
|
- lib/delayed_job_worker_pool.rb
|
135
170
|
- lib/delayed_job_worker_pool/application.rb
|
136
171
|
- lib/delayed_job_worker_pool/dsl.rb
|
172
|
+
- lib/delayed_job_worker_pool/registry.rb
|
137
173
|
- lib/delayed_job_worker_pool/version.rb
|
138
174
|
- lib/delayed_job_worker_pool/worker.rb
|
175
|
+
- lib/delayed_job_worker_pool/worker_group_options.rb
|
139
176
|
- lib/delayed_job_worker_pool/worker_info.rb
|
140
177
|
- lib/delayed_job_worker_pool/worker_pool.rb
|
141
178
|
homepage: https://github.com/salsify/delayed_job_worker_pool
|
142
179
|
licenses:
|
143
180
|
- MIT
|
144
181
|
metadata: {}
|
145
|
-
post_install_message:
|
182
|
+
post_install_message:
|
146
183
|
rdoc_options: []
|
147
184
|
require_paths:
|
148
185
|
- lib
|
@@ -150,16 +187,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
187
|
requirements:
|
151
188
|
- - ">="
|
152
189
|
- !ruby/object:Gem::Version
|
153
|
-
version: '2.
|
190
|
+
version: '2.5'
|
154
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
192
|
requirements:
|
156
193
|
- - ">="
|
157
194
|
- !ruby/object:Gem::Version
|
158
195
|
version: '0'
|
159
196
|
requirements: []
|
160
|
-
|
161
|
-
|
162
|
-
signing_key:
|
197
|
+
rubygems_version: 3.0.8
|
198
|
+
signing_key:
|
163
199
|
specification_version: 4
|
164
200
|
summary: Worker process pooling for Delayed Job
|
165
201
|
test_files: []
|