summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/db/commands.cpp2
-rw-r--r--src/mongo/db/commands.h7
-rw-r--r--src/mongo/db/commands/dbcommands.cpp2
-rw-r--r--src/mongo/db/commands/dbcommands_d.cpp7
-rw-r--r--src/mongo/db/commands/dbhash.cpp11
-rw-r--r--src/mongo/db/commands/rename_collection_cmd.cpp4
-rw-r--r--src/mongo/db/s/check_sharding_index_command.cpp6
-rw-r--r--src/mongo/db/s/config/configsvr_repair_sharded_collection_chunks_history_command.cpp6
-rw-r--r--src/mongo/db/s/config/configsvr_split_chunk_command.cpp4
-rw-r--r--src/mongo/db/s/get_shard_version_command.cpp8
-rw-r--r--src/mongo/db/s/migration_destination_manager_legacy_commands.cpp6
-rw-r--r--src/mongo/db/s/shardsvr_collmod_command.cpp2
-rw-r--r--src/mongo/db/s/shardsvr_merge_chunks_command.cpp6
-rw-r--r--src/mongo/db/s/shardsvr_move_primary_command.cpp14
-rw-r--r--src/mongo/db/s/shardsvr_split_chunk_command.cpp6
-rw-r--r--src/mongo/db/s/split_vector_command.cpp8
-rw-r--r--src/mongo/s/commands/cluster_coll_stats_cmd.cpp6
-rw-r--r--src/mongo/s/commands/cluster_convert_to_capped_cmd.cpp6
-rw-r--r--src/mongo/s/commands/cluster_count_cmd.cpp5
-rw-r--r--src/mongo/s/commands/cluster_distinct_cmd.cpp9
-rw-r--r--src/mongo/s/commands/cluster_filemd5_cmd.cpp6
-rw-r--r--src/mongo/s/commands/cluster_get_shard_version_cmd.cpp9
-rw-r--r--src/mongo/s/commands/cluster_index_filter_cmd.cpp6
-rw-r--r--src/mongo/s/commands/cluster_merge_chunks_cmd.cpp8
-rw-r--r--src/mongo/s/commands/cluster_move_primary_cmd.cpp9
-rw-r--r--src/mongo/s/commands/cluster_plan_cache_clear_cmd.cpp4
-rw-r--r--src/mongo/s/commands/cluster_repair_sharded_collection_chunks_history_cmd.cpp8
-rw-r--r--src/mongo/s/commands/cluster_shard_collection_cmd.cpp8
-rw-r--r--src/mongo/s/commands/cluster_split_cmd.cpp8
-rw-r--r--src/mongo/s/commands/cluster_split_vector_cmd.cpp8
-rw-r--r--src/mongo/s/commands/cluster_validate_cmd.cpp6
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));