summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/rename_collection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/catalog/rename_collection.cpp')
-rw-r--r--src/mongo/db/catalog/rename_collection.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/mongo/db/catalog/rename_collection.cpp b/src/mongo/db/catalog/rename_collection.cpp
index 6c102754471..254ea796489 100644
--- a/src/mongo/db/catalog/rename_collection.cpp
+++ b/src/mongo/db/catalog/rename_collection.cpp
@@ -333,7 +333,17 @@ Status renameCollectionWithinDB(OperationContext* opCtx,
invariant(source.db() == target.db());
DisableDocumentValidation validationDisabler(opCtx);
- Lock::DBLock dbWriteLock(opCtx, source.db(), MODE_X);
+ Lock::DBLock dbWriteLock(opCtx, source.db(), MODE_IX);
+ boost::optional<Lock::CollectionLock> sourceLock;
+ boost::optional<Lock::CollectionLock> targetLock;
+ if (ResourceId(RESOURCE_COLLECTION, source.ns()) <
+ ResourceId(RESOURCE_COLLECTION, target.ns())) {
+ sourceLock.emplace(opCtx, source, MODE_X);
+ targetLock.emplace(opCtx, target, MODE_X);
+ } else {
+ targetLock.emplace(opCtx, target, MODE_X);
+ sourceLock.emplace(opCtx, source, MODE_X);
+ }
auto status = checkSourceAndTargetNamespaces(opCtx, source, target, options);
if (!status.isOK())