mirror of
https://github.com/discourse/discourse.git
synced 2025-05-23 07:01:13 +08:00
BUGFIX: work correctly if process forks
This commit is contained in:
@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user