BUGFIX: work correctly if process forks

This commit is contained in:
Sam 2014-03-17 15:22:11 +11:00
parent 90139efc6f
commit 798b8444cf
2 changed files with 41 additions and 5 deletions

View file

@ -3,11 +3,10 @@ module Scheduler
def initialize def initialize
@async = Rails.env != "test" @async = Rails.env != "test"
@queue = Queue.new @queue = Queue.new
@thread = Thread.new { @mutex = Mutex.new
while true @thread = nil
do_work start_thread
end
}
end end
# for test # for test
@ -17,6 +16,7 @@ module Scheduler
def later(&blk) def later(&blk)
if @async if @async
start_thread unless @thread.alive?
@queue << [RailsMultisite::ConnectionManagement.current_db, blk] @queue << [RailsMultisite::ConnectionManagement.current_db, blk]
else else
blk.call blk.call
@ -27,8 +27,24 @@ module Scheduler
@thread.kill @thread.kill
end end
# test only
def stopped?
!@thread.alive?
end
private private
def start_thread
@mutex.synchronize do
return if @thread && @thread.alive?
@thread = Thread.new {
while true
do_work
end
}
end
end
def do_work def do_work
db, job = @queue.deq db, job = @queue.deq
RailsMultisite::ConnectionManagement.establish_connection(db: db) RailsMultisite::ConnectionManagement.establish_connection(db: db)

View file

@ -23,6 +23,26 @@ describe Scheduler::Defer do
@defer.stop! @defer.stop!
end end
it "recovers from a crash / fork" do
s = nil
@defer.stop!
wait_for(10) do
@defer.stopped?
end
# hack allow thread to die
sleep 0.005
@defer.later do
s = "good"
end
wait_for(10) do
s == "good"
end
s.should == "good"
end
it "can queue jobs properly" do it "can queue jobs properly" do
s = nil s = nil