Add client methods for DisconnectGitAlternates rpc

DisconnectGitAlternates is a Gitaly RPC that will delete a repository's
objects/info/alternates file. This commit adds client support for that
RPC.
This commit is contained in:
John Cai 2019-04-30 21:45:19 -07:00
parent 206504008c
commit 0e033b3124
5 changed files with 86 additions and 3 deletions

View File

@ -922,6 +922,12 @@ module Gitlab
end end
end end
def disconnect_alternates
wrapped_gitaly_errors do
gitaly_repository_client.disconnect_alternates
end
end
def gitaly_repository def gitaly_repository
Gitlab::GitalyClient::Util.repository(@storage, @relative_path, @gl_repository, @gl_project_path) Gitlab::GitalyClient::Util.repository(@storage, @relative_path, @gl_repository, @gl_project_path)
end end

View File

@ -331,6 +331,14 @@ module Gitlab
search_results_from_response(response) search_results_from_response(response)
end end
def disconnect_alternates
request = Gitaly::DisconnectGitAlternatesRequest.new(
repository: @gitaly_repo
)
GitalyClient.call(@storage, :object_pool_service, :disconnect_git_alternates, request)
end
private private
def search_results_from_response(gitaly_response) def search_results_from_response(gitaly_response)

View File

@ -7,8 +7,6 @@ describe Gitlab::Git::ObjectPool do
let(:pool_repository) { create(:pool_repository) } let(:pool_repository) { create(:pool_repository) }
let(:source_repository) { pool_repository.source_project.repository } let(:source_repository) { pool_repository.source_project.repository }
let(:source_repository_path) { File.join(TestEnv.repos_path, source_repository.relative_path) }
let(:source_repository_rugged) { Rugged::Repository.new(source_repository_path) }
subject { pool_repository.object_pool } subject { pool_repository.object_pool }
@ -82,6 +80,8 @@ describe Gitlab::Git::ObjectPool do
end end
describe '#fetch' do describe '#fetch' do
let(:source_repository_path) { File.join(TestEnv.repos_path, source_repository.relative_path) }
let(:source_repository_rugged) { Rugged::Repository.new(source_repository_path) }
let(:commit_count) { source_repository.commit_count } let(:commit_count) { source_repository.commit_count }
context "when the object's pool repository exists" do context "when the object's pool repository exists" do
@ -98,7 +98,7 @@ describe Gitlab::Git::ObjectPool do
it "re-creates the object pool's repository" do it "re-creates the object pool's repository" do
subject.fetch subject.fetch
expect(subject.repository.exists?).to be(true) expect(subject.repository.exists?).to be true
end end
it 'does not raise an error' do it 'does not raise an error' do

View File

@ -2215,4 +2215,43 @@ describe Gitlab::Git::Repository, :seed_helper do
line.split("\t").last line.split("\t").last
end end
end end
describe '#disconnect_alternates' do
let(:project) { create(:project, :repository) }
let(:pool_repository) { create(:pool_repository) }
let(:repository) { project.repository }
let(:repository_path) { File.join(TestEnv.repos_path, repository.relative_path) }
let(:object_pool) { pool_repository.object_pool }
let(:object_pool_path) { File.join(TestEnv.repos_path, object_pool.repository.relative_path) }
let(:object_pool_rugged) { Rugged::Repository.new(object_pool_path) }
before do
object_pool.create
end
it 'does not raise an error when disconnecting a non-linked repository' do
expect { repository.disconnect_alternates }.not_to raise_error
end
it 'removes the alternates file' do
object_pool.link(repository)
alternates_file = File.join(repository_path, "objects", "info", "alternates")
expect(File.exist?(alternates_file)).to be_truthy
repository.disconnect_alternates
expect(File.exist?(alternates_file)).to be_falsey
end
it 'can still access objects in the object pool' do
object_pool.link(repository)
new_commit = new_commit_edit_old_file(object_pool_rugged)
expect(repository.commit(new_commit.oid).id).to eq(new_commit.oid)
repository.disconnect_alternates
expect(repository.commit(new_commit.oid).id).to eq(new_commit.oid)
end
end
end end

View File

@ -231,4 +231,34 @@ describe Gitlab::GitalyClient::RepositoryService do
client.raw_changes_between('deadbeef', 'deadpork') client.raw_changes_between('deadbeef', 'deadpork')
end end
end end
describe '#disconnect_alternates' do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
let(:repository_path) { File.join(TestEnv.repos_path, repository.relative_path) }
let(:pool_repository) { create(:pool_repository) }
let(:object_pool) { pool_repository.object_pool }
let(:object_pool_service) { Gitlab::GitalyClient::ObjectPoolService.new(object_pool) }
before do
object_pool_service.create(repository)
object_pool_service.link_repository(repository)
end
it 'deletes the alternates file' do
repository.disconnect_alternates
alternates_file = File.join(repository_path, "objects", "info", "alternates")
expect(File.exist?(alternates_file)).to be_falsey
end
context 'when called twice' do
it "doesn't raise an error" do
repository.disconnect_alternates
expect { repository.disconnect_alternates }.not_to raise_error
end
end
end
end end