diff --git a/jstests/sharding/bf-28646.js b/jstests/sharding/bf-28646.js new file mode 100644 index 00000000000..67124ecb850 --- /dev/null +++ b/jstests/sharding/bf-28646.js @@ -0,0 +1,45 @@ +(function() { +'use strict'; + +load('jstests/libs/fail_point_util.js'); +load('jstests/libs/parallel_shell_helpers.js'); + +const dbName = 'test'; +const collName = 'foo'; +const ns = dbName + '.' + collName; + +const st = new ShardingTest({mongos: 1, shards: 2}); + +st.adminCommand({enableSharding: dbName, primaryShard: st.shard0.shardName}); +st.adminCommand({shardCollection: ns, key: {x: 1}}); + +// Set the 'hangBeforeSendingCommitDecision' failpoint on shard0. +let fp = configureFailPoint(st.rs0.getPrimary(), 'hangBeforeSendingCommitDecision'); + +// In a parallel shell, move a chunk to shard1. +let awaitShell = startParallelShell(funWithArgs(function(ns, toShard) { + db.adminCommand({moveChunk: ns, find: {x: 0}, to: toShard}); + }, ns, st.shard1.shardName), st.s.port); + +// Wait for the failpoint to be hit. +fp.wait(); +jsTest.log("XXXX Hit fp"); + +// Stepdown shard0 primary with force +let shard0primary = st.rs0.getPrimary(); +assert.commandWorked(shard0primary.adminCommand({replSetStepDown: 5, force: true})); +jsTest.log("XXXX Stepped down shard0 primary"); + +// Wait for it to step up again. +assert.soon(() => shard0primary.host === shard0primary.adminCommand('isMaster').primary); +jsTest.log("XXXX Shard0 stepping up again"); + +// Unset the failpoint +jsTest.log("XXXX Unsetting the failpoint"); +fp.off(); + +// Wait for the moveChunk to complete. +awaitShell(); + +st.stop(); +})();