Skip to content
Snippets Groups Projects
Commit 82b6e537 authored by Stan Hu's avatar Stan Hu
Browse files

Send project name with Gitaly repository requests

When hashed storage is in use, it's helpful to have the project
name associated with the request.

Closes https://gitlab.com/gitlab-org/gitaly/issues/1394
parent d8e24e9d
No related branches found
No related tags found
No related merge requests found
Showing
with 61 additions and 46 deletions
Loading
Loading
@@ -96,7 +96,8 @@ class PoolRepository < ActiveRecord::Base
@object_pool ||= Gitlab::Git::ObjectPool.new(
shard.name,
disk_path + '.git',
source_project.repository.raw)
source_project.repository.raw,
source_project.path_with_namespace)
end
 
def inspect
Loading
Loading
Loading
Loading
@@ -1288,7 +1288,7 @@ class Project < ActiveRecord::Base
# Forked import is handled asynchronously
return if forked? && !force
 
if gitlab_shell.create_repository(repository_storage, disk_path)
if gitlab_shell.create_repository(repository_storage, disk_path, full_path)
repository.after_create
true
else
Loading
Loading
Loading
Loading
@@ -60,7 +60,7 @@ class ProjectWiki
def wiki
@wiki ||= begin
gl_repository = Gitlab::GlRepository.gl_repository(project, true)
raw_repository = Gitlab::Git::Repository.new(project.repository_storage, disk_path + '.git', gl_repository)
raw_repository = Gitlab::Git::Repository.new(project.repository_storage, disk_path + '.git', gl_repository, full_path)
 
create_repo!(raw_repository) unless raw_repository.exists?
 
Loading
Loading
@@ -175,7 +175,7 @@ class ProjectWiki
private
 
def create_repo!(raw_repository)
gitlab_shell.create_repository(project.repository_storage, disk_path)
gitlab_shell.create_repository(project.repository_storage, disk_path, project.full_path)
 
raise CouldNotCreateWikiError unless raw_repository.exists?
 
Loading
Loading
Loading
Loading
@@ -1104,6 +1104,9 @@ class Repository
end
 
def initialize_raw_repository
Gitlab::Git::Repository.new(project.repository_storage, disk_path + '.git', Gitlab::GlRepository.gl_repository(project, is_wiki))
Gitlab::Git::Repository.new(project.repository_storage,
disk_path + '.git',
Gitlab::GlRepository.gl_repository(project, is_wiki),
project.full_path)
end
end
Loading
Loading
@@ -73,7 +73,7 @@ module Projects
project.ensure_repository
project.repository.fetch_as_mirror(project.import_url, refmap: refmap)
else
gitlab_shell.import_repository(project.repository_storage, project.disk_path, project.import_url)
gitlab_shell.import_repository(project.repository_storage, project.disk_path, project.import_url, project.full_path)
end
rescue Gitlab::Shell::Error => e
# Expire cache to prevent scenarios such as:
Loading
Loading
Loading
Loading
@@ -15,19 +15,21 @@ class RepositoryForkWorker
return target_project.import_state.mark_as_failed(_('Source project cannot be found.'))
end
 
fork_repository(target_project, source_project.repository_storage, source_project.disk_path)
fork_repository(target_project, source_project)
end
 
private
 
def fork_repository(target_project, source_repository_storage_name, source_disk_path)
def fork_repository(target_project, source_project)
return unless start_fork(target_project)
 
Gitlab::Metrics.add_event(:fork_repository)
 
result = gitlab_shell.fork_repository(source_repository_storage_name, source_disk_path,
target_project.repository_storage, target_project.disk_path)
raise "Unable to fork project #{target_project.id} for repository #{source_disk_path} -> #{target_project.disk_path}" unless result
result = gitlab_shell.fork_repository(
source_project.repository_storage, source_project.disk_path, source_project.full_path,
target_project.repository_storage, target_project.disk_path, target_project.full_path)
raise "Unable to fork project #{target_project.id} for repository #{source_project.disk_path} -> #{target_project.disk_path}" unless result
 
target_project.after_import
end
Loading
Loading
Loading
Loading
@@ -11,7 +11,7 @@ class MigrateRepoSize < ActiveRecord::Migration[4.2]
path = File.join(namespace_path, project['project_path'] + '.git')
 
begin
repo = Gitlab::Git::Repository.new('default', path, '')
repo = Gitlab::Git::Repository.new('default', path, '', '')
if repo.empty?
print '-'
else
Loading
Loading
Loading
Loading
@@ -93,7 +93,7 @@ module Backup
progress.puts "Error: #{e}".color(:red)
end
else
restore_repo_success = gitlab_shell.create_repository(project.repository_storage, project.disk_path)
restore_repo_success = gitlab_shell.create_repository(project.repository_storage, project.disk_path, project.full_path)
end
 
if restore_repo_success
Loading
Loading
Loading
Loading
@@ -67,7 +67,7 @@ module Gitlab
 
disk_path = project.wiki.disk_path
import_url = project.import_url.sub(/\.git\z/, ".git/wiki")
gitlab_shell.import_repository(project.repository_storage, disk_path, import_url)
gitlab_shell.import_repository(project.repository_storage, disk_path, import_url, project.full_path)
rescue StandardError => e
errors << { type: :wiki, errors: e.message }
end
Loading
Loading
Loading
Loading
@@ -10,12 +10,13 @@ module Gitlab
delegate :exists?, :size, to: :repository
delegate :unlink_repository, :delete, to: :object_pool_service
 
attr_reader :storage, :relative_path, :source_repository
attr_reader :storage, :relative_path, :source_repository, :gl_project_name
 
def initialize(storage, relative_path, source_repository)
def initialize(storage, relative_path, source_repository, gl_project_name)
@storage = storage
@relative_path = relative_path
@source_repository = source_repository
@gl_project_name = gl_project_name
end
 
def create
Loading
Loading
@@ -31,12 +32,12 @@ module Gitlab
end
 
def to_gitaly_repository
Gitlab::GitalyClient::Util.repository(storage, relative_path, GL_REPOSITORY)
Gitlab::GitalyClient::Util.repository(storage, relative_path, GL_REPOSITORY, gl_project_name)
end
 
# Allows for reusing other RPCs by 'tricking' Gitaly to think its a repository
def repository
@repository ||= Gitlab::Git::Repository.new(storage, relative_path, GL_REPOSITORY)
@repository ||= Gitlab::Git::Repository.new(storage, relative_path, GL_REPOSITORY, gl_project_name)
end
 
private
Loading
Loading
Loading
Loading
@@ -67,7 +67,7 @@ module Gitlab
# Relative path of repo
attr_reader :relative_path
 
attr_reader :storage, :gl_repository, :relative_path
attr_reader :storage, :gl_repository, :relative_path, :gl_project_name
 
# This remote name has to be stable for all types of repositories that
# can join an object pool. If it's structure ever changes, a migration
Loading
Loading
@@ -78,10 +78,11 @@ module Gitlab
 
# This initializer method is only used on the client side (gitlab-ce).
# Gitaly-ruby uses a different initializer.
def initialize(storage, relative_path, gl_repository)
def initialize(storage, relative_path, gl_repository, gl_project_name)
@storage = storage
@relative_path = relative_path
@gl_repository = gl_repository
@gl_project_name = gl_project_name
 
@name = @relative_path.split("/").last
end
Loading
Loading
@@ -872,7 +873,7 @@ module Gitlab
end
 
def gitaly_repository
Gitlab::GitalyClient::Util.repository(@storage, @relative_path, @gl_repository)
Gitlab::GitalyClient::Util.repository(@storage, @relative_path, @gl_repository, @gl_project_name)
end
 
def gitaly_ref_client
Loading
Loading
Loading
Loading
@@ -4,7 +4,7 @@ module Gitlab
module GitalyClient
module Util
class << self
def repository(repository_storage, relative_path, gl_repository)
def repository(repository_storage, relative_path, gl_repository, gl_project_name)
git_env = Gitlab::Git::HookEnv.all(gl_repository)
git_object_directory = git_env['GIT_OBJECT_DIRECTORY_RELATIVE'].presence
git_alternate_object_directories = Array.wrap(git_env['GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE'])
Loading
Loading
@@ -14,14 +14,16 @@ module Gitlab
relative_path: relative_path,
gl_repository: gl_repository.to_s,
git_object_directory: git_object_directory.to_s,
git_alternate_object_directories: git_alternate_object_directories
git_alternate_object_directories: git_alternate_object_directories,
gl_project_name: gl_project_name
)
end
 
def git_repository(gitaly_repository)
Gitlab::Git::Repository.new(gitaly_repository.storage_name,
gitaly_repository.relative_path,
gitaly_repository.gl_repository)
gitaly_repository.gl_repository,
gitaly_repository.gl_project_name)
end
end
end
Loading
Loading
Loading
Loading
@@ -59,7 +59,7 @@ module Gitlab
def import_wiki_repository
wiki_path = "#{project.disk_path}.wiki"
 
gitlab_shell.import_repository(project.repository_storage, wiki_path, wiki_url)
gitlab_shell.import_repository(project.repository_storage, wiki_path, wiki_url, project.full_path)
 
true
rescue Gitlab::Shell::Error => e
Loading
Loading
Loading
Loading
@@ -267,7 +267,7 @@ module Gitlab
def import_wiki
unless project.wiki.repository_exists?
wiki = WikiFormatter.new(project)
gitlab_shell.import_repository(project.repository_storage, wiki.disk_path, wiki.import_url)
gitlab_shell.import_repository(project.repository_storage, wiki.disk_path, wiki.import_url, project.wiki.full_path)
end
rescue Gitlab::Shell::Error => e
# GitHub error message when the wiki repo has not been created,
Loading
Loading
Loading
Loading
@@ -68,15 +68,16 @@ module Gitlab
#
# storage - the shard key
# name - project disk path
# gl_project_name - project name
#
# Ex.
# create_repository("default", "gitlab/gitlab-ci")
# create_repository("default", "path/to/gitlab-ci", "gitlab/gitlab-ci")
#
def create_repository(storage, name)
def create_repository(storage, name, gl_project_name)
relative_path = name.dup
relative_path << '.git' unless relative_path.end_with?('.git')
 
repository = Gitlab::Git::Repository.new(storage, relative_path, '')
repository = Gitlab::Git::Repository.new(storage, relative_path, '', gl_project_name)
wrapped_gitaly_errors { repository.gitaly_repository_client.create_repository }
 
true
Loading
Loading
@@ -94,13 +95,13 @@ module Gitlab
# Ex.
# import_repository("nfs-file06", "gitlab/gitlab-ci", "https://gitlab.com/gitlab-org/gitlab-test.git")
#
def import_repository(storage, name, url)
def import_repository(storage, name, url, gl_project_name)
if url.start_with?('.', '/')
raise Error.new("don't use disk paths with import_repository: #{url.inspect}")
end
 
relative_path = "#{name}.git"
cmd = GitalyGitlabProjects.new(storage, relative_path)
cmd = GitalyGitlabProjects.new(storage, relative_path, gl_project_name)
 
success = cmd.import_project(url, git_timeout)
raise Error, cmd.output unless success
Loading
Loading
@@ -132,11 +133,13 @@ module Gitlab
#
# Ex.
# fork_repository("nfs-file06", "gitlab/gitlab-ci", "nfs-file07", "new-namespace/gitlab-ci")
def fork_repository(forked_from_storage, forked_from_disk_path, forked_to_storage, forked_to_disk_path)
def fork_repository(
forked_from_storage, forked_from_disk_path, forked_from_project_name,
forked_to_storage, forked_to_disk_path, forked_to_project_name)
forked_from_relative_path = "#{forked_from_disk_path}.git"
fork_args = [forked_to_storage, "#{forked_to_disk_path}.git"]
fork_args = [forked_to_storage, "#{forked_to_disk_path}.git", forked_to_project_name]
 
GitalyGitlabProjects.new(forked_from_storage, forked_from_relative_path).fork_repository(*fork_args)
GitalyGitlabProjects.new(forked_from_storage, forked_from_relative_path, forked_from_project_name).fork_repository(*fork_args)
end
 
# Removes a repository from file system, using rm_diretory which is an alias
Loading
Loading
@@ -397,16 +400,17 @@ module Gitlab
end
 
class GitalyGitlabProjects
attr_reader :shard_name, :repository_relative_path, :output
attr_reader :shard_name, :repository_relative_path, :output, :gl_project_name
 
def initialize(shard_name, repository_relative_path)
def initialize(shard_name, repository_relative_path, gl_project_name)
@shard_name = shard_name
@repository_relative_path = repository_relative_path
@output = ''
@gl_project_name = gl_project_name
end
 
def import_project(source, _timeout)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil, gl_project_name)
 
Gitlab::GitalyClient::RepositoryService.new(raw_repository).import_repository(source)
true
Loading
Loading
@@ -415,9 +419,9 @@ module Gitlab
false
end
 
def fork_repository(new_shard_name, new_repository_relative_path)
target_repository = Gitlab::Git::Repository.new(new_shard_name, new_repository_relative_path, nil)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil)
def fork_repository(new_shard_name, new_repository_relative_path, new_project_name)
target_repository = Gitlab::Git::Repository.new(new_shard_name, new_repository_relative_path, nil, new_project_name)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil, gl_project_name)
 
Gitlab::GitalyClient::RepositoryService.new(target_repository).fork_repository(raw_repository)
rescue GRPC::BadStatus => e
Loading
Loading
Loading
Loading
@@ -61,7 +61,7 @@ describe ::Gitlab::BareRepositoryImport::Repository do
let(:wiki_path) { File.join(root_path, "#{hashed_path}.wiki.git") }
 
before do
gitlab_shell.create_repository(repository_storage, hashed_path)
gitlab_shell.create_repository(repository_storage, hashed_path, 'group/project')
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
repository = Rugged::Repository.new(repo_path)
repository.config['gitlab.fullpath'] = 'to/repo'
Loading
Loading
Loading
Loading
@@ -230,7 +230,8 @@ describe Gitlab::BitbucketImport::Importer do
expect(importer.gitlab_shell).to receive(:import_repository).with(
project.repository_storage,
project.wiki.disk_path,
project.import_url + '/wiki'
project.import_url + '/wiki',
project.full_path
)
 
importer.execute
Loading
Loading
Loading
Loading
@@ -2,7 +2,7 @@
require "spec_helper"
 
describe Gitlab::Git::Blame, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
let(:blame) do
Gitlab::Git::Blame.new(repository, SeedRepo::Commit::ID, "CONTRIBUTING.md")
end
Loading
Loading
Loading
Loading
@@ -3,7 +3,7 @@
require "spec_helper"
 
describe Gitlab::Git::Blob, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
let(:rugged) do
Rugged::Repository.new(File.join(TestEnv.repos_path, TEST_REPO_PATH))
end
Loading
Loading
require "spec_helper"
 
describe Gitlab::Git::Branch, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
let(:rugged) do
Rugged::Repository.new(File.join(TestEnv.repos_path, repository.relative_path))
end
Loading
Loading
@@ -64,7 +64,7 @@ describe Gitlab::Git::Branch, :seed_helper do
 
context 'with active, stale and future branches' do
let(:repository) do
Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '', 'group/project')
end
 
let(:user) { create(:user) }
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment