Skip to content

Commit 86b6b83

Browse files
committed
Don't run the :before_fork hook if we're not actually going to fork.
1 parent 7188ef1 commit 86b6b83

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

lib/resque/worker.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,9 @@ def work(interval = 5.0, &block)
136136
if not paused? and job = reserve
137137
log "got: #{job.inspect}"
138138
job.worker = self
139-
run_hook :before_fork, job
140139
working_on job
141140

142-
if @child = fork
141+
if @child = fork(job)
143142
srand # Reseeding
144143
procline "Forked #{@child} at #{Time.now.to_i}"
145144
begin
@@ -228,8 +227,12 @@ def queues
228227

229228
# Not every platform supports fork. Here we do our magic to
230229
# determine if yours does.
231-
def fork
230+
def fork(job)
232231
return if @cant_fork
232+
233+
# Only run before_fork hooks if we're actually going to fork
234+
# (after checking @cant_fork)
235+
run_hook :before_fork, job
233236

234237
begin
235238
# IronRuby doesn't support `Kernel.fork` yet

test/worker_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,19 @@ def self.perform
376376
workerA.work(0)
377377
assert $BEFORE_FORK_CALLED
378378
end
379+
380+
test "Will not call a before_fork hook when the worker can't fork" do
381+
Resque.redis.flushall
382+
$BEFORE_FORK_CALLED = false
383+
Resque.before_fork = Proc.new { $BEFORE_FORK_CALLED = true }
384+
workerA = Resque::Worker.new(:jobs)
385+
workerA.cant_fork = true
386+
387+
assert !$BEFORE_FORK_CALLED, "before_fork should not have been called before job runs"
388+
Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
389+
workerA.work(0)
390+
assert !$BEFORE_FORK_CALLED, "before_fork should not have been called after job runs"
391+
end
379392

380393
test "very verbose works in the afternoon" do
381394
begin

0 commit comments

Comments
 (0)