Files
mongo/jstests/multiVersion/server-23299-1.js
Andy Schwerin 56a903eb64 SERVER-23299 Add an arbiter to server-23299-1.js test, to remove flaky behavior.
The multiversion suite's replica set upgrade logic expects sets to have
at least three nodes. Add an arbiter so this test can use said upgrade logic
reliably.
2016-04-13 09:54:20 -04:00

92 lines
3.2 KiB
JavaScript

/**
* This test confirms the correct implementation of SERVER-23299. Due
* to a bug fixed as SERVER-23274, replica set secondaries sometimes
* fail to clear the "temp" flag on collections that have been renamed
* as a means of marking the collection as permanent. This
* particularly happens with collections created by the $out
* aggregation stage, in versions 3.2.0 through 3.2.1.
*
* This test creates a collection using $out in 3.2.1, confirms that
* the collection gets incorrectly deleted on secondary failover, then
* confirms that if the user upgrades from 3.2.1 to latest before a
* failover, then a collection produced with $out in 3.2.1 is not
* deleted.
*/
load('./jstests/multiVersion/libs/multi_rs.js');
(function() {
"use strict";
var oldVersion = "3.2.1";
var newVersion = "latest";
var ex;
function getTestDbForNode(node) {
return node.getDB("test");
}
function expectTargetCollectionSize(node, sz) {
assert.eq(sz, getTestDbForNode(node).target.find().itcount(), "On node " + node.host);
}
var rst = new ReplSetTest({nodes: [{}, {}, {arbiter: true}]});
rst.startSet({binVersion: oldVersion});
rst.initiate();
var n0 = rst.getPrimary();
assert.writeOK(getTestDbForNode(n0).source.insert({_id: 0}));
jsTest.log("Performing aggregation to create target collection on " + n0.host);
getTestDbForNode(n0).source.aggregate({$out: "target"});
expectTargetCollectionSize(n0, 1);
rst.awaitReplication();
expectTargetCollectionSize(rst.getSecondary(), 1);
jsTest.log("Stepping down " + n0.host);
try {
n0.adminCommand({replSetStepDown: 1200});
} catch (ex) {
assert(tojson(ex).includes(
"network error while attempting to run command 'replSetStepDown' on host"),
tojson(ex));
}
var n1 = rst.getPrimary();
jsTest.log("Confirming that SERVER-23274 is present in " + oldVersion);
assert.neq(
n1.host, n0.host, "Failed to switch primary to other node in set away from " + n1.host);
expectTargetCollectionSize(n1, 0);
rst.awaitReplication();
expectTargetCollectionSize(n0, 0);
jsTest.log("Performing aggregation to create target collection on " + n1.host);
getTestDbForNode(n1).source.aggregate({$out: "target"});
expectTargetCollectionSize(n1, 1);
rst.awaitReplication();
expectTargetCollectionSize(n0, 1);
rst.upgradeSet({binVersion: "latest"});
n1 = rst.getPrimary();
n0 = rst.getSecondary();
jsTest.log("Confirming that target collection remained after upgrade");
expectTargetCollectionSize(n1, 1);
expectTargetCollectionSize(n0, 1);
jsTest.log("Confirming that target collection remained after switching primaries");
jsTest.log("Stepping down " + n0.host);
try {
n1.adminCommand({replSetStepDown: 1200});
} catch (ex) {
assert(tojson(ex).includes(
"network error while attempting to run command 'replSetStepDown' on host"),
tojson(ex));
}
var n0 = rst.getPrimary();
assert.neq(
n1.host, n0.host, "Failed to switch primary to other node in set away from " + n1.host);
expectTargetCollectionSize(n1, 1);
expectTargetCollectionSize(n0, 1);
}());