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 09:24:45 +0000
commit1c390a0c50104a04cbd8ecbefb99eaf22e1bc914 (patch)
tree26ddbb6e5c389253de3120e3ce6eae01d941f2c2
parentfa994d0377ddc7a10b760a5bde75239d76b7f1e7 (diff)
downloadmongo-1c390a0c50104a04cbd8ecbefb99eaf22e1bc914.tar.gz
SERVER-76908 Fix generation and format of the "createDatabase" op entries
-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.cpp18
-rw-r--r--src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp4
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));