Status SimpleRecordStoreV1::truncate(OperationContext* txn) { const DiskLoc firstExtLoc = _details->firstExtent(txn); if (firstExtLoc.isNull() || !firstExtLoc.isValid()) { // Already empty return Status::OK(); } // Free all extents except the first. Extent* firstExt = _extentManager->getExtent(firstExtLoc); if (!firstExt->xnext.isNull()) { const DiskLoc extNextLoc = firstExt->xnext; const DiskLoc oldLastExtLoc = _details->lastExtent(txn); Extent* const nextExt = _extentManager->getExtent(extNextLoc); // Unlink other extents; *txn->recoveryUnit()->writing(&nextExt->xprev) = DiskLoc(); *txn->recoveryUnit()->writing(&firstExt->xnext) = DiskLoc(); _details->setLastExtent(txn, firstExtLoc); _details->setLastExtentSize(txn, firstExt->length); _extentManager->freeExtents(txn, extNextLoc, oldLastExtLoc); } // Make the first (now only) extent a single large deleted record. *txn->recoveryUnit()->writing(&firstExt->firstRecord) = DiskLoc(); *txn->recoveryUnit()->writing(&firstExt->lastRecord) = DiskLoc(); _details->orphanDeletedList(txn); addDeletedRec(txn, _findFirstSpot(txn, firstExtLoc, firstExt)); // Make stats reflect that there are now no documents in this record store. _details->setStats(txn, 0, 0); return Status::OK(); }
void RecordStoreV1Base::increaseStorageSize(OperationContext* txn, int size, bool enforceQuota) { DiskLoc eloc = _extentManager->allocateExtent(txn, isCapped(), size, enforceQuota); Extent* e = _extentManager->getExtent(eloc); invariant(e); *txn->recoveryUnit()->writing(&e->nsDiagnostic) = _ns; txn->recoveryUnit()->writing(&e->xnext)->Null(); txn->recoveryUnit()->writing(&e->xprev)->Null(); txn->recoveryUnit()->writing(&e->firstRecord)->Null(); txn->recoveryUnit()->writing(&e->lastRecord)->Null(); DiskLoc emptyLoc = _findFirstSpot(txn, eloc, e); if (_details->lastExtent(txn).isNull()) { invariant(_details->firstExtent(txn).isNull()); _details->setFirstExtent(txn, eloc); _details->setLastExtent(txn, eloc); _details->setCapExtent(txn, eloc); invariant(e->xprev.isNull()); invariant(e->xnext.isNull()); } else { invariant(!_details->firstExtent(txn).isNull()); *txn->recoveryUnit()->writing(&e->xprev) = _details->lastExtent(txn); *txn->recoveryUnit()->writing( &_extentManager->getExtent(_details->lastExtent(txn))->xnext) = eloc; _details->setLastExtent(txn, eloc); } _details->setLastExtentSize(txn, e->length); addDeletedRec(txn, emptyLoc); }