mirror of
https://github.com/mongodb/mongo.git
synced 2024-12-01 09:32:32 +01:00
151 lines
5.5 KiB
JavaScript
151 lines
5.5 KiB
JavaScript
// Check that capped collections get an _id index when replicated
|
|
|
|
// Test #
|
|
// 0) create capped collection on replset, check _id index appears on secondary
|
|
// 1) create normal collection, then convertToCapped, check _id index on secondaries
|
|
// 2) create capped collection, do updates instead of inserts, check _id index on secondaries
|
|
// 3) create capped collection with autoIndexId=false. make sure no _id index. then create one
|
|
// and check it got created on secondaries.
|
|
|
|
// Create a new replica set test with name 'testSet' and 3 members
|
|
var replTest = new ReplSetTest( {name: 'testSet', nodes: 3} );
|
|
|
|
// call startSet() to start each mongod in the replica set
|
|
// this returns a list of nodes
|
|
var nodes = replTest.startSet();
|
|
|
|
// Call initiate() to send the replSetInitiate command
|
|
// This will wait for initiation
|
|
replTest.initiate();
|
|
|
|
// Call getMaster to return a reference to the node that's been
|
|
// elected master
|
|
var master = replTest.getMaster();
|
|
|
|
// wait for secondaries to be up, since we'll be reading from them
|
|
replTest.awaitSecondaryNodes();
|
|
// And get the slaves from the liveNodes
|
|
var slave1 = replTest.liveNodes.slaves[0];
|
|
var slave2 = replTest.liveNodes.slaves[1];
|
|
|
|
// Calling getMaster made available the liveNodes structure,
|
|
// which looks like this:
|
|
// liveNodes = {master: masterNode, slaves: [slave1, slave2] }
|
|
printjson( replTest.liveNodes );
|
|
|
|
// define db names to use for this test
|
|
var dbname = "dbname";
|
|
var masterdb = master.getDB( dbname );
|
|
var slave1db = slave1.getDB( dbname );
|
|
var slave2db = slave2.getDB( dbname );
|
|
|
|
var numtests = 4;
|
|
for( testnum=0; testnum < numtests; testnum++ ){
|
|
|
|
//define collection name
|
|
coll = "coll" + testnum;
|
|
|
|
// drop the coll on the master (just in case it already existed)
|
|
// and wait for the drop to replicate
|
|
masterdb.getCollection( coll ).drop();
|
|
replTest.awaitReplication();
|
|
|
|
if ( testnum == 0 ){
|
|
// create a capped collection on the master
|
|
// insert a bunch of things in it
|
|
// wait for it to replicate
|
|
masterdb.runCommand( {create : coll , capped : true , size : 1024} );
|
|
for(i=0; i < 500 ; i++){
|
|
masterdb.getCollection( coll ).insert( {a: 1000} );
|
|
}
|
|
replTest.awaitReplication();
|
|
}
|
|
else if ( testnum == 1 ){
|
|
// create a non-capped collection on the master
|
|
// insert a bunch of things in it
|
|
// wait for it to replicate
|
|
masterdb.runCommand( {create : coll } );
|
|
for(i=0; i < 500 ; i++){
|
|
masterdb.getCollection( coll ).insert( {a: 1000} );
|
|
}
|
|
replTest.awaitReplication();
|
|
|
|
function countIdIndexes(theDB, coll) {
|
|
return theDB[coll].getIndexes().filter(function(idx) {
|
|
return friendlyEqual(idx.key, {_id: 1});
|
|
}).length;
|
|
}
|
|
// make sure _id index exists on primary
|
|
assert.eq( 1 ,
|
|
countIdIndexes(masterdb, coll),
|
|
"master does not have _id index on normal collection");
|
|
|
|
// then convert it to capped
|
|
masterdb.runCommand({convertToCapped: coll , size: 1024 } );
|
|
replTest.awaitReplication();
|
|
}
|
|
else if ( testnum == 2 ){
|
|
// similar to first test, but check that a bunch of updates instead
|
|
// of inserts triggers the _id index creation on secondaries.
|
|
masterdb.runCommand( {create : coll , capped : true , size : 1024} );
|
|
masterdb.getCollection( coll ).insert( {a : 0} );
|
|
for(i=0; i < 500 ; i++){
|
|
masterdb.getCollection( coll ).update( {} , {$inc : {a : 1} } );
|
|
}
|
|
replTest.awaitReplication();
|
|
}
|
|
else if ( testnum == 3 ){
|
|
// explicitly set autoIndexId : false
|
|
masterdb.runCommand( {create : coll , capped : true , size : 1024 , autoIndexId : false } )
|
|
for(i=0; i < 500 ; i++){
|
|
masterdb.getCollection( coll ).insert( {a: 1000} );
|
|
}
|
|
replTest.awaitReplication();
|
|
|
|
assert.eq( 0 ,
|
|
countIdIndexes(masterdb, coll),
|
|
"master has an _id index on capped collection when autoIndexId is false");
|
|
assert.eq( 0 ,
|
|
countIdIndexes(slave1db, coll),
|
|
"slave1 has an _id index on capped collection when autoIndexId is false");
|
|
assert.eq( 0 ,
|
|
countIdIndexes(slave2db, coll),
|
|
"slave2 has an _id index on capped collection when autoIndexId is false");
|
|
|
|
// now create the index and make sure it works
|
|
masterdb.getCollection( coll ).ensureIndex( { "_id" : 1 } );
|
|
replTest.awaitReplication();
|
|
}
|
|
|
|
// what indexes do we have?
|
|
print("**********Master indexes on " + dbname + "." + coll + ":**********");
|
|
masterdb[coll].getIndexes().forEach(printjson);
|
|
print("");
|
|
|
|
print("**********Slave1 indexes on " + dbname + "." + coll + ":**********");
|
|
slave1db[coll].getIndexes().forEach(printjson);
|
|
print("");
|
|
|
|
print("**********Slave2 indexes on " + dbname + "." + coll + ":**********");
|
|
slave2db[coll].getIndexes().forEach(printjson);
|
|
print("");
|
|
|
|
// ensure all nodes have _id index
|
|
assert.eq( 1 ,
|
|
countIdIndexes(masterdb, coll),
|
|
"master has an _id index on capped collection");
|
|
assert.eq( 1 ,
|
|
countIdIndexes(slave1db, coll),
|
|
"slave1 does not have _id index on capped collection");
|
|
assert.eq( 1 ,
|
|
countIdIndexes(slave2db, coll),
|
|
"slave2 does not have _id index on capped collection");
|
|
|
|
print("capped_id.js Test # " + testnum + " SUCCESS");
|
|
}
|
|
|
|
//Finally, stop set
|
|
replTest.stopSet();
|
|
|
|
|