From a91843f0dc7b97e700dc85505404eafd62b7f8c5 Mon Sep 17 00:00:00 2001 From: Daniel Waterworth Date: Mon, 30 Mar 2020 12:01:06 +0100 Subject: [PATCH] REFACTOR: Move the multisite middleware to the front Both request tracking and message bus rely on multisite before the middleware has run which is not ideal. --- ...st_tracker.rb => 200-first_middlewares.rb} | 17 ++++++++++++++-- .../freedom_patches/rails_multisite.rb | 8 -------- lib/middleware/request_tracker.rb | 20 ++++++------------- 3 files changed, 21 insertions(+), 24 deletions(-) rename config/initializers/{200-message_bus_request_tracker.rb => 200-first_middlewares.rb} (58%) rename config/initializers/004-rails_multisite.rb => lib/freedom_patches/rails_multisite.rb (77%) diff --git a/config/initializers/200-message_bus_request_tracker.rb b/config/initializers/200-first_middlewares.rb similarity index 58% rename from config/initializers/200-message_bus_request_tracker.rb rename to config/initializers/200-first_middlewares.rb index c0ebcfcb1b6..6ae5816fbaf 100644 --- a/config/initializers/200-message_bus_request_tracker.rb +++ b/config/initializers/200-first_middlewares.rb @@ -1,9 +1,11 @@ # frozen_string_literal: true -# we want MesageBus in the absolute front +# we want MesageBus to be close to the front # this is important cause the vast majority of web requests go to it # this allows us to avoid full middleware crawls each time -# Pending https://github.com/rails/rails/pull/27936 +# +# We aren't manipulating the middleware stack directly because of +# https://github.com/rails/rails/pull/27936 session_operations = Rails::Configuration::MiddlewareStackProxy.new([ [:delete, MessageBus::Rack::Middleware], [:unshift, MessageBus::Rack::Middleware], @@ -21,3 +23,14 @@ if Rails.env != 'development' || ENV['TRACK_REQUESTS'] MethodProfiler.ensure_discourse_instrumentation! end end + +if Rails.configuration.multisite + # Multisite needs to be first, because the request tracker and message bus + # rely on it + session_operations = Rails::Configuration::MiddlewareStackProxy.new([ + [:delete, RailsMultisite::Middleware], + [:unshift, RailsMultisite::Middleware, RailsMultisite::DiscoursePatches.config], + ]) + + Rails.configuration.middleware = Rails.configuration.middleware + session_operations +end diff --git a/config/initializers/004-rails_multisite.rb b/lib/freedom_patches/rails_multisite.rb similarity index 77% rename from config/initializers/004-rails_multisite.rb rename to lib/freedom_patches/rails_multisite.rb index 21543492ea8..c4627daa2a7 100644 --- a/config/initializers/004-rails_multisite.rb +++ b/lib/freedom_patches/rails_multisite.rb @@ -26,11 +26,3 @@ module RailsMultisite end end end - -if Rails.configuration.multisite - Rails.configuration.middleware.swap( - RailsMultisite::Middleware, - RailsMultisite::Middleware, - RailsMultisite::DiscoursePatches.config - ) -end diff --git a/lib/middleware/request_tracker.rb b/lib/middleware/request_tracker.rb index 41ad8a60b41..4fbe3d1b2a3 100644 --- a/lib/middleware/request_tracker.rb +++ b/lib/middleware/request_tracker.rb @@ -51,14 +51,6 @@ class Middleware::RequestTracker @app = app end - def self.log_request_on_site(data, host) - RailsMultisite::ConnectionManagement.with_hostname(host) do - unless Discourse.pg_readonly_mode? - log_request(data) - end - end - end - def self.log_request(data) status = data[:status] track_view = data[:track_view] @@ -135,7 +127,6 @@ class Middleware::RequestTracker # we got to skip this on error ... its just logging data = self.class.get_data(env, result, info) rescue nil - host = RailsMultisite::ConnectionManagement.host(env) if data if result && (headers = result[1]) @@ -146,7 +137,7 @@ class Middleware::RequestTracker @@detailed_request_loggers.each { |logger| logger.call(env, data) } end - log_later(data, host) + log_later(data) end end @@ -296,10 +287,11 @@ class Middleware::RequestTracker end end - def log_later(data, host) - Scheduler::Defer.later("Track view", _db = nil) do - self.class.log_request_on_site(data, host) + def log_later(data) + Scheduler::Defer.later("Track view") do + unless Discourse.pg_readonly_mode? + self.class.log_request(data) + end end end - end