From cd5c559d81fcbeed4781666eea23ff88624e52a6 Mon Sep 17 00:00:00 2001 From: James Fargher Date: Fri, 5 Jul 2024 16:24:48 +1200 Subject: [PATCH] Ignore object pool already exists creation errors Changelog: fixed --- app/models/pool_repository.rb | 7 ++++++ .../gitaly_client/object_pool_service_spec.rb | 23 +++++++++++-------- .../workers/object_pool/create_worker_spec.rb | 10 ++++---- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/models/pool_repository.rb b/app/models/pool_repository.rb index 7d043bae91cec3..f655cd8ba7377b 100644 --- a/app/models/pool_repository.rb +++ b/app/models/pool_repository.rb @@ -75,6 +75,13 @@ def joinable? def create_object_pool object_pool.create + rescue GRPC::AlreadyExists + # The object pool already exists. Nothing to do here. + rescue GRPC::FailedPrecondition => e + # This rescue is temporary until gitaly returns the correct error code for + # "repo exists already". Gitaly error messages are not guaranteed to match + # and so should not typically be used to determine error type. + raise unless e.message.include?('repository exists already') end # The members of the pool should have fetched the missing objects to their own diff --git a/spec/lib/gitlab/gitaly_client/object_pool_service_spec.rb b/spec/lib/gitlab/gitaly_client/object_pool_service_spec.rb index ae2bb5af2b162b..3a28a6679e3072 100644 --- a/spec/lib/gitlab/gitaly_client/object_pool_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/object_pool_service_spec.rb @@ -11,20 +11,23 @@ subject { described_class.new(object_pool) } before do - subject.create(raw_repository) # rubocop:disable Rails/SaveBang + subject.create(raw_repository) # rubocop:disable Rails/SaveBang -- This is a gitaly call + ::Gitlab::GitalyClient.clear_stubs! end describe '#create' do - it 'exists on disk' do - expect(object_pool.repository.exists?).to be(true) - end - - context 'when the pool already exists' do - it 'returns an error' do - expect do - subject.create(raw_repository) # rubocop:disable Rails/SaveBang - end.to raise_error(GRPC::FailedPrecondition) + it 'sends a create_object_pool message' do + expected_request = Gitaly::CreateObjectPoolRequest.new( + object_pool: object_pool.gitaly_object_pool, + origin: raw_repository.gitaly_repository) + + expect_next_instance_of(Gitaly::ObjectPoolService::Stub) do |stub| + expect(stub) + .to receive(:create_object_pool) + .with(expected_request, kind_of(Hash)) end + + subject.create(raw_repository) # rubocop:disable Rails/SaveBang -- This is a gitaly call end end diff --git a/spec/workers/object_pool/create_worker_spec.rb b/spec/workers/object_pool/create_worker_spec.rb index 573cb3413f5ae2..1e6bf1bf71b260 100644 --- a/spec/workers/object_pool/create_worker_spec.rb +++ b/spec/workers/object_pool/create_worker_spec.rb @@ -21,12 +21,10 @@ pool.create_object_pool end - it 'cleans up the pool' do - expect do - subject.perform(pool.id) - end.to raise_error(GRPC::FailedPrecondition) + it 'marks the pool as ready' do + subject.perform(pool.id) - expect(pool.reload.failed?).to be(true) + expect(pool.reload).to be_ready end end @@ -40,7 +38,7 @@ subject.perform(pool.id) end.to raise_error(GRPC::Internal) - expect(pool.reload.failed?).to be(true) + expect(pool.reload).to be_failed end end -- GitLab