diff options
Diffstat (limited to 'src/mongo/db/catalog_raii.cpp')
-rw-r--r-- | src/mongo/db/catalog_raii.cpp | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/src/mongo/db/catalog_raii.cpp b/src/mongo/db/catalog_raii.cpp index 339a72655ce..79e4e8e10d4 100644 --- a/src/mongo/db/catalog_raii.cpp +++ b/src/mongo/db/catalog_raii.cpp @@ -68,19 +68,11 @@ AutoGetCollection::AutoGetCollection(OperationContext* opCtx, LockMode modeColl, ViewMode viewMode, Date_t deadline) - : // The UUID to NamespaceString resolution is performed outside of any locks - _resolvedNss(resolveNamespaceStringOrUUID(opCtx, nsOrUUID)), - // The database locking is performed based on the resolved NamespaceString - _autoDb(opCtx, _resolvedNss.db(), modeDB, deadline) { - // In order to account for possible collection rename happening because the resolution from UUID - // to NamespaceString was done outside of database lock, if UUID was specified we need to - // re-resolve the _resolvedNss after acquiring the database lock so it has the correct value. - // - // Holding a database lock prevents collection renames, so this guarantees a stable UUID to - // NamespaceString mapping. - if (nsOrUUID.uuid()) - _resolvedNss = resolveNamespaceStringOrUUID(opCtx, nsOrUUID); - + : _autoDb(opCtx, + !nsOrUUID.dbname().empty() ? nsOrUUID.dbname() : nsOrUUID.nss()->db(), + modeDB, + deadline), + _resolvedNss(resolveNamespaceStringOrUUID(opCtx, nsOrUUID)) { _collLock.emplace(opCtx->lockState(), _resolvedNss.ns(), modeColl, deadline); uassertLockTimeout( str::stream() << "collection " << nsOrUUID.toString(), modeColl, _collLock->isLocked()); |