resque-pool 0.4.0 → 0.5.0.rc1
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 +11 -0
- data/lib/resque/pool.rb +14 -10
- data/lib/resque/pool/cli.rb +13 -0
- data/lib/resque/pool/pooled_worker.rb +20 -4
- data/lib/resque/pool/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d1fd139240f241bd110b1b3f80a6812bd088ab5e
|
|
4
|
+
data.tar.gz: 5e2835129794d3701e28e05372092d4ffc66843b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4ac62b6fb33e095ed8b05b54be9e2b5377c2c92976335301ad8067fb1cf9ebe8a671c771760d4c91c7a93aebe63823f75fe144c840b43460183034aa4072f77c
|
|
7
|
+
data.tar.gz: dca7e927e99936b87cfbd9d714ee9eabe5bda548d2cb0261c757e26cb5db6b05ff661ca136da9d87bf493fd00408789863e5f60de1da63e3322fd0af8d3425da
|
data/README.md
CHANGED
|
@@ -70,6 +70,17 @@ the following into `lib/tasks/resque.rake`:
|
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
+
|
|
74
|
+
For normal work with fresh resque and resque-scheduler gems add next lines in lib/rake/resque.rake
|
|
75
|
+
|
|
76
|
+
```ruby
|
|
77
|
+
task 'resque:pool:setup' do
|
|
78
|
+
Resque::Pool.after_prefork do |job|
|
|
79
|
+
Resque.redis.client.reconnect
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
```
|
|
83
|
+
|
|
73
84
|
### Start the pool manager
|
|
74
85
|
|
|
75
86
|
Then you can start the queues via:
|
data/lib/resque/pool.rb
CHANGED
|
@@ -59,7 +59,7 @@ module Resque
|
|
|
59
59
|
# Config: class methods to start up the pool using the default config {{{
|
|
60
60
|
|
|
61
61
|
@config_files = ["resque-pool.yml", "config/resque-pool.yml"]
|
|
62
|
-
class << self; attr_accessor :config_files, :app_name; end
|
|
62
|
+
class << self; attr_accessor :config_files, :app_name, :spawn_delay; end
|
|
63
63
|
|
|
64
64
|
def self.app_name
|
|
65
65
|
@app_name ||= File.basename(Dir.pwd)
|
|
@@ -215,17 +215,13 @@ module Resque
|
|
|
215
215
|
when :INT
|
|
216
216
|
graceful_worker_shutdown!(signal)
|
|
217
217
|
when :TERM
|
|
218
|
-
|
|
218
|
+
case self.class.term_behavior
|
|
219
|
+
when "graceful_worker_shutdown_and_wait"
|
|
220
|
+
graceful_worker_shutdown_and_wait!(signal)
|
|
221
|
+
when "graceful_worker_shutdown"
|
|
219
222
|
graceful_worker_shutdown!(signal)
|
|
220
223
|
else
|
|
221
|
-
|
|
222
|
-
when "graceful_worker_shutdown_and_wait"
|
|
223
|
-
graceful_worker_shutdown_and_wait!(signal)
|
|
224
|
-
when "graceful_worker_shutdown"
|
|
225
|
-
graceful_worker_shutdown!(signal)
|
|
226
|
-
else
|
|
227
|
-
shutdown_everything_now!(signal)
|
|
228
|
-
end
|
|
224
|
+
shutdown_everything_now!(signal)
|
|
229
225
|
end
|
|
230
226
|
end
|
|
231
227
|
end
|
|
@@ -348,6 +344,7 @@ module Resque
|
|
|
348
344
|
end
|
|
349
345
|
|
|
350
346
|
def signal_all_workers(signal)
|
|
347
|
+
log "Sending #{signal} to all workers"
|
|
351
348
|
all_pids.each do |pid|
|
|
352
349
|
Process.kill signal, pid
|
|
353
350
|
end
|
|
@@ -375,6 +372,7 @@ module Resque
|
|
|
375
372
|
def spawn_missing_workers_for(queues)
|
|
376
373
|
worker_delta_for(queues).times do |nr|
|
|
377
374
|
spawn_worker!(queues)
|
|
375
|
+
sleep Resque::Pool.spawn_delay if Resque::Pool.spawn_delay
|
|
378
376
|
end
|
|
379
377
|
end
|
|
380
378
|
|
|
@@ -397,6 +395,7 @@ module Resque
|
|
|
397
395
|
worker = create_worker(queues)
|
|
398
396
|
pid = fork do
|
|
399
397
|
Process.setpgrp unless Resque::Pool.single_process_group
|
|
398
|
+
worker.worker_parent_pid = Process.pid
|
|
400
399
|
log_worker "Starting worker #{worker}"
|
|
401
400
|
call_after_prefork!
|
|
402
401
|
reset_sig_handlers!
|
|
@@ -409,8 +408,13 @@ module Resque
|
|
|
409
408
|
def create_worker(queues)
|
|
410
409
|
queues = queues.to_s.split(',')
|
|
411
410
|
worker = ::Resque::Worker.new(*queues)
|
|
411
|
+
worker.pool_master_pid = Process.pid
|
|
412
412
|
worker.term_timeout = ENV['RESQUE_TERM_TIMEOUT'] || 4.0
|
|
413
413
|
worker.term_child = ENV['TERM_CHILD']
|
|
414
|
+
if worker.respond_to?(:run_at_exit_hooks=)
|
|
415
|
+
# resque doesn't support this until 1.24, but we support 1.22
|
|
416
|
+
worker.run_at_exit_hooks = ENV['RUN_AT_EXIT_HOOKS'] || false
|
|
417
|
+
end
|
|
414
418
|
if ENV['LOGGING'] || ENV['VERBOSE']
|
|
415
419
|
worker.verbose = ENV['LOGGING'] || ENV['VERBOSE']
|
|
416
420
|
end
|
data/lib/resque/pool/cli.rb
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
require 'trollop'
|
|
2
2
|
require 'resque/pool'
|
|
3
|
+
require 'resque/pool/logging'
|
|
3
4
|
require 'fileutils'
|
|
4
5
|
|
|
5
6
|
module Resque
|
|
6
7
|
class Pool
|
|
7
8
|
module CLI
|
|
9
|
+
include Logging
|
|
10
|
+
extend Logging
|
|
8
11
|
extend self
|
|
9
12
|
|
|
10
13
|
def run
|
|
@@ -38,6 +41,7 @@ where [options] are:
|
|
|
38
41
|
opt :nosync, "Don't sync logfiles on every write"
|
|
39
42
|
opt :pidfile, "PID file location", :type => String, :short => "-p"
|
|
40
43
|
opt :environment, "Set RAILS_ENV/RACK_ENV/RESQUE_ENV", :type => String, :short => "-E"
|
|
44
|
+
opt :spawn_delay, "Delay in milliseconds between spawning missing workers", :type => Integer, :short => "-s"
|
|
41
45
|
opt :term_graceful_wait, "On TERM signal, wait for workers to shut down gracefully"
|
|
42
46
|
opt :term_graceful, "On TERM signal, shut down workers gracefully"
|
|
43
47
|
opt :term_immediate, "On TERM signal, shut down workers immediately (default)"
|
|
@@ -113,6 +117,15 @@ where [options] are:
|
|
|
113
117
|
Resque::Pool.term_behavior = "graceful_worker_shutdown_and_wait"
|
|
114
118
|
elsif opts[:term_graceful]
|
|
115
119
|
Resque::Pool.term_behavior = "graceful_worker_shutdown"
|
|
120
|
+
elsif ENV["TERM_CHILD"]
|
|
121
|
+
log "TERM_CHILD enabled, so will user 'term-graceful-and-wait' behaviour"
|
|
122
|
+
Resque::Pool.term_behavior = "graceful_worker_shutdown_and_wait"
|
|
123
|
+
end
|
|
124
|
+
if ENV.include?("DYNO") && !ENV["TERM_CHILD"]
|
|
125
|
+
log "WARNING: Are you running on Heroku? You should probably set TERM_CHILD=1"
|
|
126
|
+
end
|
|
127
|
+
if opts[:spawn_delay]
|
|
128
|
+
Resque::Pool.spawn_delay = opts[:spawn_delay] * 0.001
|
|
116
129
|
end
|
|
117
130
|
end
|
|
118
131
|
|
|
@@ -2,14 +2,30 @@ require 'resque/worker'
|
|
|
2
2
|
|
|
3
3
|
class Resque::Pool
|
|
4
4
|
module PooledWorker
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
attr_accessor :pool_master_pid
|
|
6
|
+
attr_accessor :worker_parent_pid
|
|
7
|
+
|
|
8
|
+
# We can't just check if we've been re-parented to PID 1 (init) because we
|
|
9
|
+
# want to support docker (which will make the pool master PID 1).
|
|
10
|
+
#
|
|
11
|
+
# We also check the worker_parent_pid, because resque-multi-jobs-fork calls
|
|
12
|
+
# Worker#shutdown? from inside the worker child process.
|
|
13
|
+
def pool_master_has_gone_away?
|
|
14
|
+
not potential_parent_pids.include?(Process.ppid)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def potential_parent_pids
|
|
18
|
+
[pool_master_pid, worker_parent_pid].compact
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def shutdown_with_pool?
|
|
22
|
+
shutdown_without_pool? || pool_master_has_gone_away?
|
|
7
23
|
end
|
|
8
24
|
|
|
9
25
|
def self.included(base)
|
|
10
26
|
base.instance_eval do
|
|
11
|
-
alias_method :shutdown_without_pool
|
|
12
|
-
alias_method :shutdown?, :shutdown_with_pool
|
|
27
|
+
alias_method :shutdown_without_pool?, :shutdown?
|
|
28
|
+
alias_method :shutdown?, :shutdown_with_pool?
|
|
13
29
|
end
|
|
14
30
|
end
|
|
15
31
|
|
data/lib/resque/pool/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: resque-pool
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0.rc1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- nicholas a. evans
|
|
@@ -30,14 +30,14 @@ dependencies:
|
|
|
30
30
|
requirements:
|
|
31
31
|
- - ~>
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '2.0'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - ~>
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '2.0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rake
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -172,9 +172,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
172
172
|
version: '0'
|
|
173
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
174
|
requirements:
|
|
175
|
-
- - '
|
|
175
|
+
- - '>'
|
|
176
176
|
- !ruby/object:Gem::Version
|
|
177
|
-
version:
|
|
177
|
+
version: 1.3.1
|
|
178
178
|
requirements: []
|
|
179
179
|
rubyforge_project:
|
|
180
180
|
rubygems_version: 2.0.14
|