diff options
-rw-r--r-- | jstests/sharding/migration_critical_section_concurrency.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/jstests/sharding/migration_critical_section_concurrency.js b/jstests/sharding/migration_critical_section_concurrency.js new file mode 100644 index 00000000000..059d6a0e32e --- /dev/null +++ b/jstests/sharding/migration_critical_section_concurrency.js @@ -0,0 +1,63 @@ +// This test ensures that if one collection is its migration critical section, this won't stall +// operations for other sharded or unsharded collections + +load('./jstests/libs/chunk_manipulation_util.js'); + +(function() { + 'use strict'; + + var staticMongod = MongoRunner.runMongod({}); // For startParallelOps. + + var st = new ShardingTest({mongos: 1, shards: 2}); + assert.commandWorked(st.s0.adminCommand({enableSharding: 'TestDB'})); + st.ensurePrimaryShard('TestDB', st.shard0.shardName); + + var testDB = st.s0.getDB('TestDB'); + + assert.commandWorked(st.s0.adminCommand({shardCollection: 'TestDB.Coll0', key: {Key: 1}})); + assert.commandWorked(st.s0.adminCommand({split: 'TestDB.Coll0', middle: {Key: 0}})); + + var coll0 = testDB.Coll0; + assert.writeOK(coll0.insert({Key: -1, Value: '-1'})); + assert.writeOK(coll0.insert({Key: 1, Value: '1'})); + + assert.commandWorked(st.s0.adminCommand({shardCollection: 'TestDB.Coll1', key: {Key: 1}})); + assert.commandWorked(st.s0.adminCommand({split: 'TestDB.Coll1', middle: {Key: 0}})); + + var coll1 = testDB.Coll1; + assert.writeOK(coll1.insert({Key: -1, Value: '-1'})); + assert.writeOK(coll1.insert({Key: 1, Value: '1'})); + + // Ensure that coll0 has chunks on both shards so we can test queries against both donor and + // recipient for Coll1's migration below + assert.commandWorked( + st.s0.adminCommand({moveChunk: 'TestDB.Coll0', find: {Key: 1}, to: st.shard1.shardName})); + + // Pause the move chunk operation in the critical section + pauseMigrateAtStep(st.shard1, migrateStepNames.done); + var joinMoveChunk = moveChunkParallel( + staticMongod, st.s0.host, {Key: 1}, null, 'TestDB.Coll1', st.shard1.shardName); + + // Wait till the donor reaches the critical section + waitForMoveChunkStep(st.shard0, moveChunkStepNames.reachedSteadyState); + + // Ensure that operations for 'Coll0' are not stalled + assert.eq(1, coll0.find({Key: {$lte: -1}}).maxTimeMS(5000).itcount()); + assert.eq(1, coll0.find({Key: {$gte: 1}}).maxTimeMS(5000).itcount()); + assert.writeOK(coll0.insert({Key: -2, Value: '-2'}, {writeConcern: {wtimeout: 5000}})); + assert.writeOK(coll0.insert({Key: 2, Value: '2'}, {writeConcern: {wtimeout: 5000}})); + assert.eq(2, coll0.find({Key: {$lte: -1}}).maxTimeMS(5000).itcount()); + assert.eq(2, coll0.find({Key: {$gte: 1}}).maxTimeMS(5000).itcount()); + + // Ensure that operations for non-sharded collections are not stalled + var collUnsharded = testDB.CollUnsharded; + assert.eq(0, collUnsharded.find({}).maxTimeMS(5000).itcount()); + assert.writeOK( + collUnsharded.insert({TestKey: 0, Value: 'Zero'}, {writeConcern: {wtimeout: 5000}})); + assert.eq(1, collUnsharded.find({}).maxTimeMS(5000).itcount()); + + unpauseMigrateAtStep(st.shard1, migrateStepNames.done); + joinMoveChunk(); + + st.stop(); +})(); |