diff options
author | Dianna Hohensee <dianna.hohensee@mongodb.com> | 2021-12-21 15:04:39 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-01-12 22:02:38 +0000 |
commit | 42c4a1e81df86cd3b808bb982b62f527c0de71d8 (patch) | |
tree | 0aeadfaa255410c715ba150a0749df24fa7c91c8 /src/mongo/db/concurrency | |
parent | d186067e1d81467e585204087e2757875b7aa8c6 (diff) | |
download | mongo-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.cpp | 20 | ||||
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency.h | 5 |
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; }; /** |