summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2017-10-30 16:10:31 +0100
committerYorick Peterse <yorickpeterse@gmail.com>2017-11-07 22:28:57 +0100
commit90be53c5d39bff5e371cf8a6e11a39bf5dad7bcc (patch)
tree1ab3f4cbe21ff831a9347734eedcd8b7b3028796 /lib
parentbda30182e0d6c0be9f89e2e9a4e8b8325ad7ccb7 (diff)
downloadgitlab-ce-90be53c5d39bff5e371cf8a6e11a39bf5dad7bcc.tar.gz
Cache feature names in RequestStore
The GitHub importer (and probably other parts of our code) ends up calling Feature.persisted? many times (via Gitaly). By storing this data in RequestStore we can save ourselves _a lot_ of database queries. Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/39361
Diffstat (limited to 'lib')
-rw-r--r--lib/feature.rb14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/feature.rb b/lib/feature.rb
index 4bd29aed687..ac3bc65c0d5 100644
--- a/lib/feature.rb
+++ b/lib/feature.rb
@@ -5,6 +5,10 @@ class Feature
class FlipperFeature < Flipper::Adapters::ActiveRecord::Feature
# Using `self.table_name` won't work. ActiveRecord bug?
superclass.table_name = 'features'
+
+ def self.feature_names
+ pluck(:key)
+ end
end
class FlipperGate < Flipper::Adapters::ActiveRecord::Gate
@@ -22,11 +26,19 @@ class Feature
flipper.feature(key)
end
+ def persisted_names
+ if RequestStore.active?
+ RequestStore[:flipper_persisted_names] ||= FlipperFeature.feature_names
+ else
+ FlipperFeature.feature_names
+ end
+ end
+
def persisted?(feature)
# Flipper creates on-memory features when asked for a not-yet-created one.
# If we want to check if a feature has been actually set, we look for it
# on the persisted features list.
- all.map(&:name).include?(feature.name)
+ persisted_names.include?(feature.name)
end
def enabled?(key, thing = nil)