summaryrefslogtreecommitdiff
path: root/jstests/replsets/rollback_during_upgrade.js
diff options
context:
space:
mode:
authorJudah Schvimer <judah@mongodb.com>2017-11-07 16:11:52 -0500
committerJudah Schvimer <judah@mongodb.com>2017-11-08 16:38:22 -0500
commit26a5d0070ba4a4b9f7e9a5b68f58a0fa75f9e6d3 (patch)
tree0739316b39c935ae58fb64cf038eac457b2226b9 /jstests/replsets/rollback_during_upgrade.js
parent68035d80f3b382e591fa381ee44550d920a6d432 (diff)
downloadmongo-26a5d0070ba4a4b9f7e9a5b68f58a0fa75f9e6d3.tar.gz
SERVER-31805 provide option to Cloner to preserve UUIDs
Diffstat (limited to 'jstests/replsets/rollback_during_upgrade.js')
-rw-r--r--jstests/replsets/rollback_during_upgrade.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/jstests/replsets/rollback_during_upgrade.js b/jstests/replsets/rollback_during_upgrade.js
new file mode 100644
index 00000000000..a264acd112a
--- /dev/null
+++ b/jstests/replsets/rollback_during_upgrade.js
@@ -0,0 +1,77 @@
+/**
+ * Test that rollback via refetch with no UUID support succeeds during upgrade. This runs various
+ * ddl commands that are expected to cause different UUID conflicts among the two nodes.
+ */
+
+(function() {
+ 'use strict';
+
+ load('jstests/replsets/libs/rollback_test.js');
+
+ const testName = 'rollback_during_upgrade';
+ const dbName = testName;
+
+ // Set up Rollback Test.
+ let rollbackTest = new RollbackTest(testName);
+
+ let rollbackNode = rollbackTest.getPrimary();
+ let syncSourceNode = rollbackTest.getSecondary();
+
+ // Begin in fCV 3.4.
+ assert.commandWorked(rollbackNode.adminCommand({setFeatureCompatibilityVersion: '3.4'}));
+
+ // Create some collections.
+ assert.writeOK(rollbackNode.getDB(dbName)['tToDropIndexes'].insert({t: 5}));
+ assert.commandWorked(rollbackNode.getDB(dbName)['tToDropIndexes'].createIndex({t: 1}));
+
+ // Stop upgrade in the middle of the collMod section.
+ assert.commandWorked(rollbackNode.adminCommand({
+ configureFailPoint: 'hangBeforeDatabaseUpgrade',
+ data: {database: dbName},
+ mode: 'alwaysOn'
+ }));
+
+ // Upgrade the cluster in the background.
+ let upgradeFn = function() {
+ jsTestLog('Upgrading replica set');
+ let adminDB = db.getSiblingDB('admin');
+ try {
+ adminDB.runCommand({setFeatureCompatibilityVersion: '3.6'});
+ } catch (e) {
+ if (!isNetworkError(e)) {
+ throw e;
+ }
+ print("Upgrading set threw expected network error: " + tojson(e));
+ }
+ };
+ let waitForUpgradeToFinish = startParallelShell(upgradeFn, rollbackNode.port);
+
+ checkLog.contains(rollbackNode, 'collMod - hangBeforeDatabaseUpgrade fail point enabled');
+
+ // ----------------- Begins running operations only on the rollback node ------------------
+ rollbackTest.transitionToRollbackOperations();
+
+ // Allow the upgrade to complete the collMod section.
+ assert.commandWorked(
+ rollbackNode.adminCommand({configureFailPoint: 'hangBeforeDatabaseUpgrade', mode: 'off'}));
+
+ // Tests that collections synced due to dropIndexes commands are cloned correctly.
+ assert.commandWorked(rollbackNode.getDB(dbName)['tToDropIndexes'].dropIndexes());
+
+ // ----------------- Begins running operations only on the sync source node ---------------
+ rollbackTest.transitionToSyncSourceOperations();
+
+ // Fake giving the collections UUIDs.
+ assert.commandWorked(syncSourceNode.getDB(dbName).runCommand({
+ applyOps: [
+ {op: 'c', ns: dbName + '.$cmd', ui: UUID(), o: {collMod: 'tToDropIndexes'}},
+ ]
+ }));
+
+ // ----------------- Allows rollback to occur and checks for consistency ------------------
+ rollbackTest.transitionToSteadyStateOperations({waitForRollback: true});
+
+ waitForUpgradeToFinish();
+
+ rollbackTest.stop();
+})();