diff --git a/jstests/sharding/create_with_draining_repro.js b/jstests/sharding/create_with_draining_repro.js
new file mode 100644
index 00000000000..054d89d1efa
--- /dev/null
+++ b/jstests/sharding/create_with_draining_repro.js
@@ -0,0 +1,82 @@
+import {configureFailPoint} from "jstests/libs/fail_point_util.js";
+import {funWithArgs} from "jstests/libs/parallel_shell_helpers.js";
+
+TestData.skipCheckingUUIDsConsistentAcrossCluster = true;
+TestData.skipCheckingIndexesConsistentAcrossCluster = true;
+TestData.skipCheckDBHashes = true;
+TestData.skipCheckOrphans = true;
+TestData.skipCheckShardFilteringMetadata = true;
+TestData.skipCheckMetadataConsistency = true;
+
+let st = new ShardingTest({shards: 2, other: {enableBalancer: false}});
+let dbName = "test";
+let collName = "coll";
+let ns = dbName + "." + collName;
+
+jsTest.log("Create the database on shard 0 to make it primary");
+assert.commandWorked(
+    st.s.adminCommand({enableSharding: dbName, primaryShard: st.shard0.shardName}));
+
+jsTest.log(
+    "Pause the create coordinator after it chooses the initial chunks and acquires the critical section on the recipient shards.");
+let createFP = configureFailPoint(st.rs0.getPrimary(), "pauseAfterCreatingCollectionOnAllShard");
+
+jsTest.log(
+    "Start sharding the collection with a hashed shard key (to make sure it puts a chunk on each shard).");
+const awaitShardCollection = startParallelShell(
+    funWithArgs(function(ns) {
+        assert.commandWorked(db.adminCommand({shardCollection: ns, key: {_id: "hashed"}}));
+    }, ns), st.s.port);
+
+jsTest.log("Wait to reach the correct point of the coordinator.");
+createFP.wait();
+
+jsTest.log("Pause remove shard after checking that there are no chunks left.");
+let removeFP = configureFailPoint(st.configRS.getPrimary(), "pauseAfterCheckingForRemainingChunks");
+
+jsTest.log("Start removing shard.");
+jsTest.log("1. Start draining.");
+assert.commandWorked(st.s.adminCommand({removeShard: st.shard1.shardName}));
+jsTest.log("2. Call the second time.");
+const awaitRemoveShard = startParallelShell(
+    funWithArgs(function(shardName) {
+        let res = assert.commandWorked(db.adminCommand({removeShard: shardName}));
+        assert.eq(res.state, 'completed');
+    }, st.shard1.shardName), st.s.port);
+
+jsTest.log("Wait to reach the correct point of the removeShard.");
+removeFP.wait();
+
+jsTest.log("Release the shard collection coordinator and wait for completion.");
+createFP.off();
+awaitShardCollection();
+
+jsTest.log("Insert some documents into the collection.");
+let bulk = st.s.getDB(dbName).getCollection(collName).initializeUnorderedBulkOp();
+const nDocs = 500;
+for (let i = -nDocs; i < nDocs; i++) {
+    bulk.insert({_id: i});
+}
+assert.commandWorked(bulk.execute());
+
+assert.eq(st.s.getDB(dbName).getCollection(collName).find().itcount(), nDocs * 2);
+
+jsTest.log("Release the removeShard and wait for completion.");
+removeFP.off();
+awaitRemoveShard();
+
+assert.eq(st.s.getDB(dbName).getCollection(collName).find().itcount(), nDocs * 2);
+jsTest.log("Check that all chunks are on existing shards");
+let shards = st.s.getDB("config").getCollection("shards").find().toArray();
+assert.eq(shards.length, 1);
+let collections =
+    st.s.getDB("config").getCollection("collections").find({_id: "test.coll"}).toArray();
+assert.eq(collections.length, 1);
+let chunks =
+    st.s.getDB("config").getCollection("chunks").find({uuid: collections[0].uuid}).toArray();
+
+chunks.forEach((chunk) => {
+    assert.eq(chunk.shard, shards[0]._id);
+});
+
+st.stop();
diff --git a/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp b/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp
index f447d740f89..745ac276119 100644
--- a/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp
+++ b/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp
@@ -168,6 +168,7 @@ MONGO_FAIL_POINT_DEFINE(hangAddShardBeforeUpdatingClusterCardinalityParameter);
 MONGO_FAIL_POINT_DEFINE(hangAfterDroppingDatabaseInTransitionToDedicatedConfigServer);
 MONGO_FAIL_POINT_DEFINE(skipUpdatingClusterCardinalityParameterAfterAddShard);
 MONGO_FAIL_POINT_DEFINE(skipUpdatingClusterCardinalityParameterAfterRemoveShard);
+MONGO_FAIL_POINT_DEFINE(pauseAfterCheckingForRemainingChunks);
 
 using CallbackHandle = executor::TaskExecutor::CallbackHandle;
 using CallbackArgs = executor::TaskExecutor::CallbackArgs;
@@ -1253,6 +1254,8 @@ RemoveShardProgress ShardingCatalogManager::removeShard(OperationContext* opCtx,
         }
     }
 
+    pauseAfterCheckingForRemainingChunks.pauseWhileSet();
+
     // Draining is done, now finish removing the shard.
     LOGV2(21949, "Going to remove shard", "shardId"_attr = name);
 
diff --git a/src/mongo/db/s/create_collection_coordinator.cpp b/src/mongo/db/s/create_collection_coordinator.cpp
index dba0bfbef71..dee6cc400ed 100644
--- a/src/mongo/db/s/create_collection_coordinator.cpp
+++ b/src/mongo/db/s/create_collection_coordinator.cpp
@@ -141,6 +141,7 @@
 #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kSharding
 MONGO_FAIL_POINT_DEFINE(failAtCommitCreateCollectionCoordinator);
 MONGO_FAIL_POINT_DEFINE(hangBeforeCommitOnShardingCatalog);
+MONGO_FAIL_POINT_DEFINE(pauseAfterCreatingCollectionOnAllShard);
 
 namespace mongo {
 
@@ -1322,6 +1323,7 @@ ExecutorFuture<void> CreateCollectionCoordinatorLegacy::_runImpl(
                                          std::make_move_iterator(involvedShards.end())},
                     nss());
 
+                pauseAfterCreatingCollectionOnAllShard.pauseWhileSet();
                 try {
                     generateCommitEventForChangeStreams(opCtx,
                                                         nss(),
@@ -1833,6 +1835,8 @@ void CreateCollectionCoordinator::_commitOnShardingCatalog(
         }
     }
 
+    pauseAfterCreatingCollectionOnAllShard.pauseWhileSet();
+
     std::set<ShardId> involvedShards;
     for (const auto& chunk : _initialChunks->chunks) {
         involvedShards.emplace(chunk.getShard());
