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.
This commit is contained in:
parent
bb6b73cf3c
commit
f131757fc8
2 changed files with 21 additions and 0 deletions
|
@ -60,6 +60,11 @@ module Gitlab
|
|||
# Some weird thing?
|
||||
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|
|
||||
if is_enabled
|
||||
repo.gitaly_commit_client.find_commit(commit_id)
|
||||
|
|
|
@ -191,6 +191,8 @@ module Gitlab
|
|||
metadata['call_site'] = feature.to_s if feature
|
||||
metadata['gitaly-servers'] = address_metadata(remote_storage) if remote_storage
|
||||
|
||||
metadata.merge!(server_feature_flags(feature))
|
||||
|
||||
result = { metadata: metadata }
|
||||
|
||||
# nil timeout indicates that we should use the default
|
||||
|
@ -209,6 +211,20 @@ module Gitlab
|
|||
result
|
||||
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)
|
||||
params = Gitlab.config.repositories.storages[storage]
|
||||
raise "storage not found: #{storage.inspect}" if params.nil?
|
||||
|
|
Loading…
Reference in a new issue