Skip to content

Commit 8c70d83

Browse files
cheahuychouEvergreen Agent
authored andcommitted
SERVER-81968 Make replica set endpoint handle the profile command and commands against the profiler collections through router code paths
1 parent 3edeea2 commit 8c70d83

File tree

3 files changed

+102
-1
lines changed

3 files changed

+102
-1
lines changed

src/mongo/db/replica_set_endpoint_util.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,15 @@
2929

3030
#include "mongo/db/replica_set_endpoint_util.h"
3131

32+
#include "mongo/bson/bsontypes.h"
3233
#include "mongo/db/commands.h"
3334
#include "mongo/db/multitenancy_gen.h"
35+
#include "mongo/db/namespace_string.h"
3436
#include "mongo/db/operation_context.h"
3537
#include "mongo/db/replica_set_endpoint_sharding_state.h"
3638
#include "mongo/db/s/replica_set_endpoint_feature_flag_gen.h"
3739
#include "mongo/s/grid.h"
40+
#include "mongo/util/namespace_string_util.h"
3841

3942
#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kSharding
4043

@@ -51,6 +54,21 @@ bool isInternalClient(OperationContext* opCtx) {
5154
opCtx->getClient()->isInDirectClient();
5255
}
5356

57+
/**
58+
* Returns true if this is a request for an unreplicated database or collection.
59+
*/
60+
bool isUnreplicatedDatabaseOrCollectionCommandRequest(const OpMsgRequest& opMsgReq) {
61+
if (opMsgReq.getDbName().isLocalDB()) {
62+
return true;
63+
}
64+
if (const auto& firstElement = opMsgReq.body.firstElement();
65+
firstElement.type() == BSONType::String &&
66+
firstElement.String() == NamespaceString::kSystemDotProfileCollectionName) {
67+
return true;
68+
}
69+
return false;
70+
}
71+
5472
/**
5573
* Returns true if this is a request for an aggregate command with a $currentOp stage.
5674
*/
@@ -128,7 +146,7 @@ bool shouldRouteRequest(OperationContext* opCtx, const OpMsgRequest& opMsgReq) {
128146
return false;
129147
}
130148

131-
if (isInternalClient(opCtx) || opMsgReq.getDbName().isLocalDB() ||
149+
if (isInternalClient(opCtx) || isUnreplicatedDatabaseOrCollectionCommandRequest(opMsgReq) ||
132150
isTargetedCommandRequest(opCtx, opMsgReq) || !isRoutableCommandRequest(opCtx, opMsgReq)) {
133151
return false;
134152
}

src/mongo/db/replica_set_endpoint_util.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const std::set<StringData> kTargetedCmdNames = {"clearLog",
5050
"ismaster",
5151
"logout",
5252
"ping",
53+
"profile",
5354
"refreshLogicalSessionCacheNow",
5455
"replSetGetStatus",
5556
"saslStart",

src/mongo/db/replica_set_endpoint_util_test.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include "mongo/bson/json.h"
3232
#include "mongo/db/cluster_role.h"
33+
#include "mongo/db/database_name.h"
3334
#include "mongo/db/replica_set_endpoint_util.h"
3435

3536
#include "mongo/util/database_name_util.h"
@@ -215,6 +216,87 @@ TEST_F(ReplicaSetEndpointUtilTest, ShouldRoute_AdminDatabase) {
215216
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest));
216217
}
217218

219+
TEST_F(ReplicaSetEndpointUtilTest, ShouldNotRoute_SystemDotProfileCollection) {
220+
std::shared_ptr<transport::Session> session = getTransportLayer().createSession();
221+
auto client =
222+
getServiceContext()->getService()->makeClient("SystemDotProfileCollection", session);
223+
auto opCtx = client->makeOperationContext();
224+
225+
auto dbName =
226+
DatabaseName::createDatabaseName_forTest(boost::none /* tenantId */, {kTestDbName});
227+
auto ns = NamespaceString::makeSystemDotProfileNamespace(dbName);
228+
commands_test_example::ExampleIncrement incrementCmd(ns, 0);
229+
auto opMsgRequest = mongo::OpMsgRequest::fromDBAndBody(ns.dbName(), incrementCmd.toBSON({}));
230+
231+
ASSERT_FALSE(shouldRouteRequest(opCtx.get(), opMsgRequest));
232+
}
233+
234+
TEST_F(ReplicaSetEndpointUtilTest, ShouldRoute_ConfigSystemSessionsCollection) {
235+
std::shared_ptr<transport::Session> session = getTransportLayer().createSession();
236+
auto client =
237+
getServiceContext()->getService()->makeClient("ConfigSystemSessionsCollection", session);
238+
auto opCtx = client->makeOperationContext();
239+
240+
auto ns = NamespaceString::kLogicalSessionsNamespace;
241+
commands_test_example::ExampleIncrement incrementCmd(ns, 0);
242+
auto opMsgRequest = mongo::OpMsgRequest::fromDBAndBody(ns.dbName(), incrementCmd.toBSON({}));
243+
244+
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest));
245+
}
246+
247+
TEST_F(ReplicaSetEndpointUtilTest, ShouldRoute_AdminSystemUsersCollection) {
248+
std::shared_ptr<transport::Session> session = getTransportLayer().createSession();
249+
auto client =
250+
getServiceContext()->getService()->makeClient("AdminSystemUsersCollection", session);
251+
auto opCtx = client->makeOperationContext();
252+
253+
auto ns = NamespaceString::createNamespaceString_forTest(NamespaceString::kSystemUsers);
254+
commands_test_example::ExampleIncrement incrementCmd(ns, 0);
255+
auto opMsgRequest = mongo::OpMsgRequest::fromDBAndBody(ns.dbName(), incrementCmd.toBSON({}));
256+
257+
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest));
258+
}
259+
260+
TEST_F(ReplicaSetEndpointUtilTest, ShouldRoute_UserSystemCollection) {
261+
std::shared_ptr<transport::Session> session = getTransportLayer().createSession();
262+
auto client = getServiceContext()->getService()->makeClient("UserSystemCollection", session);
263+
auto opCtx = client->makeOperationContext();
264+
265+
auto ns =
266+
NamespaceString::createNamespaceString_forTest(kTestDbName, "system." + kTestCollName);
267+
commands_test_example::ExampleIncrement incrementCmd(ns, 0);
268+
auto opMsgRequest = mongo::OpMsgRequest::fromDBAndBody(ns.dbName(), incrementCmd.toBSON({}));
269+
270+
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest));
271+
}
272+
273+
TEST_F(ReplicaSetEndpointUtilTest, ShouldRoute_UserNonSystemCollection) {
274+
std::shared_ptr<transport::Session> session = getTransportLayer().createSession();
275+
auto client = getServiceContext()->getService()->makeClient("UserNonSystemCollection", session);
276+
auto opCtx = client->makeOperationContext();
277+
278+
auto ns0 =
279+
NamespaceString::createNamespaceString_forTest(kTestDbName, "system-" + kTestCollName);
280+
commands_test_example::ExampleIncrement incrementCmd0(ns0, 0);
281+
auto opMsgRequest0 = mongo::OpMsgRequest::fromDBAndBody(ns0.dbName(), incrementCmd0.toBSON({}));
282+
283+
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest0));
284+
285+
auto ns1 =
286+
NamespaceString::createNamespaceString_forTest(kTestDbName, kTestCollName + "system");
287+
commands_test_example::ExampleIncrement incrementCmd1(ns1, 0);
288+
auto opMsgRequest1 = mongo::OpMsgRequest::fromDBAndBody(ns1.dbName(), incrementCmd1.toBSON({}));
289+
290+
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest1));
291+
292+
auto ns2 =
293+
NamespaceString::createNamespaceString_forTest(kTestDbName, kTestCollName + ".system.foo");
294+
commands_test_example::ExampleIncrement incrementCmd2(ns2, 0);
295+
auto opMsgRequest2 = mongo::OpMsgRequest::fromDBAndBody(ns2.dbName(), incrementCmd2.toBSON({}));
296+
297+
ASSERT(shouldRouteRequest(opCtx.get(), opMsgRequest2));
298+
}
299+
218300
TEST_F(ReplicaSetEndpointUtilTest, ShouldNotRoute_TargetedCommand) {
219301
std::shared_ptr<transport::Session> session = getTransportLayer().createSession();
220302
auto client = getServiceContext()->getService()->makeClient("TargetedCommand", session);

0 commit comments

Comments
 (0)