// TODO: SERVER-13215 move test back to replSets suite. /** * TODO: SERVER-13204 * This tests inserts a huge number of documents, initiates a background index build * and tries to perform another task in parallel while the background index task is * active. The problem is that this is timing dependent and the current test setup * tries to achieve this by inserting insane amount of documents. */ // Index drop race var dbname = 'dropbgindex'; var collection = 'jstests_feh'; var size = 500000; // Set up replica set var replTest = new ReplSetTest({ name: 'bgIndex', 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" : "bgIndex", "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(dbname); var secondDB = second.getDB(dbname); var dc = {dropIndexes: collection, index: "i_1"}; // set up collections masterDB.dropDatabase(); jsTest.log("creating test data " + size + " documents"); Random.setRandomSeed(); var bulk = masterDB.getCollection(collection).initializeUnorderedBulkOp(); for( i = 0; i < size; ++i ) { bulk.insert({ i: Random.rand() }); } assert.writeOK(bulk.execute()); jsTest.log("Starting background indexing for test of: " + tojson(dc)); // Add another index to be sure the drop command works. masterDB.getCollection(collection).ensureIndex({b:1}); masterDB.getCollection(collection).ensureIndex( {i:1}, {background:true} ); assert.eq(3, masterDB.getCollection(collection).getIndexes().length ); // Wait for the secondary to get the index entry assert.soon( function() { return 3 == secondDB.getCollection(collection).getIndexes().length; }, "index not created on secondary (prior to drop)", 240000 ); jsTest.log("Index created and index entry exists on secondary"); // make sure the index build has started on secondary assert.soon(function() { var curOp = secondDB.currentOp(); printjson(curOp); for (var i=0; i < curOp.inprog.length; i++) { try { if (curOp.inprog[i].insert.background){ return true; } } catch (e) { // catchem if you can } } return false; }, "waiting for secondary bg index build", 20000, 10); jsTest.log("dropping index"); masterDB.runCommand( {dropIndexes: collection, index: "*"}); jsTest.log("Waiting on replication"); replTest.awaitReplication(); print("index list on master:"); masterDB.getCollection(collection).getIndexes().forEach(printjson); // we need to assert.soon because the drop only marks the index for removal // the removal itself is asynchronous and may take another moment before it happens var i = 0; assert.soon( function() { print("index list on secondary (run " + i + "):"); secondDB.getCollection(collection).getIndexes().forEach(printjson); i++; return 1 === secondDB.getCollection(collection).getIndexes().length; }, "secondary did not drop index" ); replTest.stopSet();