diff options
author | Xiangyu Yao <xiangyu.yao@mongodb.com> | 2019-04-25 15:49:28 -0400 |
---|---|---|
committer | Xiangyu Yao <xiangyu.yao@mongodb.com> | 2019-04-29 17:44:40 -0400 |
commit | a318e73c733daf24e617303055f52b1810a17a98 (patch) | |
tree | a7f234f2e7aa8c5a65409cfa18f672ca5aa1829f /src/mongo/db/catalog/rename_collection.cpp | |
parent | f381a394a38f6f513a10615b07f0916b886fc3a9 (diff) | |
download | mongo-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.cpp | 12 |
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()) |