Status Database::renameCollection( OperationContext* txn, StringData fromNS, StringData toNS, bool stayTemp ) { audit::logRenameCollection( currentClient.get(), fromNS, toNS ); invariant(txn->lockState()->isDbLockedForMode(name(), MODE_X)); { // remove anything cached Collection* coll = getCollection( fromNS ); if ( !coll ) return Status( ErrorCodes::NamespaceNotFound, "collection not found to rename" ); IndexCatalog::IndexIterator ii = coll->getIndexCatalog()->getIndexIterator( txn, true ); while ( ii.more() ) { IndexDescriptor* desc = ii.next(); _clearCollectionCache( txn, desc->indexNamespace() ); } _clearCollectionCache( txn, fromNS ); _clearCollectionCache( txn, toNS ); Top::global.collectionDropped( fromNS.toString() ); } txn->recoveryUnit()->registerChange( new AddCollectionChange(this, toNS) ); Status s = _dbEntry->renameCollection( txn, fromNS, toNS, stayTemp ); _collections[toNS] = _getOrCreateCollectionInstance(txn, toNS); return s; }
Status Database::renameCollection( OperationContext* txn, const StringData& fromNS, const StringData& toNS, bool stayTemp ) { audit::logRenameCollection( currentClient.get(), fromNS, toNS ); { // remove anything cached Collection* coll = getCollection( txn, fromNS ); if ( !coll ) return Status( ErrorCodes::NamespaceNotFound, "collection not found to rename" ); IndexCatalog::IndexIterator ii = coll->getIndexCatalog()->getIndexIterator( true ); while ( ii.more() ) { IndexDescriptor* desc = ii.next(); _clearCollectionCache( desc->indexNamespace() ); } { scoped_lock lk( _collectionLock ); _clearCollectionCache_inlock( fromNS ); _clearCollectionCache_inlock( toNS ); } Top::global.collectionDropped( fromNS.toString() ); } return _dbEntry->renameCollection( txn, fromNS, toNS, stayTemp ); }
Status Database::renameCollection(OperationContext* txn, StringData fromNS, StringData toNS, bool stayTemp) { audit::logRenameCollection(&cc(), fromNS, toNS); invariant(txn->lockState()->isDbLockedForMode(name(), MODE_X)); BackgroundOperation::assertNoBgOpInProgForNs(fromNS); BackgroundOperation::assertNoBgOpInProgForNs(toNS); { // remove anything cached Collection* coll = getCollection(fromNS); if (!coll) return Status(ErrorCodes::NamespaceNotFound, "collection not found to rename"); string clearCacheReason = str::stream() << "renamed collection '" << fromNS << "' to '" << toNS << "'"; IndexCatalog::IndexIterator ii = coll->getIndexCatalog()->getIndexIterator(txn, true); while (ii.more()) { IndexDescriptor* desc = ii.next(); _clearCollectionCache(txn, desc->indexNamespace(), clearCacheReason); } _clearCollectionCache(txn, fromNS, clearCacheReason); _clearCollectionCache(txn, toNS, clearCacheReason); Top::get(txn->getClient()->getServiceContext()).collectionDropped(fromNS.toString()); } txn->recoveryUnit()->registerChange(new AddCollectionChange(txn, this, toNS)); Status s = _dbEntry->renameCollection(txn, fromNS, toNS, stayTemp); _collections[toNS] = _getOrCreateCollectionInstance(txn, toNS); return s; }
long long Database::getIndexSizeForCollection(OperationContext* opCtx, Collection* coll, BSONObjBuilder* details, int scale ) { if ( !coll ) return 0; IndexCatalog::IndexIterator ii = coll->getIndexCatalog()->getIndexIterator( true /*includeUnfinishedIndexes*/ ); long long totalSize = 0; while ( ii.more() ) { IndexDescriptor* d = ii.next(); string indNS = d->indexNamespace(); // XXX creating a Collection for an index which isn't a Collection Collection* indColl = getCollection( opCtx, indNS ); if ( ! indColl ) { log() << "error: have index descriptor [" << indNS << "] but no entry in the index collection." << endl; continue; } totalSize += indColl->dataSize(); if ( details ) { long long const indexSize = indColl->dataSize() / scale; details->appendNumber( d->indexName() , indexSize ); } } return totalSize; }