diff options
author | Paolo Polato <paolo.polato@mongodb.com> | 2023-05-17 08:05:19 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-05-17 14:53:31 +0000 |
commit | e0286ae7b2983e7bc1a4148c36e2cd499b13d824 (patch) | |
tree | 02c3318d8d830dc3ea360bb1d1f7294bd40e3982 | |
parent | 69fe62f002e8ff54a832aecb3b9df01f25d25775 (diff) | |
download | mongo-e0286ae7b2983e7bc1a4148c36e2cd499b13d824.tar.gz |
SERVER-76908 Fix generation and format of the "createDatabase" op entries
(cherry picked from commit 1c390a0c50104a04cbd8ecbefb99eaf22e1bc914)
6 files changed, 39 insertions, 29 deletions
diff --git a/etc/backports_required_for_multiversion_tests.yml b/etc/backports_required_for_multiversion_tests.yml index afe4f61bb11..2a94cfe8d69 100644 --- a/etc/backports_required_for_multiversion_tests.yml +++ b/etc/backports_required_for_multiversion_tests.yml @@ -372,6 +372,8 @@ last-continuous: ticket: SERVER-76394 - 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/resharding_with_multi_deletes_reduced_ticket_pool_size.js @@ -835,6 +837,8 @@ last-lts: ticket: SERVER-76394 - 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/resharding_with_multi_deletes_reduced_ticket_pool_size.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 518c4560785..278d4f21270 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 59eb895707f..f1d65770d5d 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,12 +233,12 @@ 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({DatabaseName(dbName)}, false /*areImported*/); - prepareCommitEvent.setPhase(CommitPhaseEnum::kPrepare); + DatabasesAdded prepareCommitEvent( + {DatabaseName(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, @@ -277,10 +277,10 @@ DatabaseType ShardingCatalogManager::createDatabase( hangBeforeNotifyingCreateDatabaseCommitted.pauseWhileSet(); - DatabasesAdded commitCompletedEvent({DatabaseName(dbName)}, false /*areImported*/); - commitCompletedEvent.setPhase(CommitPhaseEnum::kSuccessful); - const auto notificationOutcome = _notifyClusterOnNewDatabases( - opCtx, commitCompletedEvent, {resolvedPrimaryShard->getId()}); + DatabasesAdded commitCompletedEvent( + {DatabaseName(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 4e429c36825..04b8e0a9c05 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 @@ -1433,8 +1433,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)); |