diff options
author | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2019-02-26 20:51:27 -0500 |
---|---|---|
committer | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2019-02-26 20:54:23 -0500 |
commit | 906df445b9b994dd2f8e5ae481400876412497b2 (patch) | |
tree | 085266f2f19126e225928f1d5e292630b0b2412c /jstests/replsets/secondary_as_sync_source.js | |
parent | a78f546ff0caab8c33738aa922a294d9143a5397 (diff) | |
download | mongo-906df445b9b994dd2f8e5ae481400876412497b2.tar.gz |
SERVER-39719 Ensure that a node performing an initial sync from a secondary with a in-progress index build creates the index before initial sync is done
Diffstat (limited to 'jstests/replsets/secondary_as_sync_source.js')
-rw-r--r-- | jstests/replsets/secondary_as_sync_source.js | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/jstests/replsets/secondary_as_sync_source.js b/jstests/replsets/secondary_as_sync_source.js new file mode 100644 index 00000000000..6f446842daa --- /dev/null +++ b/jstests/replsets/secondary_as_sync_source.js @@ -0,0 +1,88 @@ +/** + * Tests that a new replica set member performing an initial sync from a secondary node as the sync + * source, which has an in-progress index build will also build the index as part of the initial + * sync operation. + * @tags: [requires_replication] + */ +(function() { + 'use strict'; + + load("jstests/replsets/rslib.js"); + + const dbName = "test"; + const collName = "coll"; + + const firstIndexName = "_first"; + + function addTestDocuments(db) { + let size = 100; + jsTest.log("Creating " + size + " test documents."); + var bulk = db.getCollection(collName).initializeUnorderedBulkOp(); + for (var i = 0; i < size; ++i) { + bulk.insert({i: i}); + } + assert.writeOK(bulk.execute()); + } + + let replSet = new ReplSetTest({name: "indexBuilds", nodes: 2, useBridge: true}); + let nodes = replSet.nodeList(); + + replSet.startSet({startClean: true}); + replSet.initiate({ + _id: "indexBuilds", + members: [ + {_id: 0, host: nodes[0]}, + {_id: 1, host: nodes[1], votes: 0, priority: 0}, + ] + }); + + let primary = replSet.getPrimary(); + let primaryDB = primary.getDB(dbName); + + let secondary = replSet.getSecondary(); + let secondaryDB = secondary.getDB(dbName); + + addTestDocuments(primaryDB); + + jsTest.log("Hanging index builds on the secondary node"); + assert.commandWorked(secondaryDB.adminCommand( + {configureFailPoint: "hangAfterStartingIndexBuild", mode: "alwaysOn"})); + + jsTest.log("Beginning index build: " + firstIndexName); + assert.commandWorked(primaryDB.runCommand({ + createIndexes: collName, + indexes: [{key: {i: 1}, name: firstIndexName, background: true}], + writeConcern: {w: 2} + })); + + jsTest.log("Adding a new node to the replica set"); + let newNode = replSet.add({rsConfig: {votes: 0, priority: 0}}); + + // Ensure that the new node and primary cannot communicate to each other. + newNode.disconnect(primary); + + replSet.reInitiate(); + + // Wait for the new node to finish initial sync. + waitForState(newNode, ReplSetTest.State.SECONDARY); + + // Let the 'secondary' finish its index build. + jsTest.log("Removing index build hang on the secondary node to allow it to finish"); + assert.commandWorked( + secondaryDB.adminCommand({configureFailPoint: "hangAfterStartingIndexBuild", mode: "off"})); + + // Wait for the index builds to finish. + replSet.waitForAllIndexBuildsToFinish(dbName, collName); + jsTest.log("Checking if the indexes match between the new node and the secondary node"); + + let newNodeDB = newNode.getDB(dbName); + jsTest.log("New nodes indexes:"); + printjson(newNodeDB.getCollection(collName).getIndexes()); + jsTest.log("Secondary nodes indexes:"); + printjson(secondaryDB.getCollection(collName).getIndexes()); + + assert.eq(newNodeDB.getCollection(collName).getIndexes().length, + secondaryDB.getCollection(collName).getIndexes().length); + + replSet.stopSet(); +})(); |