void MMAPV1DatabaseCatalogEntry::appendExtraStats( OperationContext* opCtx, BSONObjBuilder* output, double scale ) const { if ( isEmpty() ) { output->appendNumber( "fileSize", 0 ); } else { output->appendNumber( "fileSize", _extentManager.fileSize() / scale ); output->appendNumber( "nsSizeMB", static_cast<int>( _namespaceIndex.fileLength() / ( 1024 * 1024 ) ) ); int freeListSize = 0; int64_t freeListSpace = 0; _extentManager.freeListStats( &freeListSize, &freeListSpace ); BSONObjBuilder extentFreeList( output->subobjStart( "extentFreeList" ) ); extentFreeList.append( "num", freeListSize ); extentFreeList.appendNumber( "totalSize", static_cast<long long>( freeListSpace / scale ) ); extentFreeList.done(); { int major = 0; int minor = 0; _extentManager.getFileFormat( opCtx, &major, &minor ); BSONObjBuilder dataFileVersion( output->subobjStart( "dataFileVersion" ) ); dataFileVersion.append( "major", major ); dataFileVersion.append( "minor", minor ); dataFileVersion.done(); } } }
void Database::getStats( OperationContext* opCtx, BSONObjBuilder* output, double scale ) { bool empty = isEmpty() || getExtentManager()->numFiles() == 0; list<string> collections; if ( !empty ) _dbEntry->getCollectionNamespaces( &collections ); long long ncollections = 0; long long objects = 0; long long size = 0; long long storageSize = 0; long long numExtents = 0; long long indexes = 0; long long indexSize = 0; for (list<string>::const_iterator it = collections.begin(); it != collections.end(); ++it) { const string ns = *it; Collection* collection = getCollection( opCtx, ns ); if ( !collection ) continue; ncollections += 1; objects += collection->numRecords(); size += collection->dataSize(); BSONObjBuilder temp; storageSize += collection->getRecordStore()->storageSize( &temp ); numExtents += temp.obj()["numExtents"].numberInt(); // XXX indexes += collection->getIndexCatalog()->numIndexesTotal(); indexSize += getIndexSizeForCollection(opCtx, collection); } output->append ( "db" , _name ); output->appendNumber( "collections" , ncollections ); output->appendNumber( "objects" , objects ); output->append ( "avgObjSize" , objects == 0 ? 0 : double(size) / double(objects) ); output->appendNumber( "dataSize" , size / scale ); output->appendNumber( "storageSize" , storageSize / scale); output->appendNumber( "numExtents" , numExtents ); output->appendNumber( "indexes" , indexes ); output->appendNumber( "indexSize" , indexSize / scale ); if ( !empty ) { output->appendNumber( "fileSize" , fileSize() / scale ); output->appendNumber( "nsSizeMB", (int)_dbEntry->namespaceIndex().fileLength() / 1024 / 1024 ); } else { output->appendNumber( "fileSize" , 0 ); } BSONObjBuilder dataFileVersion( output->subobjStart( "dataFileVersion" ) ); if ( !empty ) { int major, minor; getFileFormat( opCtx, &major, &minor ); dataFileVersion.append( "major", major ); dataFileVersion.append( "minor", minor ); } dataFileVersion.done(); if ( !empty ){ int freeListSize = 0; int64_t freeListSpace = 0; getExtentManager()->freeListStats( &freeListSize, &freeListSpace ); BSONObjBuilder extentFreeList( output->subobjStart( "extentFreeList" ) ); extentFreeList.append( "num", freeListSize ); extentFreeList.appendNumber( "totalSize", static_cast<long long>( freeListSpace / scale ) ); extentFreeList.done(); } }