diff --git a/jstests/sharding/repro.js b/jstests/sharding/repro.js new file mode 100644 index 0000000000..e99b36c053 --- /dev/null +++ b/jstests/sharding/repro.js @@ -0,0 +1,36 @@ +(function() { +'use strict'; +load('jstests/libs/fail_point_util.js'); + +const st = new ShardingTest({mongos: 1, shards: 3, rs: {nodes: 3}}); + +st.s.adminCommand({enableSharding: 'test', primaryShard: st.shard0.shardName}); + +st.s.adminCommand({shardCollection: 'test.foo', key: {Key: 1}}); + +let dropDBFp = configureFailPoint(st.rs0.getPrimary(), 'hangInDropDatabaseFirstPhase'); +let dropDBOpThread = new Thread((mongosConnString) => { + let mongos = new Mongo(mongosConnString); + mongos.getDB('test').dropDatabase(); +}, st.s0.host); + +dropDBOpThread.start(); + +dropDBFp.wait(); + +st.s.adminCommand({enableSharding: 'test', primaryShard: st.shard1.shardName}); + +st.s.adminCommand({shardCollection: 'test.foo', key: {Key: 1}}); + +st.s.getCollection('test.foo').insert({Key: 0}); +st.s.getCollection('test.foo').insert({Key: 1}); + +st.rs0.stepUp(st.rs0.getSecondary()); +st.rs0.awaitReplication(); +dropDBFp.off(); + +dropDBOpThread.join(); +assert.eq(2, st.s.getCollection('test.foo').countDocuments({})); + +st.stop(); +})(); diff --git a/src/mongo/db/s/drop_database_coordinator.cpp b/src/mongo/db/s/drop_database_coordinator.cpp index da974c9d1c..7f586588c5 100644 --- a/src/mongo/db/s/drop_database_coordinator.cpp +++ b/src/mongo/db/s/drop_database_coordinator.cpp @@ -45,6 +45,7 @@ #include "mongo/s/request_types/flush_database_cache_updates_gen.h" #include "mongo/s/request_types/sharded_ddl_commands_gen.h" +MONGO_FAIL_POINT_DEFINE(hangInDropDatabaseFirstPhase); namespace mongo { namespace { @@ -312,6 +313,10 @@ ExecutorFuture DropDatabaseCoordinator::_runImpl( removeDatabaseMetadataFromConfig( opCtx, _dbName, *metadata().getDatabaseVersion()); + + if (hangInDropDatabaseFirstPhase.shouldFail()) { + hangInDropDatabaseFirstPhase.pauseWhileSet(); + } } })) .then([this, executor = executor, anchor = shared_from_this()] {