Commit d42c0ecc authored by Sean McGivern's avatar Sean McGivern

Merge branch 'gitaly-fetch-internal-remote' into 'master'

Incorporate RemoteService.FetchInternalRemote Gitaly RPC

Closes gitaly#857

See merge request gitlab-org/gitlab-ce!16140
parents 4b081cc5 9ff44c29
...@@ -1163,23 +1163,13 @@ module Gitlab ...@@ -1163,23 +1163,13 @@ module Gitlab
end end
def fetch_repository_as_mirror(repository) def fetch_repository_as_mirror(repository)
remote_name = "tmp-#{SecureRandom.hex}" gitaly_migrate(:remote_fetch_internal_remote) do |is_enabled|
# Notice that this feature flag is not for `fetch_repository_as_mirror`
# as a whole but for the fetching mechanism (file path or gitaly-ssh).
url, env = gitaly_migrate(:fetch_internal) do |is_enabled|
if is_enabled if is_enabled
repository = RemoteRepository.new(repository) unless repository.is_a?(RemoteRepository) gitaly_remote_client.fetch_internal_remote(repository)
[GITALY_INTERNAL_URL, repository.fetch_env]
else else
[repository.path, nil] rugged_fetch_repository_as_mirror(repository)
end end
end end
add_remote(remote_name, url, mirror_refmap: :all_refs)
fetch_remote(remote_name, env: env)
ensure
remove_remote(remote_name)
end end
def blob_at(sha, path) def blob_at(sha, path)
...@@ -2070,6 +2060,16 @@ module Gitlab ...@@ -2070,6 +2060,16 @@ module Gitlab
false false
end end
def rugged_fetch_repository_as_mirror(repository)
remote_name = "tmp-#{SecureRandom.hex}"
repository = RemoteRepository.new(repository) unless repository.is_a?(RemoteRepository)
add_remote(remote_name, GITALY_INTERNAL_URL, mirror_refmap: :all_refs)
fetch_remote(remote_name, env: repository.fetch_env)
ensure
remove_remote(remote_name)
end
def fetch_remote(remote_name = 'origin', env: nil) def fetch_remote(remote_name = 'origin', env: nil)
run_git(['fetch', remote_name], env: env).last.zero? run_git(['fetch', remote_name], env: env).last.zero?
end end
......
...@@ -23,6 +23,19 @@ module Gitlab ...@@ -23,6 +23,19 @@ module Gitlab
response.result response.result
end end
def fetch_internal_remote(repository)
request = Gitaly::FetchInternalRemoteRequest.new(
repository: @gitaly_repo,
remote_repository: repository.gitaly_repository
)
response = GitalyClient.call(@storage, :remote_service,
:fetch_internal_remote, request,
remote_storage: repository.storage)
response.result
end
end end
end end
end end
...@@ -649,29 +649,39 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -649,29 +649,39 @@ describe Gitlab::Git::Repository, seed_helper: true do
Gitlab::Shell.new.remove_repository(storage_path, 'my_project') Gitlab::Shell.new.remove_repository(storage_path, 'my_project')
end end
it 'fetches a repository as a mirror remote' do shared_examples 'repository mirror fecthing' do
subject it 'fetches a repository as a mirror remote' do
subject
expect(refs(new_repository.path)).to eq(refs(repository.path)) expect(refs(new_repository.path)).to eq(refs(repository.path))
end end
context 'with keep-around refs' do context 'with keep-around refs' do
let(:sha) { SeedRepo::Commit::ID } let(:sha) { SeedRepo::Commit::ID }
let(:keep_around_ref) { "refs/keep-around/#{sha}" } let(:keep_around_ref) { "refs/keep-around/#{sha}" }
let(:tmp_ref) { "refs/tmp/#{SecureRandom.hex}" } let(:tmp_ref) { "refs/tmp/#{SecureRandom.hex}" }
before do before do
repository.rugged.references.create(keep_around_ref, sha, force: true) repository.rugged.references.create(keep_around_ref, sha, force: true)
repository.rugged.references.create(tmp_ref, sha, force: true) repository.rugged.references.create(tmp_ref, sha, force: true)
end end
it 'includes the temporary and keep-around refs' do it 'includes the temporary and keep-around refs' do
subject subject
expect(refs(new_repository.path)).to include(keep_around_ref) expect(refs(new_repository.path)).to include(keep_around_ref)
expect(refs(new_repository.path)).to include(tmp_ref) expect(refs(new_repository.path)).to include(tmp_ref)
end
end end
end end
context 'with gitaly enabled' do
it_behaves_like 'repository mirror fecthing'
end
context 'with gitaly enabled', :skip_gitaly_mock do
it_behaves_like 'repository mirror fecthing'
end
end end
describe '#remote_tags' do describe '#remote_tags' do
......
...@@ -31,4 +31,17 @@ describe Gitlab::GitalyClient::RemoteService do ...@@ -31,4 +31,17 @@ describe Gitlab::GitalyClient::RemoteService do
expect(client.remove_remote(remote_name)).to be(true) expect(client.remove_remote(remote_name)).to be(true)
end end
end end
describe '#fetch_internal_remote' do
let(:remote_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
it 'sends an fetch_internal_remote message and returns the result value' do
expect_any_instance_of(Gitaly::RemoteService::Stub)
.to receive(:fetch_internal_remote)
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
.and_return(double(result: true))
expect(client.fetch_internal_remote(remote_repository)).to be(true)
end
end
end end
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