summaryrefslogtreecommitdiff
path: root/src/mongo/db/db_raii.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/db_raii.cpp')
-rw-r--r--src/mongo/db/db_raii.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/mongo/db/db_raii.cpp b/src/mongo/db/db_raii.cpp
index bff855fcc5b..018a2591ed3 100644
--- a/src/mongo/db/db_raii.cpp
+++ b/src/mongo/db/db_raii.cpp
@@ -49,13 +49,23 @@ MONGO_FP_DECLARE(setAutoGetCollectionWait);
AutoGetDb::AutoGetDb(OperationContext* opCtx, StringData ns, LockMode mode)
: _dbLock(opCtx, ns, mode), _db(dbHolder().get(opCtx, ns)) {}
+AutoGetDb::AutoGetDb(OperationContext* opCtx, StringData ns, Lock::DBLock lock)
+ : _dbLock(std::move(lock)), _db(dbHolder().get(opCtx, ns)) {}
+
AutoGetCollection::AutoGetCollection(OperationContext* opCtx,
const NamespaceString& nss,
LockMode modeDB,
LockMode modeColl,
ViewMode viewMode)
+ : AutoGetCollection(opCtx, nss, modeColl, viewMode, Lock::DBLock(opCtx, nss.db(), modeDB)) {}
+
+AutoGetCollection::AutoGetCollection(OperationContext* opCtx,
+ const NamespaceString& nss,
+ LockMode modeColl,
+ ViewMode viewMode,
+ Lock::DBLock lock)
: _viewMode(viewMode),
- _autoDb(opCtx, nss.db(), modeDB),
+ _autoDb(opCtx, nss.db(), std::move(lock)),
_collLock(opCtx->lockState(), nss.ns(), modeColl),
_coll(_autoDb.getDb() ? _autoDb.getDb()->getCollection(opCtx, nss) : nullptr) {
Database* db = _autoDb.getDb();
@@ -132,6 +142,15 @@ AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* opCtx,
_ensureMajorityCommittedSnapshotIsValid(nss, opCtx);
}
+AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* opCtx,
+ const NamespaceString& nss,
+ AutoGetCollection::ViewMode viewMode,
+ Lock::DBLock lock) {
+ _autoColl.emplace(opCtx, nss, MODE_IS, viewMode, std::move(lock));
+
+ // Note: this can yield.
+ _ensureMajorityCommittedSnapshotIsValid(nss, opCtx);
+}
void AutoGetCollectionForRead::_ensureMajorityCommittedSnapshotIsValid(const NamespaceString& nss,
OperationContext* opCtx) {
while (true) {
@@ -169,9 +188,11 @@ void AutoGetCollectionForRead::_ensureMajorityCommittedSnapshotIsValid(const Nam
}
AutoGetCollectionForReadCommand::AutoGetCollectionForReadCommand(
- OperationContext* opCtx, const NamespaceString& nss, AutoGetCollection::ViewMode viewMode) {
-
- _autoCollForRead.emplace(opCtx, nss, viewMode);
+ OperationContext* opCtx,
+ const NamespaceString& nss,
+ AutoGetCollection::ViewMode viewMode,
+ Lock::DBLock lock) {
+ _autoCollForRead.emplace(opCtx, nss, viewMode, std::move(lock));
const int doNotChangeProfilingLevel = 0;
_statsTracker.emplace(opCtx,
nss,
@@ -185,6 +206,11 @@ AutoGetCollectionForReadCommand::AutoGetCollectionForReadCommand(
css->checkShardVersionOrThrow(opCtx);
}
+AutoGetCollectionForReadCommand::AutoGetCollectionForReadCommand(
+ OperationContext* opCtx, const NamespaceString& nss, AutoGetCollection::ViewMode viewMode)
+ : AutoGetCollectionForReadCommand(
+ opCtx, nss, viewMode, Lock::DBLock(opCtx, nss.db(), MODE_IS)) {}
+
AutoGetCollectionOrViewForReadCommand::AutoGetCollectionOrViewForReadCommand(
OperationContext* opCtx, const NamespaceString& nss)
: AutoGetCollectionForReadCommand(opCtx, nss, AutoGetCollection::ViewMode::kViewsPermitted),
@@ -192,6 +218,14 @@ AutoGetCollectionOrViewForReadCommand::AutoGetCollectionOrViewForReadCommand(
? _autoCollForRead->getDb()->getViewCatalog()->lookup(opCtx, nss.ns())
: nullptr) {}
+AutoGetCollectionOrViewForReadCommand::AutoGetCollectionOrViewForReadCommand(
+ OperationContext* opCtx, const NamespaceString& nss, Lock::DBLock lock)
+ : AutoGetCollectionForReadCommand(
+ opCtx, nss, AutoGetCollection::ViewMode::kViewsPermitted, std::move(lock)),
+ _view(_autoCollForRead->getDb() && !getCollection()
+ ? _autoCollForRead->getDb()->getViewCatalog()->lookup(opCtx, nss.ns())
+ : nullptr) {}
+
void AutoGetCollectionOrViewForReadCommand::releaseLocksForView() noexcept {
invariant(_view);
_view = nullptr;