From 2b8d4508e51b85c6b36594aec2ebcbc269ee3daf Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 23 Nov 2017 15:48:47 +1100 Subject: [PATCH] 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. --- config/initializers/099-defer.rb | 1 + config/initializers/099-unicorn.rb | 7 ------- lib/scheduler/defer.rb | 14 ++++---------- spec/components/scheduler/defer_spec.rb | 2 ++ 4 files changed, 7 insertions(+), 17 deletions(-) create mode 100644 config/initializers/099-defer.rb delete mode 100644 config/initializers/099-unicorn.rb diff --git a/config/initializers/099-defer.rb b/config/initializers/099-defer.rb new file mode 100644 index 00000000000..9d020433c1d --- /dev/null +++ b/config/initializers/099-defer.rb @@ -0,0 +1 @@ +require_dependency 'scheduler/defer' diff --git a/config/initializers/099-unicorn.rb b/config/initializers/099-unicorn.rb deleted file mode 100644 index e6152b69d70..00000000000 --- a/config/initializers/099-unicorn.rb +++ /dev/null @@ -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 diff --git a/lib/scheduler/defer.rb b/lib/scheduler/defer.rb index 6346b16dae1..e63cde145a0 100644 --- a/lib/scheduler/defer.rb +++ b/lib/scheduler/defer.rb @@ -8,6 +8,10 @@ module Scheduler @thread = nil end + def length + @queue.length + end + def pause stop! @paused = true @@ -80,16 +84,6 @@ module Scheduler end class Defer - - module Unicorn - def process_client(client) - Defer.pause - super(client) - Defer.do_all_work - Defer.resume - end - end - extend Deferrable initialize end diff --git a/spec/components/scheduler/defer_spec.rb b/spec/components/scheduler/defer_spec.rb index c00829b3c34..e7f57315e6f 100644 --- a/spec/components/scheduler/defer_spec.rb +++ b/spec/components/scheduler/defer_spec.rb @@ -31,6 +31,8 @@ describe Scheduler::Defer do x = 2 end + expect(@defer.length).to eq(1) + @defer.do_all_work expect(x).to eq(2)