diff options
Diffstat (limited to 'src/mongo/db/catalog/drop_collection.cpp')
| -rw-r--r-- | src/mongo/db/catalog/drop_collection.cpp | 76 |
1 files changed, 27 insertions, 49 deletions
diff --git a/src/mongo/db/catalog/drop_collection.cpp b/src/mongo/db/catalog/drop_collection.cpp index 12e78022b2b..f04a8fa2b79 100644 --- a/src/mongo/db/catalog/drop_collection.cpp +++ b/src/mongo/db/catalog/drop_collection.cpp @@ -36,10 +36,9 @@ #include "mongo/db/audit.h" #include "mongo/db/catalog/collection_catalog.h" #include "mongo/db/catalog/collection_uuid_mismatch.h" -#include "mongo/db/catalog/collection_uuid_mismatch_info.h" #include "mongo/db/catalog/index_catalog.h" #include "mongo/db/client.h" -#include "mongo/db/concurrency/exception_util.h" +#include "mongo/db/concurrency/write_conflict_exception.h" #include "mongo/db/curop.h" #include "mongo/db/db_raii.h" #include "mongo/db/index_builds_coordinator.h" @@ -57,16 +56,7 @@ namespace { MONGO_FAIL_POINT_DEFINE(hangDropCollectionBeforeLockAcquisition); MONGO_FAIL_POINT_DEFINE(hangDuringDropCollection); -Status _checkNssAndReplState(OperationContext* opCtx, - const CollectionPtr& coll, - const NamespaceString& nss, - const boost::optional<UUID>& expectedUUID = boost::none) { - try { - checkCollectionUUIDMismatch(opCtx, nss, coll, expectedUUID); - } catch (const DBException& ex) { - return ex.toStatus(); - } - +Status _checkNssAndReplState(OperationContext* opCtx, const CollectionPtr& coll) { if (!coll) { return Status(ErrorCodes::NamespaceNotFound, "ns not found"); } @@ -205,13 +195,19 @@ Status _abortIndexBuildsAndDrop(OperationContext* opCtx, CollectionPtr coll = CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, startingNss); - Status status = _checkNssAndReplState(opCtx, coll, startingNss, expectedUUID); + Status status = _checkNssAndReplState(opCtx, coll); if (!status.isOK()) { return status; } warnEncryptedCollectionsIfNeeded(opCtx, coll); + try { + checkCollectionUUIDMismatch(opCtx, startingNss, coll, expectedUUID); + } catch (const DBException& ex) { + return ex.toStatus(); + } + if (MONGO_unlikely(hangDuringDropCollection.shouldFail())) { LOGV2(518090, "hangDuringDropCollection fail point enabled. Blocking until fail point is " @@ -260,7 +256,7 @@ Status _abortIndexBuildsAndDrop(OperationContext* opCtx, opCtx->recoveryUnit()->abandonSnapshot(); coll = CollectionCatalog::get(opCtx)->lookupCollectionByUUID(opCtx, collectionUUID); - status = _checkNssAndReplState(opCtx, coll, startingNss, expectedUUID); + status = _checkNssAndReplState(opCtx, coll); if (!status.isOK()) { return status; } @@ -308,7 +304,7 @@ Status _dropCollectionForApplyOps(OperationContext* opCtx, Lock::CollectionLock collLock(opCtx, collectionName, MODE_X); const CollectionPtr& coll = CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, collectionName); - Status status = _checkNssAndReplState(opCtx, coll, collectionName); + Status status = _checkNssAndReplState(opCtx, coll); if (!status.isOK()) { return status; } @@ -352,7 +348,6 @@ Status _dropCollection(OperationContext* opCtx, const boost::optional<UUID>& expectedUUID, DropReply* reply, DropCollectionSystemCollectionMode systemCollectionMode, - bool fromMigrate, boost::optional<UUID> dropIfUUIDNotMatching = boost::none) { try { @@ -360,13 +355,7 @@ Status _dropCollection(OperationContext* opCtx, AutoGetDb autoDb(opCtx, collectionName.db(), MODE_IX); auto db = autoDb.getDb(); if (!db) { - return expectedUUID - ? Status{CollectionUUIDMismatchInfo(collectionName.db().toString(), - *expectedUUID, - collectionName.coll().toString(), - boost::none), - "Database does not exist"} - : Status(ErrorCodes::NamespaceNotFound, "ns not found"); + return Status(ErrorCodes::NamespaceNotFound, "ns not found"); } if (CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, collectionName)) { @@ -375,14 +364,13 @@ Status _dropCollection(OperationContext* opCtx, std::move(autoDb), collectionName, expectedUUID, - [opCtx, systemCollectionMode, fromMigrate](Database* db, - const NamespaceString& resolvedNs) { + [opCtx, systemCollectionMode](Database* db, const NamespaceString& resolvedNs) { WriteUnitOfWork wuow(opCtx); auto status = systemCollectionMode == DropCollectionSystemCollectionMode::kDisallowSystemCollectionDrops - ? db->dropCollection(opCtx, resolvedNs, {}, fromMigrate) - : db->dropCollectionEvenIfSystem(opCtx, resolvedNs, {}, fromMigrate); + ? db->dropCollection(opCtx, resolvedNs) + : db->dropCollectionEvenIfSystem(opCtx, resolvedNs); if (!status.isOK()) { return status; } @@ -395,18 +383,14 @@ Status _dropCollection(OperationContext* opCtx, dropIfUUIDNotMatching); } - auto dropTimeseries = [opCtx, - &expectedUUID, - &autoDb, - &collectionName, - &reply, - fromMigrate](const NamespaceString& bucketNs, bool dropView) { + auto dropTimeseries = [opCtx, &expectedUUID, &autoDb, &collectionName, &reply]( + const NamespaceString& bucketNs, bool dropView) { return _abortIndexBuildsAndDrop( opCtx, std::move(autoDb), bucketNs, expectedUUID, - [opCtx, dropView, &expectedUUID, &collectionName, &reply, fromMigrate]( + [opCtx, dropView, &expectedUUID, &collectionName, &reply]( Database* db, const NamespaceString& bucketsNs) { // Disallow checking the expectedUUID when dropping time-series collections. uassert(ErrorCodes::InvalidOptions, @@ -430,13 +414,11 @@ Status _dropCollection(OperationContext* opCtx, // Drop the buckets collection in its own writeConflictRetry so that if // it throws a WCE, only the buckets collection drop is retried. - writeConflictRetry( - opCtx, "drop", bucketsNs.ns(), [opCtx, db, &bucketsNs, fromMigrate] { - WriteUnitOfWork wuow(opCtx); - db->dropCollectionEvenIfSystem(opCtx, bucketsNs, {}, fromMigrate) - .ignore(); - wuow.commit(); - }); + writeConflictRetry(opCtx, "drop", bucketsNs.ns(), [opCtx, db, &bucketsNs] { + WriteUnitOfWork wuow(opCtx); + db->dropCollectionEvenIfSystem(opCtx, bucketsNs).ignore(); + wuow.commit(); + }); return Status::OK(); }, @@ -486,8 +468,7 @@ Status dropCollection(OperationContext* opCtx, const NamespaceString& nss, const boost::optional<UUID>& expectedUUID, DropReply* reply, - DropCollectionSystemCollectionMode systemCollectionMode, - bool fromMigrate) { + DropCollectionSystemCollectionMode systemCollectionMode) { if (!serverGlobalParams.quiet.load()) { LOGV2(518070, "CMD: drop", logAttrs(nss)); } @@ -502,16 +483,14 @@ Status dropCollection(OperationContext* opCtx, const auto collectionName = nss.isTimeseriesBucketsCollection() ? nss.getTimeseriesViewNamespace() : nss; - return _dropCollection( - opCtx, collectionName, expectedUUID, reply, systemCollectionMode, fromMigrate); + return _dropCollection(opCtx, collectionName, expectedUUID, reply, systemCollectionMode); } Status dropCollection(OperationContext* opCtx, const NamespaceString& nss, DropReply* reply, - DropCollectionSystemCollectionMode systemCollectionMode, - bool fromMigrate) { - return dropCollection(opCtx, nss, boost::none, reply, systemCollectionMode, fromMigrate); + DropCollectionSystemCollectionMode systemCollectionMode) { + return dropCollection(opCtx, nss, boost::none, reply, systemCollectionMode); } Status dropCollectionIfUUIDNotMatching(OperationContext* opCtx, @@ -533,7 +512,6 @@ Status dropCollectionIfUUIDNotMatching(OperationContext* opCtx, boost::none, &repl, DropCollectionSystemCollectionMode::kDisallowSystemCollectionDrops, - false /*fromMigrate*/, expectedUUID); } |
