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);
}