diff options
31 files changed, 104 insertions, 101 deletions
diff --git a/src/mongo/db/commands.cpp b/src/mongo/db/commands.cpp index c84ff1f729f..8c8c313ac76 100644 --- a/src/mongo/db/commands.cpp +++ b/src/mongo/db/commands.cpp @@ -909,7 +909,7 @@ private: } NamespaceString ns() const override { - return NamespaceString(_dbName.tenantId(), _command->parseNs(_dbName.toString(), cmdObj())); + return _command->parseNs(_dbName, cmdObj()); } bool supportsWriteConcern() const override { diff --git a/src/mongo/db/commands.h b/src/mongo/db/commands.h index 83c44496d3c..7ddbfc8bb19 100644 --- a/src/mongo/db/commands.h +++ b/src/mongo/db/commands.h @@ -852,12 +852,13 @@ private: public: using Command::Command; - virtual std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const { - return CommandHelpers::parseNsFromCommand(dbname, cmdObj); + virtual NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const { + return CommandHelpers::parseNsFromCommand(dbName, cmdObj); } ResourcePattern parseResourcePattern(const std::string& dbname, const BSONObj& cmdObj) const { - return CommandHelpers::resourcePatternForNamespace(parseNs(dbname, cmdObj)); + return CommandHelpers::resourcePatternForNamespace( + parseNs({boost::none, dbname}, cmdObj).ns()); } // diff --git a/src/mongo/db/commands/dbcommands.cpp b/src/mongo/db/commands/dbcommands.cpp index 1c42ac72260..e18644c0649 100644 --- a/src/mongo/db/commands/dbcommands.cpp +++ b/src/mongo/db/commands/dbcommands.cpp @@ -547,7 +547,7 @@ public: virtual Status checkAuthForCommand(Client* client, const std::string& dbname, const BSONObj& cmdObj) const { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); return auth::checkAuthForCollMod( client->getOperationContext(), AuthorizationSession::get(client), nss, cmdObj, false); } diff --git a/src/mongo/db/commands/dbcommands_d.cpp b/src/mongo/db/commands/dbcommands_d.cpp index 50f2acdb4df..2dee3bf87ec 100644 --- a/src/mongo/db/commands/dbcommands_d.cpp +++ b/src/mongo/db/commands/dbcommands_d.cpp @@ -225,7 +225,8 @@ public: return true; } - virtual std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const { + virtual NamespaceString parseNs(const DatabaseName& dbName, + const BSONObj& cmdObj) const override { std::string collectionName; if (const auto rootElt = cmdObj["root"]) { uassert(ErrorCodes::InvalidNamespace, @@ -236,7 +237,7 @@ public: if (collectionName.empty()) collectionName = "fs"; collectionName += ".chunks"; - return NamespaceString(dbname, collectionName).ns(); + return NamespaceString(dbName, collectionName); } virtual void addRequiredPrivileges(const std::string& dbname, @@ -249,7 +250,7 @@ public: const std::string& dbname, const BSONObj& jsobj, BSONObjBuilder& result) { - const NamespaceString nss(parseNs(dbname, jsobj)); + const NamespaceString nss(parseNs({boost::none, dbname}, jsobj)); md5digest d; md5_state_t st; diff --git a/src/mongo/db/commands/dbhash.cpp b/src/mongo/db/commands/dbhash.cpp index df99d555d30..e00188d8cea 100644 --- a/src/mongo/db/commands/dbhash.cpp +++ b/src/mongo/db/commands/dbhash.cpp @@ -134,7 +134,11 @@ public: } } - const std::string ns = parseNs(dbname, cmdObj); + // TODO SERVER-67827: Pass dbName obj directly. + const DatabaseName dbName(boost::none, dbname); + // For empty databasename on first command field, the following code depends on the "." + // on ns to find the invalid empty db name instead of checking empty db name directly. + const std::string ns = parseNs(dbName, cmdObj).ns(); uassert(ErrorCodes::InvalidNamespace, str::stream() << "Invalid db name: " << ns, NamespaceString::validDBName(ns, NamespaceString::DollarInDbNameBehavior::Allow)); @@ -222,7 +226,7 @@ public: shouldNotConflictBlock.emplace(opCtx->lockState()); } - // TODO SERVER-67459 Pass dbName obj directly + // TODO SERVER-67827: Pass dbName obj directly. AutoGetDb autoDb(opCtx, DatabaseName(boost::none, ns), lockMode); Database* db = autoDb.getDb(); @@ -236,9 +240,8 @@ public: std::set<std::string> cappedCollectionSet; bool noError = true; - const DatabaseName tenantDbName(boost::none, dbname); catalog::forEachCollectionFromDb( - opCtx, tenantDbName, MODE_IS, [&](const CollectionPtr& collection) { + opCtx, dbName, MODE_IS, [&](const CollectionPtr& collection) { auto collNss = collection->ns(); if (collNss.size() - 1 <= dbname.size()) { diff --git a/src/mongo/db/commands/rename_collection_cmd.cpp b/src/mongo/db/commands/rename_collection_cmd.cpp index f7876b7690a..aacffc21439 100644 --- a/src/mongo/db/commands/rename_collection_cmd.cpp +++ b/src/mongo/db/commands/rename_collection_cmd.cpp @@ -85,8 +85,8 @@ public: return " example: { renameCollection: foo.a, to: bar.b }"; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } virtual bool errmsgRun(OperationContext* opCtx, diff --git a/src/mongo/db/s/check_sharding_index_command.cpp b/src/mongo/db/s/check_sharding_index_command.cpp index 004c23b2d31..79db79a2b56 100644 --- a/src/mongo/db/s/check_sharding_index_command.cpp +++ b/src/mongo/db/s/check_sharding_index_command.cpp @@ -66,8 +66,8 @@ public: out->push_back(Privilege(parseResourcePattern(dbname, cmdObj), actions)); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool errmsgRun(OperationContext* opCtx, @@ -75,7 +75,7 @@ public: const BSONObj& jsobj, std::string& errmsg, BSONObjBuilder& result) override { - const NamespaceString nss = NamespaceString(parseNs(dbname, jsobj)); + const NamespaceString nss(parseNs({boost::none, dbname}, jsobj)); BSONObj keyPattern = jsobj.getObjectField("keyPattern"); if (keyPattern.isEmpty()) { diff --git a/src/mongo/db/s/config/configsvr_repair_sharded_collection_chunks_history_command.cpp b/src/mongo/db/s/config/configsvr_repair_sharded_collection_chunks_history_command.cpp index ba05c5448e4..6413f26e5ef 100644 --- a/src/mongo/db/s/config/configsvr_repair_sharded_collection_chunks_history_command.cpp +++ b/src/mongo/db/s/config/configsvr_repair_sharded_collection_chunks_history_command.cpp @@ -68,8 +68,8 @@ public: return true; } - std::string parseNs(const std::string& unusedDbName, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } Status checkAuthForCommand(Client* client, @@ -96,7 +96,7 @@ public: CommandHelpers::uassertCommandRunWithMajority(getName(), opCtx->getWriteConcern()); - const NamespaceString nss{parseNs(unusedDbName, cmdObj)}; + const NamespaceString nss{parseNs({boost::none, unusedDbName}, cmdObj)}; auto currentTime = VectorClock::get(opCtx)->getTime(); auto validAfter = currentTime.configTime().asTimestamp(); diff --git a/src/mongo/db/s/config/configsvr_split_chunk_command.cpp b/src/mongo/db/s/config/configsvr_split_chunk_command.cpp index eca7baf2f00..3e8fef11c20 100644 --- a/src/mongo/db/s/config/configsvr_split_chunk_command.cpp +++ b/src/mongo/db/s/config/configsvr_split_chunk_command.cpp @@ -101,8 +101,8 @@ public: return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool run(OperationContext* opCtx, diff --git a/src/mongo/db/s/get_shard_version_command.cpp b/src/mongo/db/s/get_shard_version_command.cpp index e38db486b20..1ad1689faf8 100644 --- a/src/mongo/db/s/get_shard_version_command.cpp +++ b/src/mongo/db/s/get_shard_version_command.cpp @@ -69,22 +69,22 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::getShardVersion)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool run(OperationContext* opCtx, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); uassertStatusOK(ShardingState::get(opCtx)->canAcceptShardedCommands()); diff --git a/src/mongo/db/s/migration_destination_manager_legacy_commands.cpp b/src/mongo/db/s/migration_destination_manager_legacy_commands.cpp index 1959befa719..89d2183de79 100644 --- a/src/mongo/db/s/migration_destination_manager_legacy_commands.cpp +++ b/src/mongo/db/s/migration_destination_manager_legacy_commands.cpp @@ -79,8 +79,8 @@ public: return true; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } void addRequiredPrivileges(const std::string& dbname, @@ -107,7 +107,7 @@ public: opCtx->setAlwaysInterruptAtStepDownOrUp_UNSAFE(); uassertStatusOK(ShardingState::get(opCtx)->canAcceptShardedCommands()); - auto nss = NamespaceString(parseNs(dbname, cmdObj)); + auto nss = NamespaceString(parseNs({boost::none, dbname}, cmdObj)); auto cloneRequest = uassertStatusOK(StartChunkCloneRequest::createFromCommand(nss, cmdObj)); diff --git a/src/mongo/db/s/shardsvr_collmod_command.cpp b/src/mongo/db/s/shardsvr_collmod_command.cpp index b1bef41021e..91f1dcc7f6f 100644 --- a/src/mongo/db/s/shardsvr_collmod_command.cpp +++ b/src/mongo/db/s/shardsvr_collmod_command.cpp @@ -75,7 +75,7 @@ public: Status checkAuthForCommand(Client* client, const std::string& dbname, const BSONObj& cmdObj) const override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); return auth::checkAuthForCollMod( client->getOperationContext(), AuthorizationSession::get(client), nss, cmdObj, false); } diff --git a/src/mongo/db/s/shardsvr_merge_chunks_command.cpp b/src/mongo/db/s/shardsvr_merge_chunks_command.cpp index 160f4014ec0..4baeca09bb6 100644 --- a/src/mongo/db/s/shardsvr_merge_chunks_command.cpp +++ b/src/mongo/db/s/shardsvr_merge_chunks_command.cpp @@ -178,8 +178,8 @@ public: return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool adminOnly() const override { @@ -206,7 +206,7 @@ public: BSONObjBuilder& result) override { uassertStatusOK(ShardingState::get(opCtx)->canAcceptShardedCommands()); - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); std::vector<BSONObj> bounds; if (!FieldParser::extract(cmdObj, boundsField, &bounds, &errmsg)) { diff --git a/src/mongo/db/s/shardsvr_move_primary_command.cpp b/src/mongo/db/s/shardsvr_move_primary_command.cpp index 9cde19c4ee4..a0f95e47e13 100644 --- a/src/mongo/db/s/shardsvr_move_primary_command.cpp +++ b/src/mongo/db/s/shardsvr_move_primary_command.cpp @@ -78,12 +78,12 @@ public: return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { const auto nsElt = cmdObj.firstElement(); uassert(ErrorCodes::InvalidNamespace, "'movePrimary' must be of type String", nsElt.type() == BSONType::String); - return nsElt.str(); + return NamespaceString(dbName.tenantId(), nsElt.str()); } bool run(OperationContext* opCtx, @@ -94,18 +94,18 @@ public: const auto movePrimaryRequest = ShardMovePrimary::parse(IDLParserContext("_shardsvrMovePrimary"), cmdObj); - const auto dbname = parseNs("", cmdObj); + const auto dbName = parseNs({boost::none, ""}, cmdObj).dbName(); - const NamespaceString dbNss(dbname); + const NamespaceString dbNss(dbName); const auto toShard = movePrimaryRequest.getTo(); uassert( ErrorCodes::InvalidNamespace, - str::stream() << "invalid db name specified: " << dbname, - NamespaceString::validDBName(dbname, NamespaceString::DollarInDbNameBehavior::Allow)); + str::stream() << "invalid db name specified: " << dbName.db(), + NamespaceString::validDBName(dbName, NamespaceString::DollarInDbNameBehavior::Allow)); uassert(ErrorCodes::InvalidOptions, - str::stream() << "Can't move primary for " << dbname << " database", + str::stream() << "Can't move primary for " << dbName.db() << " database", !dbNss.isOnInternalDb()); uassert(ErrorCodes::InvalidOptions, diff --git a/src/mongo/db/s/shardsvr_split_chunk_command.cpp b/src/mongo/db/s/shardsvr_split_chunk_command.cpp index 7165e2661c1..16a79ae12a3 100644 --- a/src/mongo/db/s/shardsvr_split_chunk_command.cpp +++ b/src/mongo/db/s/shardsvr_split_chunk_command.cpp @@ -84,8 +84,8 @@ public: return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool errmsgRun(OperationContext* opCtx, @@ -95,7 +95,7 @@ public: BSONObjBuilder& result) override { uassertStatusOK(ShardingState::get(opCtx)->canAcceptShardedCommands()); - const NamespaceString nss = NamespaceString(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); // throw if the provided shard version is too old { diff --git a/src/mongo/db/s/split_vector_command.cpp b/src/mongo/db/s/split_vector_command.cpp index 2fc9963b133..9b2812af619 100644 --- a/src/mongo/db/s/split_vector_command.cpp +++ b/src/mongo/db/s/split_vector_command.cpp @@ -73,15 +73,15 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::splitVector)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } return Status::OK(); } - std::string parseNs(const string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool errmsgRun(OperationContext* opCtx, @@ -90,7 +90,7 @@ public: string& errmsg, BSONObjBuilder& result) override { - const NamespaceString nss = NamespaceString(parseNs(dbname, jsobj)); + const NamespaceString nss(parseNs({boost::none, dbname}, jsobj)); BSONObj keyPattern = jsobj.getObjectField("keyPattern"); if (keyPattern.isEmpty()) { diff --git a/src/mongo/s/commands/cluster_coll_stats_cmd.cpp b/src/mongo/s/commands/cluster_coll_stats_cmd.cpp index cc974d33213..fc879a34605 100644 --- a/src/mongo/s/commands/cluster_coll_stats_cmd.cpp +++ b/src/mongo/s/commands/cluster_coll_stats_cmd.cpp @@ -174,8 +174,8 @@ public: return false; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns(); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsCollectionRequired(dbName, cmdObj); } bool supportsWriteConcern(const BSONObj& cmd) const override { @@ -194,7 +194,7 @@ public: const std::string& dbName, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbName, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbName}, cmdObj)); const auto targeter = ChunkManagerTargeter(opCtx, nss); const auto cm = targeter.getRoutingInfo(); diff --git a/src/mongo/s/commands/cluster_convert_to_capped_cmd.cpp b/src/mongo/s/commands/cluster_convert_to_capped_cmd.cpp index 1ca69f25b3c..7251ddc61c6 100644 --- a/src/mongo/s/commands/cluster_convert_to_capped_cmd.cpp +++ b/src/mongo/s/commands/cluster_convert_to_capped_cmd.cpp @@ -80,8 +80,8 @@ public: return AllowedOnSecondary::kNever; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns(); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsCollectionRequired(dbName, cmdObj); } void addRequiredPrivileges(const std::string& dbname, @@ -96,7 +96,7 @@ public: const std::string& dbName, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbName, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbName}, cmdObj)); const auto cm = uassertStatusOK(Grid::get(opCtx)->catalogCache()->getCollectionRoutingInfo(opCtx, nss)); uassert(ErrorCodes::IllegalOperation, diff --git a/src/mongo/s/commands/cluster_count_cmd.cpp b/src/mongo/s/commands/cluster_count_cmd.cpp index b70329dc312..c1603f8813e 100644 --- a/src/mongo/s/commands/cluster_count_cmd.cpp +++ b/src/mongo/s/commands/cluster_count_cmd.cpp @@ -93,7 +93,7 @@ public: std::string& errmsg, BSONObjBuilder& result) override { CommandHelpers::handleMarkKillOnClientDisconnect(opCtx); - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); uassert(ErrorCodes::InvalidNamespace, str::stream() << "Invalid namespace specified '" << nss.ns() << "'", nss.isValid()); @@ -195,7 +195,6 @@ public: const OpMsgRequest& request, ExplainOptions::Verbosity verbosity, rpc::ReplyBuilderInterface* result) const override { - std::string dbname = request.getDatabase().toString(); const BSONObj& cmdObj = request.body; CountCommandRequest countRequest(NamespaceStringOrUUID(NamespaceString{})); @@ -205,7 +204,7 @@ public: return exceptionToStatus(); } - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs(request.getDatabase(), cmdObj)); uassert(ErrorCodes::InvalidNamespace, str::stream() << "Invalid namespace specified '" << nss.ns() << "'", nss.isValid()); diff --git a/src/mongo/s/commands/cluster_distinct_cmd.cpp b/src/mongo/s/commands/cluster_distinct_cmd.cpp index 41a6bee6d61..b15ed932677 100644 --- a/src/mongo/s/commands/cluster_distinct_cmd.cpp +++ b/src/mongo/s/commands/cluster_distinct_cmd.cpp @@ -59,8 +59,8 @@ public: return "{ distinct : 'collection name' , key : 'a.b' , query : {} }"; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns(); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsCollectionRequired(dbName, cmdObj); } AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { @@ -101,9 +101,8 @@ public: const OpMsgRequest& opMsgRequest, ExplainOptions::Verbosity verbosity, rpc::ReplyBuilderInterface* result) const override { - std::string dbname = opMsgRequest.getDatabase().toString(); const BSONObj& cmdObj = opMsgRequest.body; - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs(opMsgRequest.getDatabase(), cmdObj)); auto parsedDistinctCmd = ParsedDistinct::parse(opCtx, nss, cmdObj, ExtensionsCallbackNoop(), true); @@ -186,7 +185,7 @@ public: const BSONObj& cmdObj, BSONObjBuilder& result) override { CommandHelpers::handleMarkKillOnClientDisconnect(opCtx); - const NamespaceString nss(parseNs(dbName, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbName}, cmdObj)); auto parsedDistinctCmd = ParsedDistinct::parse(opCtx, nss, cmdObj, ExtensionsCallbackNoop(), false); diff --git a/src/mongo/s/commands/cluster_filemd5_cmd.cpp b/src/mongo/s/commands/cluster_filemd5_cmd.cpp index 6dab7bcc3a8..0bd0a711fc2 100644 --- a/src/mongo/s/commands/cluster_filemd5_cmd.cpp +++ b/src/mongo/s/commands/cluster_filemd5_cmd.cpp @@ -57,7 +57,7 @@ public: return false; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { std::string collectionName; if (const auto rootElt = cmdObj["root"]) { uassert(ErrorCodes::InvalidNamespace, @@ -68,7 +68,7 @@ public: if (collectionName.empty()) collectionName = "fs"; collectionName += ".chunks"; - return NamespaceString(dbname, collectionName).ns(); + return NamespaceString(dbName, collectionName); } void addRequiredPrivileges(const std::string& dbname, @@ -85,7 +85,7 @@ public: const std::string& dbName, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbName, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbName}, cmdObj)); const auto cm = uassertStatusOK(Grid::get(opCtx)->catalogCache()->getCollectionRoutingInfo(opCtx, nss)); diff --git a/src/mongo/s/commands/cluster_get_shard_version_cmd.cpp b/src/mongo/s/commands/cluster_get_shard_version_cmd.cpp index 3f8d1068bf8..94e4b2a6cf4 100644 --- a/src/mongo/s/commands/cluster_get_shard_version_cmd.cpp +++ b/src/mongo/s/commands/cluster_get_shard_version_cmd.cpp @@ -68,7 +68,7 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::getShardVersion)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } @@ -76,20 +76,19 @@ public: return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { BSONElement first = cmdObj.firstElement(); uassert(ErrorCodes::BadValue, str::stream() << "namespace has invalid type " << typeName(first.type()), first.canonicalType() == canonicalizeBSONType(mongo::String)); - const NamespaceString nss(first.valueStringData()); - return nss.ns(); + return NamespaceString(dbName.tenantId(), first.valueStringData()); } bool run(OperationContext* opCtx, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); const auto catalogCache = Grid::get(opCtx)->catalogCache(); diff --git a/src/mongo/s/commands/cluster_index_filter_cmd.cpp b/src/mongo/s/commands/cluster_index_filter_cmd.cpp index f6c5bd37777..eafe9b8b539 100644 --- a/src/mongo/s/commands/cluster_index_filter_cmd.cpp +++ b/src/mongo/s/commands/cluster_index_filter_cmd.cpp @@ -59,8 +59,8 @@ public: return _helpText; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns(); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsCollectionRequired(dbName, cmdObj); } AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { @@ -90,7 +90,7 @@ public: const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); const BSONObj query; const auto routingInfo = uassertStatusOK(Grid::get(opCtx)->catalogCache()->getCollectionRoutingInfo(opCtx, nss)); diff --git a/src/mongo/s/commands/cluster_merge_chunks_cmd.cpp b/src/mongo/s/commands/cluster_merge_chunks_cmd.cpp index 684184bf6b0..05cddc1282f 100644 --- a/src/mongo/s/commands/cluster_merge_chunks_cmd.cpp +++ b/src/mongo/s/commands/cluster_merge_chunks_cmd.cpp @@ -64,15 +64,15 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::splitChunk)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool adminOnly() const override { @@ -101,7 +101,7 @@ public: const BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); vector<BSONObj> bounds; if (!FieldParser::extract(cmdObj, boundsField, &bounds, &errmsg)) { diff --git a/src/mongo/s/commands/cluster_move_primary_cmd.cpp b/src/mongo/s/commands/cluster_move_primary_cmd.cpp index 3c1c48cb609..665fbc79dd4 100644 --- a/src/mongo/s/commands/cluster_move_primary_cmd.cpp +++ b/src/mongo/s/commands/cluster_move_primary_cmd.cpp @@ -74,19 +74,20 @@ public: const std::string& dbname, const BSONObj& cmdObj) const { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forDatabaseName(parseNs(dbname, cmdObj)), ActionType::moveChunk)) { + ResourcePattern::forDatabaseName(parseNs({boost::none, dbname}, cmdObj).db()), + ActionType::moveChunk)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } return Status::OK(); } - virtual std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const { + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { const auto nsElt = cmdObj.firstElement(); uassert(ErrorCodes::InvalidNamespace, "'movePrimary' must be of type String", nsElt.type() == BSONType::String); - return nsElt.str(); + return NamespaceString(dbName.tenantId(), nsElt.str()); } virtual bool run(OperationContext* opCtx, @@ -95,7 +96,7 @@ public: BSONObjBuilder& result) { auto request = MovePrimary::parse(IDLParserContext("MovePrimary"), cmdObj); - const string db = parseNs("", cmdObj); + const string db = parseNs({boost::none, ""}, cmdObj).dbName().db(); const StringData toShard(request.getTo()); // Invalidate the routing table cache entry for this database so that we reload the diff --git a/src/mongo/s/commands/cluster_plan_cache_clear_cmd.cpp b/src/mongo/s/commands/cluster_plan_cache_clear_cmd.cpp index 96499720ea6..1736e5eb233 100644 --- a/src/mongo/s/commands/cluster_plan_cache_clear_cmd.cpp +++ b/src/mongo/s/commands/cluster_plan_cache_clear_cmd.cpp @@ -69,8 +69,8 @@ public: return "Drops one or all plan cache entries for a collection."; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns(); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsCollectionRequired(dbName, cmdObj); } Status checkAuthForCommand(Client* client, diff --git a/src/mongo/s/commands/cluster_repair_sharded_collection_chunks_history_cmd.cpp b/src/mongo/s/commands/cluster_repair_sharded_collection_chunks_history_cmd.cpp index dd08b1574d4..d78f985dad0 100644 --- a/src/mongo/s/commands/cluster_repair_sharded_collection_chunks_history_cmd.cpp +++ b/src/mongo/s/commands/cluster_repair_sharded_collection_chunks_history_cmd.cpp @@ -78,22 +78,22 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::splitChunk)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } return Status::OK(); } - std::string parseNs(const std::string& unusedDbName, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool run(OperationContext* opCtx, const std::string& unusedDbName, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss{parseNs(unusedDbName, cmdObj)}; + const NamespaceString nss{parseNs({boost::none, unusedDbName}, cmdObj)}; BSONObjBuilder cmdBuilder( BSON("_configsvrRepairShardedCollectionChunksHistory" << nss.ns())); diff --git a/src/mongo/s/commands/cluster_shard_collection_cmd.cpp b/src/mongo/s/commands/cluster_shard_collection_cmd.cpp index f5245136e2c..f8cc1052dd9 100644 --- a/src/mongo/s/commands/cluster_shard_collection_cmd.cpp +++ b/src/mongo/s/commands/cluster_shard_collection_cmd.cpp @@ -70,7 +70,7 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::enableSharding)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } @@ -78,15 +78,15 @@ public: return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool run(OperationContext* opCtx, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); uassert(5731501, "Sharding a buckets collection is not allowed", diff --git a/src/mongo/s/commands/cluster_split_cmd.cpp b/src/mongo/s/commands/cluster_split_cmd.cpp index 9d9754a133f..b67bfc12732 100644 --- a/src/mongo/s/commands/cluster_split_cmd.cpp +++ b/src/mongo/s/commands/cluster_split_cmd.cpp @@ -116,15 +116,15 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::splitChunk)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } return Status::OK(); } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool errmsgRun(OperationContext* opCtx, @@ -132,7 +132,7 @@ public: const BSONObj& cmdObj, std::string& errmsg, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbname, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbname}, cmdObj)); const auto cm = uassertStatusOK( Grid::get(opCtx)->catalogCache()->getShardedCollectionRoutingInfoWithRefresh(opCtx, diff --git a/src/mongo/s/commands/cluster_split_vector_cmd.cpp b/src/mongo/s/commands/cluster_split_vector_cmd.cpp index 53ba3d3696f..0e65f23ced6 100644 --- a/src/mongo/s/commands/cluster_split_vector_cmd.cpp +++ b/src/mongo/s/commands/cluster_split_vector_cmd.cpp @@ -49,8 +49,8 @@ public: return AllowedOnSecondary::kAlways; } - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsFullyQualified(cmdObj); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return NamespaceString(dbName.tenantId(), CommandHelpers::parseNsFullyQualified(cmdObj)); } bool supportsWriteConcern(const BSONObj& cmd) const override { @@ -61,7 +61,7 @@ public: const std::string& dbname, const BSONObj& cmdObj) const override { if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forExactNamespace(NamespaceString(parseNs(dbname, cmdObj))), + ResourcePattern::forExactNamespace(parseNs({boost::none, dbname}, cmdObj)), ActionType::splitVector)) { return Status(ErrorCodes::Unauthorized, "Unauthorized"); } @@ -72,7 +72,7 @@ public: const std::string& dbName, const BSONObj& cmdObj, BSONObjBuilder& result) override { - const NamespaceString nss(parseNs(dbName, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbName}, cmdObj)); uassert(ErrorCodes::IllegalOperation, "Performing splitVector across dbs isn't supported via mongos", nss.db() == dbName); diff --git a/src/mongo/s/commands/cluster_validate_cmd.cpp b/src/mongo/s/commands/cluster_validate_cmd.cpp index ea3f4ca9e70..7adec5863b5 100644 --- a/src/mongo/s/commands/cluster_validate_cmd.cpp +++ b/src/mongo/s/commands/cluster_validate_cmd.cpp @@ -45,8 +45,8 @@ class ValidateCmd : public BasicCommand { public: ValidateCmd() : BasicCommand("validate") {} - std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { - return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns(); + NamespaceString parseNs(const DatabaseName& dbName, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsCollectionRequired(dbName, cmdObj); } AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { @@ -73,7 +73,7 @@ public: const std::string& dbName, const BSONObj& cmdObj, BSONObjBuilder& output) override { - const NamespaceString nss(parseNs(dbName, cmdObj)); + const NamespaceString nss(parseNs({boost::none, dbName}, cmdObj)); const auto routingInfo = uassertStatusOK(Grid::get(opCtx)->catalogCache()->getCollectionRoutingInfo(opCtx, nss)); |