diff options
author | Dianna Hohensee <dianna.hohensee@mongodb.com> | 2019-11-18 17:24:39 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-11-18 17:24:39 +0000 |
commit | e229612493fe002183a948da98982c08ce5ce24a (patch) | |
tree | 33d16d12b8969f3cfe8e4c20290f6ff1b6989236 /src/mongo/db/storage | |
parent | 0231a413ec08ff3c9b96ad5badd3b8359a3fa7cb (diff) | |
download | mongo-e229612493fe002183a948da98982c08ce5ce24a.tar.gz |
SERVER-39591 RecoveryUnit::waitUntilDurable() invariants against callers holding locks, except for repair
Diffstat (limited to 'src/mongo/db/storage')
-rw-r--r-- | src/mongo/db/storage/biggie/biggie_recovery_unit.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/storage/recovery_unit.h | 2 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp | 2 |
3 files changed, 4 insertions, 1 deletions
diff --git a/src/mongo/db/storage/biggie/biggie_recovery_unit.cpp b/src/mongo/db/storage/biggie/biggie_recovery_unit.cpp index d330607e9fa..08e487fb603 100644 --- a/src/mongo/db/storage/biggie/biggie_recovery_unit.cpp +++ b/src/mongo/db/storage/biggie/biggie_recovery_unit.cpp @@ -93,6 +93,7 @@ void RecoveryUnit::doAbortUnitOfWork() { bool RecoveryUnit::waitUntilDurable(OperationContext* opCtx) { invariant(!_inUnitOfWork(), toString(_getState())); + invariant(!opCtx->lockState()->isLocked() || storageGlobalParams.repair); return true; // This is an in-memory storage engine. } diff --git a/src/mongo/db/storage/recovery_unit.h b/src/mongo/db/storage/recovery_unit.h index abbd363f4c7..521dd75232b 100644 --- a/src/mongo/db/storage/recovery_unit.h +++ b/src/mongo/db/storage/recovery_unit.h @@ -193,7 +193,7 @@ public: * Waits until all commits that happened before this call are durable in the journal. Returns * true, unless the storage engine cannot guarantee durability, which should never happen when * isDurable() returned true. This cannot be called from inside a unit of work, and should - * fail if it is. + * fail if it is. This method invariants if the caller holds any locks, except for repair. */ virtual bool waitUntilDurable(OperationContext* opCtx) = 0; diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp index bd477a554f9..3b5e48f041e 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp @@ -246,6 +246,7 @@ void WiredTigerRecoveryUnit::_ensureSession() { bool WiredTigerRecoveryUnit::waitUntilDurable(OperationContext* opCtx) { invariant(!_inUnitOfWork(), toString(_getState())); + invariant(!opCtx->lockState()->isLocked() || storageGlobalParams.repair); const bool forceCheckpoint = false; const bool stableCheckpoint = false; _sessionCache->waitUntilDurable(opCtx, forceCheckpoint, stableCheckpoint); @@ -255,6 +256,7 @@ bool WiredTigerRecoveryUnit::waitUntilDurable(OperationContext* opCtx) { bool WiredTigerRecoveryUnit::waitUntilUnjournaledWritesDurable(OperationContext* opCtx, bool stableCheckpoint) { invariant(!_inUnitOfWork(), toString(_getState())); + invariant(!opCtx->lockState()->isLocked() || storageGlobalParams.repair); const bool forceCheckpoint = true; // Calling `waitUntilDurable` with `forceCheckpoint` set to false only performs a log // (journal) flush, and thus has no effect on unjournaled writes. Setting `forceCheckpoint` to |