Commit f131757f authored by Zeger-Jan van de Weg's avatar Zeger-Jan van de Weg Committed by Jacob Vosmaer

Set Gitaly Server feature flags from Rails

Gitaly itself hold very little state, other than the data on disk. This
limits the interfaces to set feature flags. Gitaly now has the ability
to interpret the request metadata to check for feature flags.
https://gitlab.com/gitlab-org/gitaly/merge_requests/704
This allows clients control on the Gitaly server, and given that Rails
has an internal chatops interface to set these values this was chosen as
solution.

Known limitation right now, is that this package doesn't support the opt
out that other Gitaly features do.
parent bb6b73cf
...@@ -60,6 +60,11 @@ module Gitlab ...@@ -60,6 +60,11 @@ module Gitlab
# Some weird thing? # Some weird thing?
return nil unless commit_id.is_a?(String) return nil unless commit_id.is_a?(String)
# The Go-Git backend Gitaly might use, tries to be nice when resolving
# to the commit, and `master:ref` will resolve to the commit that master
# resolves to. To keep behaviour the same, we return nil
return nil if commit_id.include?(':')
commit = repo.gitaly_migrate(:find_commit) do |is_enabled| commit = repo.gitaly_migrate(:find_commit) do |is_enabled|
if is_enabled if is_enabled
repo.gitaly_commit_client.find_commit(commit_id) repo.gitaly_commit_client.find_commit(commit_id)
......
...@@ -191,6 +191,8 @@ module Gitlab ...@@ -191,6 +191,8 @@ module Gitlab
metadata['call_site'] = feature.to_s if feature metadata['call_site'] = feature.to_s if feature
metadata['gitaly-servers'] = address_metadata(remote_storage) if remote_storage metadata['gitaly-servers'] = address_metadata(remote_storage) if remote_storage
metadata.merge!(server_feature_flags(feature))
result = { metadata: metadata } result = { metadata: metadata }
# nil timeout indicates that we should use the default # nil timeout indicates that we should use the default
...@@ -209,6 +211,20 @@ module Gitlab ...@@ -209,6 +211,20 @@ module Gitlab
result result
end end
SERVER_FEATURE_FLAGS = {
find_commit: ["gogit-findcommit"]
}.freeze
# Other than data on the disk, Gitaly is stateless. Rails will thus set
# feature flags in the request metadata.
def self.server_feature_flags(feature)
return {} unless SERVER_FEATURE_FLAGS.key?(feature)
SERVER_FEATURE_FLAGS[feature]
.map { |f| ["gitaly-feature-#{f}", feature_enabled?(f).to_s] }
.to_h
end
def self.token(storage) def self.token(storage)
params = Gitlab.config.repositories.storages[storage] params = Gitlab.config.repositories.storages[storage]
raise "storage not found: #{storage.inspect}" if params.nil? raise "storage not found: #{storage.inspect}" if params.nil?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment