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