diff --git a/app/models/pool_repository.rb b/app/models/pool_repository.rb index 7d043bae91cec33acaf3d6dbc386a4b7c8068c1d..f655cd8ba7377b2dd2433dd2582e3d471c255e1e 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 ae2bb5af2b162b45cb014741e101b9d2b30139c3..3a28a6679e30722575334aab6d209c3465041436 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 573cb3413f5ae2318e9453b56f90a42bff7f1c4f..1e6bf1bf71b260dccaf0582422f9c1cf75976a04 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