diff options
author | Yorick Peterse <yorickpeterse@gmail.com> | 2017-10-30 16:10:31 +0100 |
---|---|---|
committer | Yorick Peterse <yorickpeterse@gmail.com> | 2017-11-07 22:28:57 +0100 |
commit | 90be53c5d39bff5e371cf8a6e11a39bf5dad7bcc (patch) | |
tree | 1ab3f4cbe21ff831a9347734eedcd8b7b3028796 /lib | |
parent | bda30182e0d6c0be9f89e2e9a4e8b8325ad7ccb7 (diff) | |
download | gitlab-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.rb | 14 |
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) |