summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/rename_collection.cpp
diff options
context:
space:
mode:
authorXiangyu Yao <xiangyu.yao@mongodb.com>2019-04-25 15:49:28 -0400
committerXiangyu Yao <xiangyu.yao@mongodb.com>2019-04-29 17:44:40 -0400
commita318e73c733daf24e617303055f52b1810a17a98 (patch)
treea7f234f2e7aa8c5a65409cfa18f672ca5aa1829f /src/mongo/db/catalog/rename_collection.cpp
parentf381a394a38f6f513a10615b07f0916b886fc3a9 (diff)
downloadmongo-a318e73c733daf24e617303055f52b1810a17a98.tar.gz
SERVER-39518 Use database MODE_IX lock for rename collections
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())