Commit e03602e0 authored by Zeger-Jan van de Weg's avatar Zeger-Jan van de Weg

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.
parent 94d05e3c
...@@ -2039,6 +2039,10 @@ class Project < ActiveRecord::Base ...@@ -2039,6 +2039,10 @@ class Project < ActiveRecord::Base
pool_repository&.unlink_repository(repository) && update_column(:pool_repository_id, nil) pool_repository&.unlink_repository(repository) && update_column(:pool_repository_id, nil)
end end
def link_pool_repository
pool_repository&.link_repository(repository)
end
private private
def merge_requests_allowing_collaboration(source_branch = nil) def merge_requests_allowing_collaboration(source_branch = nil)
......
...@@ -23,6 +23,7 @@ class GitGarbageCollectWorker ...@@ -23,6 +23,7 @@ class GitGarbageCollectWorker
end end
task = task.to_sym task = task.to_sym
project.link_pool_repository
gitaly_call(task, project.repository.raw_repository) gitaly_call(task, project.repository.raw_repository)
# Refresh the branch cache in case garbage collection caused a ref lookup to fail # Refresh the branch cache in case garbage collection caused a ref lookup to fail
......
...@@ -5,14 +5,13 @@ module ObjectPool ...@@ -5,14 +5,13 @@ module ObjectPool
include ApplicationWorker include ApplicationWorker
include ObjectPoolQueue include ObjectPoolQueue
def perform(pool_id, project_id) # The use of pool id is deprecated. Keeping the argument allows old jobs to
pool = PoolRepository.find_by_id(pool_id) # still be performed.
return unless pool&.joinable? def perform(_pool_id, project_id)
project = Project.find_by_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 Projects::HousekeepingService.new(project).execute
end end
......
...@@ -71,6 +71,17 @@ describe GitGarbageCollectWorker do ...@@ -71,6 +71,17 @@ describe GitGarbageCollectWorker do
subject.perform(project.id) subject.perform(project.id)
end 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 end
context 'when no lease can be obtained' do context 'when no lease can be obtained' do
......
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