// static void IndexLegacy::postBuildHook(Collection* collection, const BSONObj& keyPattern) { // If it's an FTS index, we want to set the power of 2 flag. string pluginName = collection->getIndexCatalog()->getAccessMethodName(keyPattern); if (IndexNames::TEXT == pluginName) { NamespaceDetails* nsd = collection->details(); if (nsd->setUserFlag(NamespaceDetails::Flag_UsePowerOf2Sizes)) { nsd->syncUserFlags(collection->ns().ns()); } } }
void doTTLForDB( const string& dbName ) { //check isMaster before becoming god bool isMaster = isMasterNs( dbName.c_str() ); Client::GodScope god; vector<BSONObj> indexes; { auto_ptr<DBClientCursor> cursor = db.query( dbName + ".system.indexes" , BSON( secondsExpireField << BSON( "$exists" << true ) ) , 0 , /* default nToReturn */ 0 , /* default nToSkip */ 0 , /* default fieldsToReturn */ QueryOption_SlaveOk ); /* perform on secondaries too */ if ( cursor.get() ) { while ( cursor->more() ) { indexes.push_back( cursor->next().getOwned() ); } } } for ( unsigned i=0; i<indexes.size(); i++ ) { BSONObj idx = indexes[i]; BSONObj key = idx["key"].Obj(); if ( key.nFields() != 1 ) { error() << "key for ttl index can only have 1 field" << endl; continue; } BSONObj query; { BSONObjBuilder b; b.appendDate( "$lt" , curTimeMillis64() - ( 1000 * idx[secondsExpireField].numberLong() ) ); query = BSON( key.firstElement().fieldName() << b.obj() ); } LOG(1) << "TTL: " << key << " \t " << query << endl; long long n = 0; { string ns = idx["ns"].String(); Client::WriteContext ctx( ns ); NamespaceDetails* nsd = nsdetails( ns ); if ( ! nsd ) { // collection was dropped continue; } if ( nsd->setUserFlag( NamespaceDetails::Flag_UsePowerOf2Sizes ) ) { nsd->syncUserFlags( ns ); } // only do deletes if on master if ( ! isMaster ) { continue; } n = deleteObjects( ns.c_str() , query , false , true ); ttlDeletedDocuments.increment( n ); } LOG(1) << "\tTTL deleted: " << n << endl; } }