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.
109 lines
3.1 KiB
Ruby
109 lines
3.1 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 Commit
|
|
module ClassMethods
|
|
extend ::Gitlab::Utils::Override
|
|
|
|
def rugged_find(repo, commit_id)
|
|
obj = repo.rev_parse_target(commit_id)
|
|
|
|
obj.is_a?(::Rugged::Commit) ? obj : nil
|
|
rescue ::Rugged::Error
|
|
nil
|
|
end
|
|
|
|
# This needs to return an array of Gitlab::Git:Commit objects
|
|
# instead of Rugged::Commit objects to ensure upstream models
|
|
# operate on a consistent interface. Unlike
|
|
# Gitlab::Git::Commit.find, Gitlab::Git::Commit.batch_by_oid
|
|
# doesn't attempt to decorate the result.
|
|
def rugged_batch_by_oid(repo, oids)
|
|
oids.map { |oid| rugged_find(repo, oid) }
|
|
.compact
|
|
.map { |commit| decorate(repo, commit) }
|
|
end
|
|
|
|
override :find_commit
|
|
def find_commit(repo, commit_id)
|
|
if Feature.enabled?(:rugged_find_commit)
|
|
rugged_find(repo, commit_id)
|
|
else
|
|
super
|
|
end
|
|
end
|
|
|
|
override :batch_by_oid
|
|
def batch_by_oid(repo, oids)
|
|
if Feature.enabled?(:rugged_list_commits_by_oid)
|
|
rugged_batch_by_oid(repo, oids)
|
|
else
|
|
super
|
|
end
|
|
end
|
|
end
|
|
|
|
extend ::Gitlab::Utils::Override
|
|
|
|
override :init_commit
|
|
def init_commit(raw_commit)
|
|
case raw_commit
|
|
when ::Rugged::Commit
|
|
init_from_rugged(raw_commit)
|
|
else
|
|
super
|
|
end
|
|
end
|
|
|
|
override :commit_tree_entry
|
|
def commit_tree_entry(path)
|
|
if Feature.enabled?(:rugged_commit_tree_entry)
|
|
rugged_tree_entry(path)
|
|
else
|
|
super
|
|
end
|
|
end
|
|
|
|
# Is this the same as Blob.find_entry_by_path ?
|
|
def rugged_tree_entry(path)
|
|
rugged_commit.tree.path(path)
|
|
rescue Rugged::TreeError
|
|
nil
|
|
end
|
|
|
|
def rugged_commit
|
|
@rugged_commit ||= if raw_commit.is_a?(Rugged::Commit)
|
|
raw_commit
|
|
else
|
|
@repository.rev_parse_target(id)
|
|
end
|
|
end
|
|
|
|
def init_from_rugged(commit)
|
|
author = commit.author
|
|
committer = commit.committer
|
|
|
|
@raw_commit = commit
|
|
@id = commit.oid
|
|
@message = commit.message
|
|
@authored_date = author[:time]
|
|
@committed_date = committer[:time]
|
|
@author_name = author[:name]
|
|
@author_email = author[:email]
|
|
@committer_name = committer[:name]
|
|
@committer_email = committer[:email]
|
|
@parent_ids = commit.parents.map(&:oid)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|