diff options
author | Misha Tyulenev <misha.tyulenev@mongodb.com> | 2020-06-30 02:10:05 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-13 00:17:26 +0000 |
commit | 48254674d3a9296fb03a95a6fa95a799adb463bb (patch) | |
tree | dcd0ab5a7fd1b4dab1b986a28a27da96ded8295f /jstests | |
parent | d1358462a5caea370c6b46d370a3ab5f634e6e17 (diff) | |
download | mongo-48254674d3a9296fb03a95a6fa95a799adb463bb.tar.gz |
SERVER-49087 add support for testing MovePrimaryInProgress
(cherry picked from commit 71af4d277cfcc7c846c9007620b147b53d6f8bf0)
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/sharding/move_primary_with_writes.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/jstests/sharding/move_primary_with_writes.js b/jstests/sharding/move_primary_with_writes.js new file mode 100644 index 00000000000..d7458e2359d --- /dev/null +++ b/jstests/sharding/move_primary_with_writes.js @@ -0,0 +1,103 @@ +/** + * The failpoints used here are not defined in the previous release (4.4). + * @tags: [multiversion_incompatible] + */ +(function() { +'use strict'; + +load('jstests/sharding/libs/sharded_transactions_helpers.js'); + +let st = new ShardingTest({ + mongos: 2, + shards: 2, +}); + +const dbName = "testdb"; + +function validateCollections() { + assert.eq(3, db.unshardedFoo.count()); + assert.eq(3, db.shardedBar.count()); +} + +function createCollections() { + assert.commandWorked(st.getDB(dbName).runCommand({dropDatabase: 1})); + let db = st.getDB(dbName); + + const unshardedFooIndexes = [{key: {a: 1}, name: 'fooIndex'}]; + const shardedBarIndexes = [{key: {a: 1}, name: 'barIndex'}]; + + assert.commandWorked(st.s.adminCommand({enableSharding: dbName})); + assert.commandWorked(st.s.adminCommand({movePrimary: dbName, to: st.shard0.shardName})); + + assert.commandWorked(db.createCollection('unshardedFoo')); + assert.commandWorked(db.createCollection('shardedBar')); + + for (let i = 0; i < 3; i++) { + assert.commandWorked(db.unshardedFoo.insert({a: i})); + assert.commandWorked(db.shardedBar.insert({a: i})); + } + + assert.commandWorked( + db.runCommand({createIndexes: 'unshardedFoo', indexes: unshardedFooIndexes})); + assert.commandWorked(db.runCommand({createIndexes: 'shardedBar', indexes: shardedBarIndexes})); + + assert.commandWorked(db.adminCommand({enableSharding: dbName})); + assert.commandWorked(db.adminCommand({shardCollection: dbName + '.shardedBar', key: {_id: 1}})); +} + +// start move primary and hang during cloneCatalog +// failViaMongos indicates if mongos can get an up to date routing info +function testMovePrimary(failpoint, fromShard, toShard, coll, shouldFail) { + let codeToRunInParallelShell = '{ db.getSiblingDB("admin").runCommand({movePrimary: "' + + dbName + '", to: "' + toShard.name + '"}); }'; + + assert.commandWorked(fromShard.adminCommand({configureFailPoint: failpoint, mode: 'alwaysOn'})); + + let awaitShell = startParallelShell(codeToRunInParallelShell, st.s.port); + + jsTestLog("Waiting for failpoint " + failpoint); + waitForFailpoint("Hit " + failpoint, 1); + clearRawMongoProgramOutput(); + + // Test DML + jsTestLog("Before insert"); + if (shouldFail) { + assert.commandFailedWithCode(coll.insert({a: 10}), ErrorCodes.MovePrimaryInProgress); + } else { + assert.commandWorked(coll.insert({a: 10})); + } + + jsTestLog("Before update"); + if (shouldFail) { + assert.commandFailedWithCode(coll.update({a: 1}, {$set: {a: 10}}), + ErrorCodes.MovePrimaryInProgress); + } else { + assert.commandWorked(coll.update({a: 11}, {$set: {a: 11}})); + } + + jsTestLog("Before remove"); + if (shouldFail) { + assert.commandFailedWithCode(coll.remove({a: 1}), ErrorCodes.MovePrimaryInProgress); + } else { + assert.commandWorked(coll.remove({a: 11})); + } + + assert.commandWorked(fromShard.adminCommand({configureFailPoint: failpoint, mode: 'off'})); + + awaitShell(); +} + +createCollections(); +let fromShard = st.getPrimaryShard(dbName); +let toShard = st.getOther(fromShard); + +testMovePrimary('hangInCloneStage', fromShard, toShard, fromShard.getDB(dbName).shardedBar, false); + +createCollections(); +fromShard = st.getPrimaryShard(dbName); +toShard = st.getOther(fromShard); +testMovePrimary( + 'hangInCleanStaleDataStage', fromShard, toShard, fromShard.getDB(dbName).shardedBar, false); + +st.stop(); +})(); |