summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog_raii.cpp
diff options
context:
space:
mode:
authorXiangyu Yao <xiangyu.yao@mongodb.com>2019-04-25 14:54:48 -0400
committerXiangyu Yao <xiangyu.yao@mongodb.com>2019-04-25 15:11:04 -0400
commit3a8c33cd95abaa7455b2c01726bdbf413cc938e5 (patch)
tree568bf26f33eaea6c5f6ccf87c2d58b438cd5fc0e /src/mongo/db/catalog_raii.cpp
parentaa4903255505f9072581e8ea4c63b93093f04508 (diff)
downloadmongo-3a8c33cd95abaa7455b2c01726bdbf413cc938e5.tar.gz
SERVER-39520 Use database IX lock for dropCollection
Diffstat (limited to 'src/mongo/db/catalog_raii.cpp')
-rw-r--r--src/mongo/db/catalog_raii.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/mongo/db/catalog_raii.cpp b/src/mongo/db/catalog_raii.cpp
index 20bf489ca71..aee75fed1f8 100644
--- a/src/mongo/db/catalog_raii.cpp
+++ b/src/mongo/db/catalog_raii.cpp
@@ -75,7 +75,17 @@ AutoGetCollection::AutoGetCollection(OperationContext* opCtx,
modeDB,
deadline),
_resolvedNss(resolveNamespaceStringOrUUID(opCtx, nsOrUUID)) {
- _collLock.emplace(opCtx, _resolvedNss, modeColl, deadline);
+
+ NamespaceString resolvedNssWithLock;
+ do {
+ _collLock.emplace(opCtx, _resolvedNss, modeColl, deadline);
+
+ // We looked up nsOrUUID without a collection lock so it's possible that the
+ // collection is dropped now. Look it up again.
+ resolvedNssWithLock = resolveNamespaceStringOrUUID(opCtx, nsOrUUID);
+ } while (_resolvedNss != resolvedNssWithLock);
+ _resolvedNss = resolvedNssWithLock;
+
// Wait for a configured amount of time after acquiring locks if the failpoint is enabled
MONGO_FAIL_POINT_BLOCK(setAutoGetCollectionWait, customWait) {
const BSONObj& data = customWait.getData();