Merge branch 'gitaly-update-remote-mirror' into 'master'

Incorporate Gitaly's RemoteService.UpdateRemoteMirror RPC

Closes gitaly#936

See merge request gitlab-org/gitlab-ce!16536
This commit is contained in:
Rémy Coutable 2018-01-23 09:35:29 +00:00
commit ae1358e483
3 changed files with 60 additions and 5 deletions

View file

@ -6,7 +6,23 @@ module Gitlab
@ref_name = ref_name
end
def update(only_branches_matching: [], only_tags_matching: [])
def update(only_branches_matching: [])
@repository.gitaly_migrate(:remote_update_remote_mirror) do |is_enabled|
if is_enabled
gitaly_update(only_branches_matching)
else
rugged_update(only_branches_matching)
end
end
end
private
def gitaly_update(only_branches_matching)
@repository.gitaly_remote_client.update_remote_mirror(@ref_name, only_branches_matching)
end
def rugged_update(only_branches_matching)
local_branches = refs_obj(@repository.local_branches, only_refs_matching: only_branches_matching)
remote_branches = refs_obj(@repository.remote_branches(@ref_name), only_refs_matching: only_branches_matching)
@ -15,8 +31,8 @@ module Gitlab
delete_refs(local_branches, remote_branches)
local_tags = refs_obj(@repository.tags, only_refs_matching: only_tags_matching)
remote_tags = refs_obj(@repository.remote_tags(@ref_name), only_refs_matching: only_tags_matching)
local_tags = refs_obj(@repository.tags)
remote_tags = refs_obj(@repository.remote_tags(@ref_name))
updated_tags = changed_refs(local_tags, remote_tags)
@repository.push_remote_branches(@ref_name, updated_tags.keys) if updated_tags.present?
@ -24,8 +40,6 @@ module Gitlab
delete_refs(local_tags, remote_tags)
end
private
def refs_obj(refs, only_refs_matching: [])
refs.each_with_object({}) do |ref, refs|
next if only_refs_matching.present? && !only_refs_matching.include?(ref.name)

View file

@ -1,6 +1,8 @@
module Gitlab
module GitalyClient
class RemoteService
MAX_MSG_SIZE = 128.kilobytes.freeze
def initialize(repository)
@repository = repository
@gitaly_repo = repository.gitaly_repository
@ -38,6 +40,31 @@ module Gitlab
response.result
end
def update_remote_mirror(ref_name, only_branches_matching)
req_enum = Enumerator.new do |y|
y.yield Gitaly::UpdateRemoteMirrorRequest.new(
repository: @gitaly_repo,
ref_name: ref_name
)
current_size = 0
slices = only_branches_matching.slice_before do |branch_name|
current_size += branch_name.bytesize
next false if current_size < MAX_MSG_SIZE
current_size = 0
end
slices.each do |slice|
y.yield Gitaly::UpdateRemoteMirrorRequest.new(only_branches_matching: slice)
end
end
GitalyClient.call(@storage, :remote_service, :update_remote_mirror, req_enum)
end
end
end
end

View file

@ -44,4 +44,18 @@ describe Gitlab::GitalyClient::RemoteService do
expect(client.fetch_internal_remote(remote_repository)).to be(true)
end
end
describe '#update_remote_mirror' do
let(:ref_name) { 'remote_mirror_1' }
let(:only_branches_matching) { ['my-branch', 'master'] }
it 'sends an update_remote_mirror message' do
expect_any_instance_of(Gitaly::RemoteService::Stub)
.to receive(:update_remote_mirror)
.with(kind_of(Enumerator), kind_of(Hash))
.and_return(double(:update_remote_mirror_response))
client.update_remote_mirror(ref_name, only_branches_matching)
end
end
end