summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeert Bosch <geert.bosch@mongodb.com>2019-11-12 19:47:39 +0000
committerevergreen <evergreen@mongodb.com>2019-11-12 19:47:39 +0000
commit2d8acdf659431d334b2a18ef2dc19162c8cd416f (patch)
treee7deead8ed713e7a30624d14f749bd2966495b40
parent0dc87ca907a725308d21378dcf65380a64f31364 (diff)
downloadmongo-2d8acdf659431d334b2a18ef2dc19162c8cd416f.tar.gz
SERVER-44311 Change renameBetweenDBs to lock the source DB using MODE_IX
-rw-r--r--src/mongo/db/catalog/rename_collection.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/mongo/db/catalog/rename_collection.cpp b/src/mongo/db/catalog/rename_collection.cpp
index a4aef447476..0731fa184e4 100644
--- a/src/mongo/db/catalog/rename_collection.cpp
+++ b/src/mongo/db/catalog/rename_collection.cpp
@@ -449,7 +449,10 @@ Status renameBetweenDBs(OperationContext* opCtx,
boost::optional<Lock::DBLock> sourceDbLock;
boost::optional<Lock::CollectionLock> sourceCollLock;
if (!opCtx->lockState()->isCollectionLockedForMode(source, MODE_S)) {
- sourceDbLock.emplace(opCtx, source.db(), MODE_IS);
+ // Lock the DB using MODE_IX to ensure we have the global lock in that mode, as to prevent
+ // upgrade from MODE_IS to MODE_IX, which caused deadlock on systems not supporting Database
+ // locking and should be avoided in general.
+ sourceDbLock.emplace(opCtx, source.db(), MODE_IX);
sourceCollLock.emplace(opCtx, source, MODE_S);
}