From c5284130647c2efd5925fe935ed2d057e2ef9f6f Mon Sep 17 00:00:00 2001 From: KJ Tsanaktsidis Date: Thu, 23 Mar 2023 18:07:11 +1100 Subject: [PATCH] Cache the result of is_sharded? It can't possibly change.... and it's eating ~2% of Classic's CPU????? --- lib/active_record_shards/model.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/active_record_shards/model.rb b/lib/active_record_shards/model.rb index 7d3c6581..1960c0d9 100644 --- a/lib/active_record_shards/model.rb +++ b/lib/active_record_shards/model.rb @@ -10,8 +10,12 @@ def not_sharded self.sharded = false end + class_attribute :_model_class_is_sharded, default: nil def is_sharded? # rubocop:disable Naming/PredicateName - if self == ActiveRecord::Base + cached = self.class._model_class_is_sharded + return cached unless cached.nil? + + cached = if self == ActiveRecord::Base sharded != false && supports_sharding? elsif self == base_class if sharded.nil? @@ -22,6 +26,9 @@ def is_sharded? # rubocop:disable Naming/PredicateName else base_class.is_sharded? end + + self.class._model_class_is_sharded = cached + cached end def on_replica_by_default?