From 6a79864f142b902778cff33662efd91be879e750 Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Wed, 2 Jun 2021 12:54:33 +0800 Subject: [PATCH] PERF: Cache categories query in `Stylesheet::Manager.color_scheme_digest`. The query is being executed each time we try and generate the link path for a stylesheet within the duration of a reqeust. Categories are not updated that often so repeating this query multiple times a request is wasteful. At the time of this commit, there is a `publish_discourse_stylesheet` ActiveRecord callback on the `Category` model which clears the cache of `Stylesheet::Manager` each time a category is saved. --- lib/stylesheet/manager.rb | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/stylesheet/manager.rb b/lib/stylesheet/manager.rb index 86e2552d243..6b916e9ef88 100644 --- a/lib/stylesheet/manager.rb +++ b/lib/stylesheet/manager.rb @@ -436,15 +436,21 @@ class Stylesheet::Manager end def color_scheme_digest - cs = @color_scheme || theme&.color_scheme - category_updated = Category.where("uploaded_background_id IS NOT NULL").pluck(:updated_at).map(&:to_i).sum + categories_updated = self.class.cache["categories_updated"] ||= begin + Category + .where("uploaded_background_id IS NOT NULL") + .pluck(:updated_at) + .map(&:to_i) + .sum + end + fonts = "#{SiteSetting.base_font}-#{SiteSetting.heading_font}" - if cs || category_updated > 0 + if cs || categories_updated > 0 theme_color_defs = theme&.resolve_baked_field(:common, :color_definitions) - Digest::SHA1.hexdigest "#{RailsMultisite::ConnectionManagement.current_db}-#{cs&.id}-#{cs&.version}-#{theme_color_defs}-#{Stylesheet::Manager.last_file_updated}-#{category_updated}-#{fonts}" + Digest::SHA1.hexdigest "#{RailsMultisite::ConnectionManagement.current_db}-#{cs&.id}-#{cs&.version}-#{theme_color_defs}-#{Stylesheet::Manager.last_file_updated}-#{categories_updated}-#{fonts}" else digest_string = "defaults-#{Stylesheet::Manager.last_file_updated}-#{fonts}"