Extent* ExtentManager::_createExtentInFile( int fileNo, DataFile* f, const char* ns, int size, bool newCapped, bool enforceQuota ) { size = ExtentManager::quantizeExtentSize( size ); if ( enforceQuota ) { if ( fileIndexExceedsQuota( ns, fileNo - 1 ) ) { if ( cc().hasWrittenThisPass() ) { warning() << "quota exceeded, but can't assert " << " going over quota for: " << ns << " " << fileNo << endl; } else { _quotaExceeded(); } } } massert( 10358, "bad new extent size", size >= Extent::minSize() && size <= Extent::maxSize() ); DiskLoc loc = f->allocExtentArea( size ); loc.assertOk(); Extent *e = getExtent( loc, false ); verify( e ); DiskLoc emptyLoc = getDur().writing(e)->init(ns, size, fileNo, loc.getOfs(), newCapped); addNewExtentToNamespace(ns, e, loc, emptyLoc, newCapped); LOG(1) << "ExtentManager: creating new extent for: " << ns << " in file: " << fileNo << " size: " << size << endl; return e; }
DiskLoc MmapV1ExtentManager::_createExtentInFile( TransactionExperiment* txn, int fileNo, DataFile* f, int size, int maxFileNoForQuota ) { size = MmapV1ExtentManager::quantizeExtentSize( size ); if ( maxFileNoForQuota > 0 && fileNo - 1 >= maxFileNoForQuota ) { if ( cc().hasWrittenSinceCheckpoint() ) { warning() << "quota exceeded, but can't assert" << endl; } else { _quotaExceeded(); } } 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->writing(&e->magic) = Extent::extentSignature; *txn->writing(&e->myLoc) = loc; *txn->writing(&e->length) = size; return loc; }
DiskLoc ExtentManager::_createExtentInFile( int fileNo, DataFile* f, int size, int maxFileNoForQuota ) { size = ExtentManager::quantizeExtentSize( size ); if ( maxFileNoForQuota > 0 && fileNo - 1 >= maxFileNoForQuota ) { if ( cc().hasWrittenThisPass() ) { warning() << "quota exceeded, but can't assert" << endl; } else { _quotaExceeded(); } } massert( 10358, "bad new extent size", size >= Extent::minSize() && size <= Extent::maxSize() ); DiskLoc loc = f->allocExtentArea( size ); loc.assertOk(); Extent *e = getExtent( loc, false ); verify( e ); getDur().writing(e)->init("", size, fileNo, loc.getOfs(), false); return loc; }
DiskLoc MmapV1ExtentManager::_createExtent( TransactionExperiment* txn, int size, int maxFileNoForQuota ) { size = quantizeExtentSize( size ); if ( size > maxSize() ) size = maxSize(); verify( size < DataFile::maxSize() ); for ( int i = numFiles() - 1; i >= 0; i-- ) { DataFile* f = getFile( txn, i ); if ( f->getHeader()->unusedLength >= size ) { return _createExtentInFile( txn, i, f, size, maxFileNoForQuota ); } } if ( maxFileNoForQuota > 0 && static_cast<int>( numFiles() ) >= maxFileNoForQuota && !cc().hasWrittenSinceCheckpoint() ) { _quotaExceeded(); } // 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, maxFileNoForQuota ); } } // callers don't check for null return code, so assert msgasserted(14810, "couldn't allocate space for a new extent" ); }
Extent* ExtentManager::createExtent(const char *ns, int size, bool newCapped, bool enforceQuota ) { size = quantizeExtentSize( size ); if ( size > Extent::maxSize() ) size = Extent::maxSize(); verify( size < DataFile::maxSize() ); for ( int i = numFiles() - 1; i >= 0; i-- ) { DataFile* f = getFile( i ); if ( f->getHeader()->unusedLength >= size ) { return _createExtentInFile( i, f, ns, size, newCapped, enforceQuota ); } } if ( enforceQuota && fileIndexExceedsQuota( ns, numFiles() ) && !cc().hasWrittenThisPass() ) { _quotaExceeded(); } // 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( size, false ); if ( f->getHeader()->unusedLength >= size ) { return _createExtentInFile( numFiles() - 1, f, ns, size, newCapped, enforceQuota ); } } // callers don't check for null return code, so assert msgasserted(14810, "couldn't allocate space for a new extent" ); }