summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency
diff options
context:
space:
mode:
authorDianna Hohensee <dianna.hohensee@mongodb.com>2021-12-21 15:04:39 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-01-12 22:02:38 +0000
commit42c4a1e81df86cd3b808bb982b62f527c0de71d8 (patch)
tree0aeadfaa255410c715ba150a0749df24fa7c91c8 /src/mongo/db/concurrency
parentd186067e1d81467e585204087e2757875b7aa8c6 (diff)
downloadmongo-42c4a1e81df86cd3b808bb982b62f527c0de71d8.tar.gz
SERVER-62194 Make AutoGetCollection accept multiple namespaces to lock.
Diffstat (limited to 'src/mongo/db/concurrency')
-rw-r--r--src/mongo/db/concurrency/d_concurrency.cpp20
-rw-r--r--src/mongo/db/concurrency/d_concurrency.h5
2 files changed, 16 insertions, 9 deletions
diff --git a/src/mongo/db/concurrency/d_concurrency.cpp b/src/mongo/db/concurrency/d_concurrency.cpp
index 4a6b8cee9a1..db11862b65b 100644
--- a/src/mongo/db/concurrency/d_concurrency.cpp
+++ b/src/mongo/db/concurrency/d_concurrency.cpp
@@ -196,13 +196,19 @@ void Lock::GlobalLock::_unlock() {
_result = LOCK_INVALID;
}
-Lock::DBLock::DBLock(OperationContext* opCtx, StringData db, LockMode mode, Date_t deadline)
- : _id(RESOURCE_DATABASE, db),
- _opCtx(opCtx),
- _result(LOCK_INVALID),
- _mode(mode),
- _globalLock(
- opCtx, isSharedLockMode(_mode) ? MODE_IS : MODE_IX, deadline, InterruptBehavior::kThrow) {
+Lock::DBLock::DBLock(OperationContext* opCtx,
+ StringData db,
+ LockMode mode,
+ Date_t deadline,
+ bool skipGlobalAndRSTLLocks)
+ : _id(RESOURCE_DATABASE, db), _opCtx(opCtx), _result(LOCK_INVALID), _mode(mode) {
+
+ if (!skipGlobalAndRSTLLocks) {
+ _globalLock.emplace(opCtx,
+ isSharedLockMode(_mode) ? MODE_IS : MODE_IX,
+ deadline,
+ InterruptBehavior::kThrow);
+ }
massert(28539, "need a valid database name", !db.empty() && nsIsDbOnly(db));
_opCtx->lockState()->lock(_opCtx, _id, _mode, deadline);
diff --git a/src/mongo/db/concurrency/d_concurrency.h b/src/mongo/db/concurrency/d_concurrency.h
index bf467472b12..1c21e9362af 100644
--- a/src/mongo/db/concurrency/d_concurrency.h
+++ b/src/mongo/db/concurrency/d_concurrency.h
@@ -306,7 +306,8 @@ public:
DBLock(OperationContext* opCtx,
StringData db,
LockMode mode,
- Date_t deadline = Date_t::max());
+ Date_t deadline = Date_t::max(),
+ bool skipGlobalAndRSTLLocks = false);
DBLock(DBLock&&);
~DBLock();
@@ -337,7 +338,7 @@ public:
LockMode _mode;
// Acquires the global lock on our behalf.
- GlobalLock _globalLock;
+ boost::optional<GlobalLock> _globalLock;
};
/**