summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Polato <paolo.polato@mongodb.com>2023-05-17 08:05:19 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-05-17 14:53:31 +0000
commite0286ae7b2983e7bc1a4148c36e2cd499b13d824 (patch)
tree02c3318d8d830dc3ea360bb1d1f7294bd40e3982
parent69fe62f002e8ff54a832aecb3b9df01f25d25775 (diff)
downloadmongo-e0286ae7b2983e7bc1a4148c36e2cd499b13d824.tar.gz
SERVER-76908 Fix generation and format of the "createDatabase" op entries
(cherry picked from commit 1c390a0c50104a04cbd8ecbefb99eaf22e1bc914)
-rw-r--r--etc/backports_required_for_multiversion_tests.yml4
-rw-r--r--jstests/sharding/ddl_commits_with_two_phase_oplog_notification.js18
-rw-r--r--src/mongo/db/commands/notify_sharding_event.idl1
-rw-r--r--src/mongo/db/repl/change_stream_oplog_notification.cpp25
-rw-r--r--src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp16
-rw-r--r--src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp4
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));