diff options
author | Paolo Polato <paolo.polato@mongodb.com> | 2022-10-17 12:27:49 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-10-17 12:57:32 +0000 |
commit | 7dd71ded76ed22c254b297edfb0485a28cd9aec8 (patch) | |
tree | e642bc10713efbbac12e2acb8eef96d6bd940173 | |
parent | 613df409e8e545cefb494c140565bdbe85838ce2 (diff) | |
download | mongo-7dd71ded76ed22c254b297edfb0485a28cd9aec8.tar.gz |
SERVER-70595 Fix error checks in enableSharding
-rw-r--r-- | src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp | 44 |
1 files changed, 27 insertions, 17 deletions
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 868e94b1a77..b719bba0c2e 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 @@ -117,14 +117,24 @@ DatabaseType ShardingCatalogManager::createDatabase( boost::optional<DDLLockManager::ScopedLock> dbLock; + // Resolve the shard against the received parameter (which may encode either a shard ID or a + // connection string). + if (optPrimaryShard) { + uassert(ErrorCodes::BadValue, + str::stream() << "invalid shard name: " << *optPrimaryShard, + optPrimaryShard->isValid()); + } + const auto shardRegistry = Grid::get(opCtx)->shardRegistry(); + auto resolvedPrimaryShard = optPrimaryShard + ? uassertStatusOK(shardRegistry->getShard(opCtx, *optPrimaryShard)) + : nullptr; + + const auto dbMatchFilter = [&] { BSONObjBuilder filterBuilder; filterBuilder.append(DatabaseType::kNameFieldName, dbName); - if (optPrimaryShard) { - uassert(ErrorCodes::BadValue, - str::stream() << "invalid shard name: " << *optPrimaryShard, - optPrimaryShard->isValid()); - filterBuilder.append(DatabaseType::kPrimaryFieldName, optPrimaryShard->toString()); + if (resolvedPrimaryShard) { + filterBuilder.append(DatabaseType::kPrimaryFieldName, resolvedPrimaryShard->getId()); } return filterBuilder.obj(); }(); @@ -151,7 +161,6 @@ DatabaseType ShardingCatalogManager::createDatabase( // Expensive createDatabase code path const auto catalogClient = Grid::get(opCtx)->catalogClient(); - const auto shardRegistry = Grid::get(opCtx)->shardRegistry(); // Check if a database already exists with the same name (case insensitive), and if so, return // the existing entry. @@ -174,8 +183,8 @@ DatabaseType ShardingCatalogManager::createDatabase( uassert( ErrorCodes::NamespaceExists, str::stream() << "database already created on a primary which is different from " - << *optPrimaryShard, - !optPrimaryShard || *optPrimaryShard == actualDb.getPrimary()); + << resolvedPrimaryShard->getId(), + !resolvedPrimaryShard || resolvedPrimaryShard->getId() == actualDb.getPrimary()); // We did a local read of the database entry above and found that the database already // exists. However, the data may not be majority committed (a previous createDatabase @@ -188,18 +197,19 @@ DatabaseType ShardingCatalogManager::createDatabase( uassertStatusOK(shardRegistry->getShard(opCtx, actualDb.getPrimary())), actualDb); } else { // The database does not exist. Insert an entry for the new database into the sharding - // catalog. - auto const shardPtr = uassertStatusOK(shardRegistry->getShard( - opCtx, - optPrimaryShard ? *optPrimaryShard - : selectShardForNewDatabase(opCtx, shardRegistry))); + // catalog. Assign also a primary shard if the caller hasn't specified one. + if (!resolvedPrimaryShard) { + resolvedPrimaryShard = uassertStatusOK(shardRegistry->getShard( + opCtx, selectShardForNewDatabase(opCtx, shardRegistry))); + } const auto now = VectorClock::get(opCtx)->getTime(); const auto clusterTime = now.clusterTime().asTimestamp(); // Pick a primary shard for the new database. - DatabaseType db( - dbName.toString(), shardPtr->getId(), DatabaseVersion(UUID::gen(), clusterTime)); + DatabaseType db(dbName.toString(), + resolvedPrimaryShard->getId(), + DatabaseVersion(UUID::gen(), clusterTime)); LOGV2(21938, "Registering new database {db} in sharding catalog", @@ -211,7 +221,7 @@ DatabaseType ShardingCatalogManager::createDatabase( NamespacePlacementType placementInfo( NamespaceString(dbName), clusterTime, - std::vector<mongo::ShardId>{shardPtr->getId()}); + std::vector<mongo::ShardId>{resolvedPrimaryShard->getId()}); withTransaction( opCtx, NamespaceString::kConfigDatabasesNamespace, @@ -239,7 +249,7 @@ DatabaseType ShardingCatalogManager::createDatabase( ShardingCatalogClient::kMajorityWriteConcern)); } - return std::make_pair(shardPtr, db); + return std::make_pair(resolvedPrimaryShard, db); } }(); |