summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage
diff options
context:
space:
mode:
authorDianna Hohensee <dianna.hohensee@mongodb.com>2019-11-18 17:24:39 +0000
committerevergreen <evergreen@mongodb.com>2019-11-18 17:24:39 +0000
commite229612493fe002183a948da98982c08ce5ce24a (patch)
tree33d16d12b8969f3cfe8e4c20290f6ff1b6989236 /src/mongo/db/storage
parent0231a413ec08ff3c9b96ad5badd3b8359a3fa7cb (diff)
downloadmongo-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.cpp1
-rw-r--r--src/mongo/db/storage/recovery_unit.h2
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp2
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