DiskLoc MmapV1ExtentManager::_createExtent( OperationContext* txn, int size, bool enforceQuota ) { size = quantizeExtentSize( size ); if ( size > maxSize() ) size = maxSize(); verify( size < DataFile::maxSize() ); for ( int i = numFiles() - 1; i >= 0; i-- ) { DataFile* f = _getOpenFile(i); invariant(f); if ( f->getHeader()->unusedLength >= size ) { return _createExtentInFile( txn, i, f, size, enforceQuota ); } } _checkQuota( enforceQuota, numFiles() ); // no space in an existing file // allocate files until we either get one big enough or hit maxSize for ( int i = 0; i < 8; i++ ) { DataFile* f = _addAFile( txn, size, false ); if ( f->getHeader()->unusedLength >= size ) { return _createExtentInFile( txn, numFiles() - 1, f, size, enforceQuota ); } } // callers don't check for null return code, so assert msgasserted(14810, "couldn't allocate space for a new extent" ); }
DiskLoc MmapV1ExtentManager::_createExtentInFile( OperationContext* txn, int fileNo, DataFile* f, int size, bool enforceQuota) { _checkQuota(enforceQuota, fileNo - 1); massert(10358, "bad new extent size", size >= minSize() && size <= maxSize()); DiskLoc loc = f->allocExtentArea(txn, size); loc.assertOk(); Extent* e = getExtent(loc, false); verify(e); *txn->recoveryUnit()->writing(&e->magic) = Extent::extentSignature; *txn->recoveryUnit()->writing(&e->myLoc) = loc; *txn->recoveryUnit()->writing(&e->length) = size; return loc; }