mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-23 15:48:43 -05:00
BUGFIX: work correctly if process forks
This commit is contained in:
parent
90139efc6f
commit
798b8444cf
2 changed files with 41 additions and 5 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue