The shell should attach the logical session used to initiate cursors (via find or aggregate) and use it for successive getMores.
105 lines
3.7 KiB
JavaScript
105 lines
3.7 KiB
JavaScript
// SERVER-10927
|
|
// This is to make sure that temp collections get cleaned up on promotion to primary
|
|
|
|
var replTest = new ReplSetTest({name: 'testSet', nodes: 3});
|
|
var nodes = replTest.nodeList();
|
|
printjson(nodes);
|
|
|
|
// We need an arbiter to ensure that the primary doesn't step down when we restart the secondary
|
|
replTest.startSet();
|
|
replTest.initiate({
|
|
"_id": "testSet",
|
|
"members": [
|
|
{"_id": 0, "host": nodes[0]},
|
|
{"_id": 1, "host": nodes[1]},
|
|
{"_id": 2, "host": nodes[2], "arbiterOnly": true}
|
|
]
|
|
});
|
|
|
|
var master = replTest.getPrimary();
|
|
var second = replTest.getSecondary();
|
|
|
|
var masterId = replTest.getNodeId(master);
|
|
var secondId = replTest.getNodeId(second);
|
|
|
|
var masterDB = master.getDB('test');
|
|
var secondDB = second.getDB('test');
|
|
|
|
// set up collections
|
|
masterDB.runCommand({create: 'temp1', temp: true});
|
|
masterDB.temp1.ensureIndex({x: 1});
|
|
masterDB.runCommand({create: 'temp2', temp: 1});
|
|
masterDB.temp2.ensureIndex({x: 1});
|
|
masterDB.runCommand({create: 'keep1', temp: false});
|
|
masterDB.runCommand({create: 'keep2', temp: 0});
|
|
masterDB.runCommand({create: 'keep3'});
|
|
assert.writeOK(masterDB.keep4.insert({}, {writeConcern: {w: 2}}));
|
|
|
|
// make sure they exist on primary and secondary
|
|
function countCollection(mydb, nameFilter) {
|
|
var result = mydb.runCommand("listCollections", {filter: {name: nameFilter}});
|
|
assert.commandWorked(result);
|
|
return new DBCommandCursor(mydb, result).itcount();
|
|
}
|
|
|
|
function countIndexesFor(mydb, nameFilter) {
|
|
var result = mydb.runCommand("listCollections", {filter: {name: nameFilter}});
|
|
assert.commandWorked(result);
|
|
var arr = new DBCommandCursor(mydb, result).toArray();
|
|
var total = 0;
|
|
for (var i = 0; i < arr.length; i++) {
|
|
var coll = arr[i];
|
|
total += mydb.getCollection(coll.name).getIndexes().length;
|
|
}
|
|
return total;
|
|
}
|
|
|
|
assert.eq(countCollection(masterDB, /temp\d$/), 2); // collections
|
|
assert.eq(countIndexesFor(masterDB, /temp\d$/), 4); // indexes (2 _id + 2 x)
|
|
assert.eq(countCollection(masterDB, /keep\d$/), 4);
|
|
|
|
assert.eq(countCollection(secondDB, /temp\d$/), 2); // collections
|
|
assert.eq(countIndexesFor(secondDB, /temp\d$/), 4); // indexes (2 _id + 2 x)
|
|
assert.eq(countCollection(secondDB, /keep\d$/), 4);
|
|
|
|
// restart secondary and reconnect
|
|
replTest.restart(secondId, {}, /*wait=*/true);
|
|
|
|
// wait for the secondary to achieve secondary status
|
|
assert.soon(function() {
|
|
try {
|
|
res = second.getDB("admin").runCommand({replSetGetStatus: 1});
|
|
return res.myState == 2;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}, "took more than a minute for the secondary to become secondary again", 60 * 1000);
|
|
|
|
// make sure restarting secondary didn't drop collections
|
|
assert.eq(countCollection(secondDB, /temp\d$/), 2); // collections
|
|
assert.eq(countIndexesFor(secondDB, /temp\d$/), 4); // indexes (2 _id + 2 x)
|
|
assert.eq(countCollection(secondDB, /keep\d$/), 4);
|
|
|
|
// step down primary and make sure former secondary (now primary) drops collections
|
|
try {
|
|
master.adminCommand({replSetStepDown: 50, force: true});
|
|
} catch (e) {
|
|
// ignoring socket errors since they sometimes, but not always, fire after running that command.
|
|
}
|
|
|
|
assert.soon(function() {
|
|
return secondDB.isMaster().ismaster;
|
|
}, '', 75 * 1000); // must wait for secondary to be willing to promote self
|
|
|
|
assert.eq(countCollection(secondDB, /temp\d$/), 0); // collections
|
|
assert.eq(countIndexesFor(secondDB, /temp\d$/), 0); // indexes (2 _id + 2 x)
|
|
assert.eq(countCollection(secondDB, /keep\d$/), 4);
|
|
|
|
// check that former primary dropped collections
|
|
replTest.awaitReplication();
|
|
assert.eq(countCollection(masterDB, /temp\d$/), 0); // collections
|
|
assert.eq(countIndexesFor(masterDB, /temp\d$/), 0); // indexes (2 _id + 2 x)
|
|
assert.eq(countCollection(masterDB, /keep\d$/), 4);
|
|
|
|
replTest.stopSet();
|