diff options
-rw-r--r-- | src/mongo/db/catalog/database.h | 7 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_impl.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_impl.h | 8 | ||||
-rw-r--r-- | src/mongo/db/catalog/drop_collection.cpp | 42 | ||||
-rw-r--r-- | src/mongo/db/catalog/drop_collection.h | 8 | ||||
-rw-r--r-- | src/mongo/db/s/drop_collection_coordinator.cpp | 26 |
6 files changed, 56 insertions, 42 deletions
diff --git a/src/mongo/db/catalog/database.h b/src/mongo/db/catalog/database.h index 2640abefbcb..f3a5a1393be 100644 --- a/src/mongo/db/catalog/database.h +++ b/src/mongo/db/catalog/database.h @@ -110,13 +110,18 @@ public: * If we are applying a 'drop' oplog entry on a secondary, 'dropOpTime' will contain the optime * of the oplog entry. * + * When fromMigrate is set, the related oplog entry will be marked with a 'fromMigrate' field to + * reduce its visibility (e.g. in change streams). + * * The caller should hold a DB X lock and ensure there are no index builds in progress on the * collection. * N.B. Namespace argument is passed by value as it may otherwise disappear or change. */ virtual Status dropCollection(OperationContext* opCtx, NamespaceString nss, - repl::OpTime dropOpTime = {}) const = 0; + repl::OpTime dropOpTime = {}, + bool markFromMigrate = false) const = 0; + virtual Status dropCollectionEvenIfSystem(OperationContext* opCtx, NamespaceString nss, repl::OpTime dropOpTime = {}, diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp index d57eeb7140d..47001b96eee 100644 --- a/src/mongo/db/catalog/database_impl.cpp +++ b/src/mongo/db/catalog/database_impl.cpp @@ -299,7 +299,7 @@ void DatabaseImpl::clearTmpCollections(OperationContext* opCtx) const { CollectionCatalog::CollectionInfoFn callback = [&](const CollectionPtr& collection) { try { WriteUnitOfWork wuow(opCtx); - Status status = dropCollection(opCtx, collection->ns(), {}); + Status status = dropCollection(opCtx, collection->ns(), {}, false); if (!status.isOK()) { LOGV2_WARNING(20327, "could not drop temp collection '{namespace}': {error}", @@ -438,7 +438,8 @@ Status DatabaseImpl::dropView(OperationContext* opCtx, NamespaceString viewName) Status DatabaseImpl::dropCollection(OperationContext* opCtx, NamespaceString nss, - repl::OpTime dropOpTime) const { + repl::OpTime dropOpTime, + bool markFromMigrate) const { // Cannot drop uncommitted collections. invariant(!UncommittedCatalogUpdates::isCreatedCollection(opCtx, nss)); @@ -474,7 +475,7 @@ Status DatabaseImpl::dropCollection(OperationContext* opCtx, } } - return dropCollectionEvenIfSystem(opCtx, nss, dropOpTime); + return dropCollectionEvenIfSystem(opCtx, nss, dropOpTime, markFromMigrate); } Status DatabaseImpl::dropCollectionEvenIfSystem(OperationContext* opCtx, diff --git a/src/mongo/db/catalog/database_impl.h b/src/mongo/db/catalog/database_impl.h index fa09177bc1b..c87f811c7d8 100644 --- a/src/mongo/db/catalog/database_impl.h +++ b/src/mongo/db/catalog/database_impl.h @@ -62,16 +62,20 @@ public: * If we are applying a 'drop' oplog entry on a secondary, 'dropOpTime' will contain the optime * of the oplog entry. * + * When fromMigrate is set, the related oplog entry will be marked with a 'fromMigrate' field to + * reduce its visibility (e.g. in change streams). + * * The caller should hold a DB X lock and ensure there are no index builds in progress on the * collection. */ Status dropCollection(OperationContext* opCtx, NamespaceString nss, - repl::OpTime dropOpTime) const final; + repl::OpTime dropOpTime, + bool markFromMigrate) const final; Status dropCollectionEvenIfSystem(OperationContext* opCtx, NamespaceString nss, repl::OpTime dropOpTime, - bool markFromMigrate = false) const final; + bool markFromMigrate) const final; Status dropView(OperationContext* opCtx, NamespaceString viewName) const final; diff --git a/src/mongo/db/catalog/drop_collection.cpp b/src/mongo/db/catalog/drop_collection.cpp index 58c4dfe8a74..f73dd465eb0 100644 --- a/src/mongo/db/catalog/drop_collection.cpp +++ b/src/mongo/db/catalog/drop_collection.cpp @@ -352,6 +352,7 @@ Status _dropCollection(OperationContext* opCtx, const boost::optional<UUID>& expectedUUID, DropReply* reply, DropCollectionSystemCollectionMode systemCollectionMode, + bool fromMigrate, boost::optional<UUID> dropIfUUIDNotMatching = boost::none) { try { @@ -374,13 +375,14 @@ Status _dropCollection(OperationContext* opCtx, std::move(autoDb), collectionName, expectedUUID, - [opCtx, systemCollectionMode](Database* db, const NamespaceString& resolvedNs) { + [opCtx, systemCollectionMode, fromMigrate](Database* db, + const NamespaceString& resolvedNs) { WriteUnitOfWork wuow(opCtx); auto status = systemCollectionMode == DropCollectionSystemCollectionMode::kDisallowSystemCollectionDrops - ? db->dropCollection(opCtx, resolvedNs) - : db->dropCollectionEvenIfSystem(opCtx, resolvedNs); + ? db->dropCollection(opCtx, resolvedNs, {}, fromMigrate) + : db->dropCollectionEvenIfSystem(opCtx, resolvedNs, {}, fromMigrate); if (!status.isOK()) { return status; } @@ -393,14 +395,18 @@ Status _dropCollection(OperationContext* opCtx, dropIfUUIDNotMatching); } - auto dropTimeseries = [opCtx, &expectedUUID, &autoDb, &collectionName, &reply]( - const NamespaceString& bucketNs, bool dropView) { + auto dropTimeseries = [opCtx, + &expectedUUID, + &autoDb, + &collectionName, + &reply, + fromMigrate](const NamespaceString& bucketNs, bool dropView) { return _abortIndexBuildsAndDrop( opCtx, std::move(autoDb), bucketNs, expectedUUID, - [opCtx, dropView, &expectedUUID, &collectionName, &reply]( + [opCtx, dropView, &expectedUUID, &collectionName, &reply, fromMigrate]( Database* db, const NamespaceString& bucketsNs) { // Disallow checking the expectedUUID when dropping time-series collections. uassert(ErrorCodes::InvalidOptions, @@ -424,11 +430,13 @@ 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] { - WriteUnitOfWork wuow(opCtx); - db->dropCollectionEvenIfSystem(opCtx, bucketsNs).ignore(); - wuow.commit(); - }); + writeConflictRetry( + opCtx, "drop", bucketsNs.ns(), [opCtx, db, &bucketsNs, fromMigrate] { + WriteUnitOfWork wuow(opCtx); + db->dropCollectionEvenIfSystem(opCtx, bucketsNs, {}, fromMigrate) + .ignore(); + wuow.commit(); + }); return Status::OK(); }, @@ -478,7 +486,8 @@ Status dropCollection(OperationContext* opCtx, const NamespaceString& nss, const boost::optional<UUID>& expectedUUID, DropReply* reply, - DropCollectionSystemCollectionMode systemCollectionMode) { + DropCollectionSystemCollectionMode systemCollectionMode, + bool fromMigrate) { if (!serverGlobalParams.quiet.load()) { LOGV2(518070, "CMD: drop", logAttrs(nss)); } @@ -493,14 +502,16 @@ Status dropCollection(OperationContext* opCtx, const auto collectionName = nss.isTimeseriesBucketsCollection() ? nss.getTimeseriesViewNamespace() : nss; - return _dropCollection(opCtx, collectionName, expectedUUID, reply, systemCollectionMode); + return _dropCollection( + opCtx, collectionName, expectedUUID, reply, systemCollectionMode, fromMigrate); } Status dropCollection(OperationContext* opCtx, const NamespaceString& nss, DropReply* reply, - DropCollectionSystemCollectionMode systemCollectionMode) { - return dropCollection(opCtx, nss, boost::none, reply, systemCollectionMode); + DropCollectionSystemCollectionMode systemCollectionMode, + bool fromMigrate) { + return dropCollection(opCtx, nss, boost::none, reply, systemCollectionMode, fromMigrate); } Status dropCollectionIfUUIDNotMatching(OperationContext* opCtx, @@ -522,6 +533,7 @@ Status dropCollectionIfUUIDNotMatching(OperationContext* opCtx, boost::none, &repl, DropCollectionSystemCollectionMode::kDisallowSystemCollectionDrops, + false /*fromMigrate*/, expectedUUID); } diff --git a/src/mongo/db/catalog/drop_collection.h b/src/mongo/db/catalog/drop_collection.h index 7f857d88547..016bc5e3d1a 100644 --- a/src/mongo/db/catalog/drop_collection.h +++ b/src/mongo/db/catalog/drop_collection.h @@ -50,17 +50,21 @@ enum class DropCollectionSystemCollectionMode { * Drops the collection "collectionName" and populates "reply" with statistics about what * was removed. Aborts in-progress index builds on the collection if two phase index builds are * supported. Throws if the expectedUUID does not match the UUID of the collection being dropped. + * When fromMigrate is set, the related oplog entry will be marked accordingly using the + * 'fromMigrate' field to reduce its visibility (e.g. in change streams). */ Status dropCollection(OperationContext* opCtx, const NamespaceString& collectionName, const boost::optional<UUID>& expectedUUID, DropReply* reply, - DropCollectionSystemCollectionMode systemCollectionMode); + DropCollectionSystemCollectionMode systemCollectionMode, + bool fromMigrate = false); Status dropCollection(OperationContext* opCtx, const NamespaceString& collectionName, DropReply* reply, - DropCollectionSystemCollectionMode systemCollectionMode); + DropCollectionSystemCollectionMode systemCollectionMode, + bool fromMigrate = false); /** * Drops the collection "collectionName" only if its uuid is not matching "expectedUUID". diff --git a/src/mongo/db/s/drop_collection_coordinator.cpp b/src/mongo/db/s/drop_collection_coordinator.cpp index 11c6fe8d601..16269e0f9e8 100644 --- a/src/mongo/db/s/drop_collection_coordinator.cpp +++ b/src/mongo/db/s/drop_collection_coordinator.cpp @@ -44,24 +44,6 @@ #include "mongo/s/request_types/sharded_ddl_commands_gen.h" namespace mongo { -namespace { - -void dropCollectionHonouringFromMigrateFlag(OperationContext* opCtx, - const NamespaceString& nss, - bool fromMigrate) { - if (fromMigrate) { - mongo::sharding_ddl_util::ensureCollectionDroppedNoChangeEvent(opCtx, nss); - } else { - DropReply unused; - uassertStatusOK( - dropCollection(opCtx, - nss, - &unused, - DropCollectionSystemCollectionMode::kDisallowSystemCollectionDrops)); - } -} - -} // namespace DropCollectionCoordinator::DropCollectionCoordinator(ShardingDDLCoordinatorService* service, const BSONObj& initialState) @@ -106,7 +88,13 @@ void DropCollectionCoordinator::dropCollectionLocally(OperationContext* opCtx, } try { - dropCollectionHonouringFromMigrateFlag(opCtx, nss, fromMigrate); + DropReply unused; + uassertStatusOK( + dropCollection(opCtx, + nss, + &unused, + DropCollectionSystemCollectionMode::kDisallowSystemCollectionDrops, + fromMigrate)); } catch (const ExceptionFor<ErrorCodes::NamespaceNotFound>&) { // Note that even if the namespace was not found we have to execute the code below! LOGV2_DEBUG(5280920, |