2fc4de6ab6
This brings back changes in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20432. For users using Gitaly on top of NFS, accessing the Git data directly via Rugged may be faster than going through than Gitaly. This merge request introduces the feature flag `rugged_list_commits_by_oid` to activate the Rugged method. For one customer, we saw that ListCommitsByOid was the second highest used endpoint that may be causing increased load.
78 lines
2.4 KiB
Ruby
78 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# NOTE: This code is legacy. Do not add/modify code here unless you have
|
|
# discussed with the Gitaly team. See
|
|
# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
|
|
# for more details.
|
|
|
|
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
|
module Gitlab
|
|
module Git
|
|
module RuggedImpl
|
|
module Repository
|
|
extend ::Gitlab::Utils::Override
|
|
|
|
FEATURE_FLAGS = %i(rugged_find_commit rugged_tree_entries rugged_tree_entry rugged_commit_is_ancestor rugged_commit_tree_entry rugged_list_commits_by_oid).freeze
|
|
|
|
def alternate_object_directories
|
|
relative_object_directories.map { |d| File.join(path, d) }
|
|
end
|
|
|
|
ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES = %w[
|
|
GIT_OBJECT_DIRECTORY_RELATIVE
|
|
GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE
|
|
].freeze
|
|
|
|
def relative_object_directories
|
|
Gitlab::Git::HookEnv.all(gl_repository).values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
|
|
end
|
|
|
|
def rugged
|
|
@rugged ||= ::Rugged::Repository.new(path, alternates: alternate_object_directories)
|
|
rescue ::Rugged::RepositoryError, ::Rugged::OSError
|
|
raise ::Gitlab::Git::Repository::NoRepository.new('no repository for such path')
|
|
end
|
|
|
|
def cleanup
|
|
@rugged&.close
|
|
end
|
|
|
|
# Return the object that +revspec+ points to. If +revspec+ is an
|
|
# annotated tag, then return the tag's target instead.
|
|
def rev_parse_target(revspec)
|
|
obj = rugged.rev_parse(revspec)
|
|
Ref.dereference_object(obj)
|
|
end
|
|
|
|
override :ancestor?
|
|
def ancestor?(from, to)
|
|
if Feature.enabled?(:rugged_commit_is_ancestor)
|
|
rugged_is_ancestor?(from, to)
|
|
else
|
|
super
|
|
end
|
|
end
|
|
|
|
def rugged_is_ancestor?(ancestor_id, descendant_id)
|
|
return false if ancestor_id.nil? || descendant_id.nil?
|
|
|
|
rugged_merge_base(ancestor_id, descendant_id) == ancestor_id
|
|
rescue Rugged::OdbError
|
|
false
|
|
end
|
|
|
|
def rugged_merge_base(from, to)
|
|
rugged.merge_base(from, to)
|
|
rescue Rugged::ReferenceError
|
|
nil
|
|
end
|
|
|
|
# Lookup for rugged object by oid or ref name
|
|
def lookup(oid_or_ref_name)
|
|
rugged.rev_parse(oid_or_ref_name)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|