summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Polato <paolo.polato@mongodb.com>2022-12-28 09:34:41 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-12-28 14:09:21 +0000
commit5928ed5d805665d9256f65c797a5eb0be5425631 (patch)
tree51c7e22703f591cd60bb6149f83e1cff3b790dad
parent2bc76ce4137e96972820113efc98d37747090c7f (diff)
downloadmongo-5928ed5d805665d9256f65c797a5eb0be5425631.tar.gz
SERVER-71880 Expose fromMigrate parameter in dropCollection() API methods
(cherry picked from commit d25e0fcfe72f2a39f744e3e1e085361ff73184ad)
-rw-r--r--src/mongo/db/catalog/database.h7
-rw-r--r--src/mongo/db/catalog/database_impl.cpp7
-rw-r--r--src/mongo/db/catalog/database_impl.h8
-rw-r--r--src/mongo/db/catalog/drop_collection.cpp42
-rw-r--r--src/mongo/db/catalog/drop_collection.h8
-rw-r--r--src/mongo/db/s/drop_collection_coordinator.cpp26
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,