summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2019-06-18 12:25:26 +0000
committerDouwe Maan <douwe@gitlab.com>2019-06-18 12:25:26 +0000
commit14d46afd9b3ee7482fa8be7bc6782b19e960ce45 (patch)
tree55bf0f0426481ab68d985e68c29eec711a199216
parent6d68a3a254833ada6228bf245fc43bb8f4d6b85b (diff)
parent4dfaaf40b9c6754157adff3704a8036b440148b3 (diff)
downloadgitlab-ce-14d46afd9b3ee7482fa8be7bc6782b19e960ce45.tar.gz
Merge branch 'zj-feature-flag-default-on-catfile-cache' into 'master'
Feature flag default on catfile cache Closes gitaly#1712 See merge request gitlab-org/gitlab-ce!29556
-rw-r--r--lib/feature/gitaly.rb31
-rw-r--r--lib/gitlab/gitaly_client.rb22
-rw-r--r--lib/gitlab/gitaly_client/storage_settings.rb2
-rw-r--r--spec/lib/feature/gitaly_spec.rb40
-rw-r--r--spec/lib/gitlab/gitaly_client/storage_settings_spec.rb12
-rw-r--r--spec/lib/gitlab/gitaly_client_spec.rb14
-rw-r--r--spec/support/helpers/cycle_analytics_helpers.rb2
7 files changed, 84 insertions, 39 deletions
diff --git a/lib/feature/gitaly.rb b/lib/feature/gitaly.rb
new file mode 100644
index 00000000000..d7a8f8a0b9e
--- /dev/null
+++ b/lib/feature/gitaly.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'set'
+
+class Feature
+ class Gitaly
+ # Server feature flags should use '_' to separate words.
+ # CATFILE_CACHE sets an incorrect example
+ CATFILE_CACHE = 'catfile-cache'.freeze
+
+ SERVER_FEATURE_FLAGS = [CATFILE_CACHE].freeze
+ DEFAULT_ON_FLAGS = Set.new([CATFILE_CACHE]).freeze
+
+ class << self
+ def enabled?(feature_flag)
+ return false unless Feature::FlipperFeature.table_exists?
+
+ default_on = DEFAULT_ON_FLAGS.include?(feature_flag)
+ Feature.enabled?("gitaly_#{feature_flag}", default_enabled: default_on)
+ rescue ActiveRecord::NoDatabaseError
+ false
+ end
+
+ def server_feature_flags
+ SERVER_FEATURE_FLAGS.map do |f|
+ ["gitaly-feature-#{f.tr('_', '-')}", enabled?(f).to_s]
+ end.to_h
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index e683d4e5bbe..47976389af6 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -31,10 +31,6 @@ module Gitlab
MAXIMUM_GITALY_CALLS = 30
CLIENT_NAME = (Sidekiq.server? ? 'gitlab-sidekiq' : 'gitlab-web').freeze
- SERVER_FEATURE_CATFILE_CACHE = 'catfile-cache'.freeze
- # Server feature flags should use '_' to separate words.
- SERVER_FEATURE_FLAGS = [SERVER_FEATURE_CATFILE_CACHE].freeze
-
MUTEX = Mutex.new
define_histogram :gitaly_controller_action_duration_seconds do
@@ -223,9 +219,9 @@ module Gitlab
metadata['call_site'] = feature.to_s if feature
metadata['gitaly-servers'] = address_metadata(remote_storage) if remote_storage
metadata['x-gitlab-correlation-id'] = Labkit::Correlation::CorrelationId.current_id if Labkit::Correlation::CorrelationId.current_id
- metadata['gitaly-session-id'] = session_id if feature_enabled?(SERVER_FEATURE_CATFILE_CACHE)
+ metadata['gitaly-session-id'] = session_id if Feature::Gitaly.enabled?(Feature::Gitaly::CATFILE_CACHE)
- metadata.merge!(server_feature_flags)
+ metadata.merge!(Feature::Gitaly.server_feature_flags)
result = { metadata: metadata }
@@ -244,12 +240,6 @@ module Gitlab
Gitlab::SafeRequestStore[:gitaly_session_id] ||= SecureRandom.uuid
end
- def self.server_feature_flags
- SERVER_FEATURE_FLAGS.map do |f|
- ["gitaly-feature-#{f.tr('_', '-')}", feature_enabled?(f).to_s]
- end.to_h
- end
-
def self.token(storage)
params = Gitlab.config.repositories.storages[storage]
raise "storage not found: #{storage.inspect}" if params.nil?
@@ -257,12 +247,6 @@ module Gitlab
params['gitaly_token'].presence || Gitlab.config.gitaly['token']
end
- def self.feature_enabled?(feature_name)
- Feature::FlipperFeature.table_exists? && Feature.enabled?("gitaly_#{feature_name}")
- rescue ActiveRecord::NoDatabaseError
- false
- end
-
# Ensures that Gitaly is not being abuse through n+1 misuse etc
def self.enforce_gitaly_request_limits(call_site)
# Only count limits in request-response environments (not sidekiq for example)
@@ -295,7 +279,7 @@ module Gitlab
# check if the limit is being exceeded while testing in those environments
# In that case we can use a feature flag to indicate that we do want to
# enforce request limits.
- return true if feature_enabled?('enforce_requests_limits')
+ return true if Feature::Gitaly.enabled?('enforce_requests_limits')
!(Rails.env.production? || ENV["GITALY_DISABLE_REQUEST_LIMITS"])
end
diff --git a/lib/gitlab/gitaly_client/storage_settings.rb b/lib/gitlab/gitaly_client/storage_settings.rb
index 78ef6bfc0ec..7d1206e551b 100644
--- a/lib/gitlab/gitaly_client/storage_settings.rb
+++ b/lib/gitlab/gitaly_client/storage_settings.rb
@@ -34,7 +34,7 @@ module Gitlab
def self.disk_access_denied?
return false if rugged_enabled?
- !temporarily_allowed?(ALLOW_KEY) && GitalyClient.feature_enabled?(DISK_ACCESS_DENIED_FLAG)
+ !temporarily_allowed?(ALLOW_KEY) && Feature::Gitaly.enabled?(DISK_ACCESS_DENIED_FLAG)
rescue
false # Err on the side of caution, don't break gitlab for people
end
diff --git a/spec/lib/feature/gitaly_spec.rb b/spec/lib/feature/gitaly_spec.rb
new file mode 100644
index 00000000000..0e24a927d4c
--- /dev/null
+++ b/spec/lib/feature/gitaly_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+
+describe Feature::Gitaly do
+ let(:feature_flag) { "mep_mep" }
+
+ before do
+ stub_const("#{described_class}::SERVER_FEATURE_FLAGS", [feature_flag])
+ end
+
+ describe ".enabled?" do
+ context 'when the gate is closed' do
+ before do
+ stub_feature_flags(gitaly_mep_mep: false)
+ end
+
+ it 'returns false' do
+ expect(described_class.enabled?(feature_flag)).to be(false)
+ end
+ end
+
+ context 'when the flag defaults to on' do
+ it 'returns true' do
+ expect(described_class.enabled?(feature_flag)).to be(true)
+ end
+ end
+ end
+
+ describe ".server_feature_flags" do
+ context 'when one flag is disabled' do
+ before do
+ stub_feature_flags(gitaly_mep_mep: false)
+ end
+
+ subject { described_class.server_feature_flags }
+
+ it { is_expected.to be_a(Hash) }
+ it { is_expected.to eq("gitaly-feature-mep-mep" => "false") }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb b/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
index bb10be2a4dc..f2f53982b09 100644
--- a/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
@@ -28,12 +28,16 @@ describe Gitlab::GitalyClient::StorageSettings do
end
describe '.disk_access_denied?' do
- it 'return false when Rugged is enabled', :enable_rugged do
- expect(described_class.disk_access_denied?).to be_falsey
+ context 'when Rugged is enabled', :enable_rugged do
+ it 'returns false' do
+ expect(described_class.disk_access_denied?).to be_falsey
+ end
end
- it 'returns true' do
- expect(described_class.disk_access_denied?).to be_truthy
+ context 'when Rugged is disabled' do
+ it 'returns true' do
+ expect(described_class.disk_access_denied?).to be_truthy
+ end
end
end
end
diff --git a/spec/lib/gitlab/gitaly_client_spec.rb b/spec/lib/gitlab/gitaly_client_spec.rb
index da1eb0c2618..eed233f1f3e 100644
--- a/spec/lib/gitlab/gitaly_client_spec.rb
+++ b/spec/lib/gitlab/gitaly_client_spec.rb
@@ -330,20 +330,6 @@ describe Gitlab::GitalyClient do
end
end
- describe 'feature_enabled?' do
- let(:feature_name) { 'my_feature' }
- let(:real_feature_name) { "gitaly_#{feature_name}" }
-
- before do
- allow(Feature).to receive(:enabled?).and_return(false)
- end
-
- it 'returns false' do
- expect(Feature).to receive(:enabled?).with(real_feature_name)
- expect(described_class.feature_enabled?(feature_name)).to be(false)
- end
- end
-
describe 'timeouts' do
context 'with default values' do
before do
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index 33648292037..100e439ef44 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -10,7 +10,7 @@ module CycleAnalyticsHelpers
repository = project.repository
oldrev = repository.commit(branch_name)&.sha || Gitlab::Git::BLANK_SHA
- if Timecop.frozen? && Gitlab::GitalyClient.feature_enabled?(:operation_user_commit_files)
+ if Timecop.frozen?
mock_gitaly_multi_action_dates(repository, commit_time)
end