From 1c390a0c50104a04cbd8ecbefb99eaf22e1bc914 Mon Sep 17 00:00:00 2001 From: Paolo Polato Date: Wed, 17 May 2023 08:05:19 +0000 Subject: SERVER-76908 Fix generation and format of the "createDatabase" op entries --- etc/backports_required_for_multiversion_tests.yml | 4 ++++ ...dl_commits_with_two_phase_oplog_notification.js | 18 +++++++--------- src/mongo/db/commands/notify_sharding_event.idl | 1 - .../db/repl/change_stream_oplog_notification.cpp | 25 +++++++++++++++------- ...harding_catalog_manager_database_operations.cpp | 18 +++++++++------- .../sharding_catalog_manager_shard_operations.cpp | 4 ++-- 6 files changed, 41 insertions(+), 29 deletions(-) diff --git a/etc/backports_required_for_multiversion_tests.yml b/etc/backports_required_for_multiversion_tests.yml index 4b1e0609069..4df96f221a8 100644 --- a/etc/backports_required_for_multiversion_tests.yml +++ b/etc/backports_required_for_multiversion_tests.yml @@ -377,6 +377,8 @@ last-continuous: ticket: SERVER-76550 - test_file: jstests/sharding/analyze_shard_key/monotonicity_hashed_sharding_compound.js ticket: SERVER-76719 + - test_file: jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js + ticket: SERVER-76908 - test_file: jstests/sharding/shard_keys_with_dollar_sign.js ticket: SERVER-76948 - test_file: jstests/sharding/merge_let_params_size_estimation.js @@ -848,6 +850,8 @@ last-lts: ticket: SERVER-76719 - test_file: jstests/sharding/implicit_create_collection_triggered_by_DDLs.js ticket: SERVER-76489 + - test_file: jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js + ticket: SERVER-76908 - test_file: jstests/sharding/shard_keys_with_dollar_sign.js ticket: SERVER-76948 - test_file: jstests/sharding/merge_let_params_size_estimation.js diff --git a/jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js b/jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js index 9502c94b312..500fb695c5b 100644 --- a/jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js +++ b/jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js @@ -10,26 +10,24 @@ load('jstests/libs/fail_point_util.js'); load('jstests/libs/parallel_shell_helpers.js'); -const kPrepareCommit = 0; -const kCommitSuccessful = 1; - const st = new ShardingTest({shards: 2, chunkSize: 1}); function verifyOpEntriesForDatabaseOnRS(dbName, isImported, dbPrimaryShard, replicaSet) { const primaryNodeOplog = replicaSet.getPrimary().getDB('local').oplog.rs; - const generatedOpEntries = primaryNodeOplog.find({'o.msg.createDatabase': dbName}).toArray(); - assert.eq(2, generatedOpEntries.length); + const latestInternalOpEntries = + primaryNodeOplog.find({op: 'n', ns: dbName}).sort({ts: -1}).limit(2).toArray().reverse(); + assert.eq(2, latestInternalOpEntries.length); - const prepareCommitEntry = generatedOpEntries[0]; - assert.eq(dbName, prepareCommitEntry.o2.createDatabase); - assert.eq(kPrepareCommit, prepareCommitEntry.o2.phase); + const prepareCommitEntry = latestInternalOpEntries[0]; + assert.eq(dbName, prepareCommitEntry.o.msg.createDatabasePrepare); + assert.eq(dbName, prepareCommitEntry.o2.createDatabasePrepare); assert.eq(isImported, prepareCommitEntry.o2.isImported); assert.eq(dbPrimaryShard, prepareCommitEntry.o2.primaryShard); - const commitSuccessfulEntry = generatedOpEntries[1]; + const commitSuccessfulEntry = latestInternalOpEntries[1]; + assert.eq(dbName, commitSuccessfulEntry.o.msg.createDatabase); assert.eq(dbName, commitSuccessfulEntry.o2.createDatabase); - assert.eq(kCommitSuccessful, commitSuccessfulEntry.o2.phase); assert.eq(isImported, commitSuccessfulEntry.o2.isImported); assert.eq(undefined, commitSuccessfulEntry.o2.primaryShard); } diff --git a/src/mongo/db/commands/notify_sharding_event.idl b/src/mongo/db/commands/notify_sharding_event.idl index 19720db4eb2..f8459c58c29 100644 --- a/src/mongo/db/commands/notify_sharding_event.idl +++ b/src/mongo/db/commands/notify_sharding_event.idl @@ -75,7 +75,6 @@ structs: phase: description: "The sub-phase of the event being notified." type: CommitPhase - optional: true commands: _shardsvrNotifyShardingEvent: diff --git a/src/mongo/db/repl/change_stream_oplog_notification.cpp b/src/mongo/db/repl/change_stream_oplog_notification.cpp index 1c8fb6a78c2..0f8e1a2e0b2 100644 --- a/src/mongo/db/repl/change_stream_oplog_notification.cpp +++ b/src/mongo/db/repl/change_stream_oplog_notification.cpp @@ -102,20 +102,29 @@ void notifyChangeStreamsOnShardCollection(OperationContext* opCtx, void notifyChangeStreamsOnDatabaseAdded(OperationContext* opCtx, const DatabasesAdded& databasesAddedNotification) { - const auto& notifiedPhase = databasesAddedNotification.getPhase(); + const std::string operationName = [&] { + switch (databasesAddedNotification.getPhase()) { + case CommitPhaseEnum::kSuccessful: + return "createDatabase"; + case CommitPhaseEnum::kAborted: + return "createDatabaseAbort"; + case CommitPhaseEnum::kPrepare: + return "createDatabasePrepare"; + default: + MONGO_UNREACHABLE; + } + }(); + for (const auto& dbName : databasesAddedNotification.getNames()) { repl::MutableOplogEntry oplogEntry; oplogEntry.setOpType(repl::OpTypeEnum::kNoop); oplogEntry.setNss(NamespaceString(dbName)); oplogEntry.setTid(dbName.tenantId()); - oplogEntry.setObject(BSON("msg" << BSON("createDatabase" << dbName.db()))); + oplogEntry.setObject(BSON("msg" << BSON(operationName << dbName.db()))); BSONObjBuilder o2Builder; - o2Builder.append("createDatabase", dbName.db()); - if (notifiedPhase) { - o2Builder.append("phase", *notifiedPhase); - if (*notifiedPhase == CommitPhaseEnum::kPrepare) { - o2Builder.append("primaryShard", *databasesAddedNotification.getPrimaryShard()); - } + o2Builder.append(operationName, dbName.db()); + if (databasesAddedNotification.getPhase() == CommitPhaseEnum::kPrepare) { + o2Builder.append("primaryShard", *databasesAddedNotification.getPrimaryShard()); } o2Builder.append("isImported", databasesAddedNotification.getAreImported()); diff --git a/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp b/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp index 2f77383c745..19b2c07def0 100644 --- a/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp +++ b/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp @@ -233,13 +233,14 @@ DatabaseType ShardingCatalogManager::createDatabase( // - a "commitSuccessful" notification after completing the write into config.databases // will allow change streams to stop collecting events on the namespace created from // shards != resolvedPrimaryShard. + const auto allShards = Grid::get(opCtx)->shardRegistry()->getAllShardIds(opCtx); { DatabasesAdded prepareCommitEvent( - {DatabaseNameUtil::deserialize(boost::none, dbName)}, false /*areImported*/); - prepareCommitEvent.setPhase(CommitPhaseEnum::kPrepare); + {DatabaseNameUtil::deserialize(boost::none, dbName)}, + false /*areImported*/, + CommitPhaseEnum::kPrepare); prepareCommitEvent.setPrimaryShard(resolvedPrimaryShard->getId()); - uassertStatusOK(_notifyClusterOnNewDatabases( - opCtx, prepareCommitEvent, {resolvedPrimaryShard->getId()})); + uassertStatusOK(_notifyClusterOnNewDatabases(opCtx, prepareCommitEvent, allShards)); } const auto transactionChain = [db](const txn_api::TransactionClient& txnClient, @@ -279,10 +280,11 @@ DatabaseType ShardingCatalogManager::createDatabase( hangBeforeNotifyingCreateDatabaseCommitted.pauseWhileSet(); DatabasesAdded commitCompletedEvent( - {DatabaseNameUtil::deserialize(boost::none, dbName)}, false /*areImported*/); - commitCompletedEvent.setPhase(CommitPhaseEnum::kSuccessful); - const auto notificationOutcome = _notifyClusterOnNewDatabases( - opCtx, commitCompletedEvent, {resolvedPrimaryShard->getId()}); + {DatabaseNameUtil::deserialize(boost::none, dbName)}, + false /*areImported*/, + CommitPhaseEnum::kSuccessful); + const auto notificationOutcome = + _notifyClusterOnNewDatabases(opCtx, commitCompletedEvent, allShards); if (!notificationOutcome.isOK()) { LOGV2_WARNING(7175500, "Unable to send out notification of successful createDatabase", diff --git a/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp b/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp index d964c31d4c6..d1a2781012d 100644 --- a/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp +++ b/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp @@ -1436,8 +1436,8 @@ void ShardingCatalogManager::_addShardInTransaction( databasesInNewShard.end(), std::back_inserter(importedDbNames), [](const std::string& s) { return DatabaseNameUtil::deserialize(boost::none, s); }); - DatabasesAdded notification(std::move(importedDbNames), true /*addImported*/); - notification.setPhase(CommitPhaseEnum::kPrepare); + DatabasesAdded notification( + std::move(importedDbNames), true /*addImported*/, CommitPhaseEnum::kPrepare); notification.setPrimaryShard(ShardId(newShard.getName())); uassertStatusOK(_notifyClusterOnNewDatabases(opCtx, notification, existingShardIds)); -- cgit v1.2.1