Ensure pool participants are linked before GC

In theory the case could happen that the initial linking of the pool
fails and so do all the retries that Sidekiq performs. This could lead
to data loss.

To prevent that case, linking is done before Gits GC too. This makes
sure that case doesn't happen.
This commit is contained in:
Zeger-Jan van de Weg 2019-01-08 13:02:58 +01:00
parent 94d05e3c5c
commit e03602e09d
No known key found for this signature in database
GPG key ID: 65F6A8D64A88ABAC
4 changed files with 21 additions and 6 deletions

View file

@ -2039,6 +2039,10 @@ class Project < ActiveRecord::Base
pool_repository&.unlink_repository(repository) && update_column(:pool_repository_id, nil)
end
def link_pool_repository
pool_repository&.link_repository(repository)
end
private
def merge_requests_allowing_collaboration(source_branch = nil)

View file

@ -23,6 +23,7 @@ class GitGarbageCollectWorker
end
task = task.to_sym
project.link_pool_repository
gitaly_call(task, project.repository.raw_repository)
# Refresh the branch cache in case garbage collection caused a ref lookup to fail

View file

@ -5,14 +5,13 @@ module ObjectPool
include ApplicationWorker
include ObjectPoolQueue
def perform(pool_id, project_id)
pool = PoolRepository.find_by_id(pool_id)
return unless pool&.joinable?
# The use of pool id is deprecated. Keeping the argument allows old jobs to
# still be performed.
def perform(_pool_id, project_id)
project = Project.find_by_id(project_id)
return unless project
return unless project&.pool_repository&.joinable?
pool.link_repository(project.repository)
project.link_pool_repository
Projects::HousekeepingService.new(project).execute
end

View file

@ -71,6 +71,17 @@ describe GitGarbageCollectWorker do
subject.perform(project.id)
end
context 'when the repository has joined a pool' do
let!(:pool) { create(:pool_repository, :ready) }
let(:project) { pool.source_project }
it 'ensures the repositories are linked' do
expect_any_instance_of(PoolRepository).to receive(:link_repository).once
subject.perform(project.id)
end
end
end
context 'when no lease can be obtained' do