mirror of
https://github.com/discourse/discourse.git
synced 2025-02-20 11:48:26 -06:00
PERF: stop running background work between requests
Use a dedicated thread to run Scheduler::Defer This avoids blocking of a worker during operations that require waiting. In particular uploads risked blocking a unicorn. This also add a queue "length" that discourse prometheus consumes.
This commit is contained in:
parent
d43a54e83a
commit
2b8d4508e5
1
config/initializers/099-defer.rb
Normal file
1
config/initializers/099-defer.rb
Normal file
@ -0,0 +1 @@
|
|||||||
|
require_dependency 'scheduler/defer'
|
@ -1,7 +0,0 @@
|
|||||||
require_dependency 'scheduler/defer'
|
|
||||||
|
|
||||||
if defined? Unicorn::HttpServer
|
|
||||||
ObjectSpace.each_object(Unicorn::HttpServer) do |s|
|
|
||||||
s.extend(Scheduler::Defer::Unicorn)
|
|
||||||
end
|
|
||||||
end
|
|
@ -8,6 +8,10 @@ module Scheduler
|
|||||||
@thread = nil
|
@thread = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def length
|
||||||
|
@queue.length
|
||||||
|
end
|
||||||
|
|
||||||
def pause
|
def pause
|
||||||
stop!
|
stop!
|
||||||
@paused = true
|
@paused = true
|
||||||
@ -80,16 +84,6 @@ module Scheduler
|
|||||||
end
|
end
|
||||||
|
|
||||||
class Defer
|
class Defer
|
||||||
|
|
||||||
module Unicorn
|
|
||||||
def process_client(client)
|
|
||||||
Defer.pause
|
|
||||||
super(client)
|
|
||||||
Defer.do_all_work
|
|
||||||
Defer.resume
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
extend Deferrable
|
extend Deferrable
|
||||||
initialize
|
initialize
|
||||||
end
|
end
|
||||||
|
@ -31,6 +31,8 @@ describe Scheduler::Defer do
|
|||||||
x = 2
|
x = 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
expect(@defer.length).to eq(1)
|
||||||
|
|
||||||
@defer.do_all_work
|
@defer.do_all_work
|
||||||
|
|
||||||
expect(x).to eq(2)
|
expect(x).to eq(2)
|
||||||
|
Loading…
Reference in New Issue
Block a user