diff options
author | Andrew Shuvalov <andrew.shuvalov@mongodb.com> | 2020-12-28 21:40:42 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-01-07 01:21:45 +0000 |
commit | ad1169d34cbd457a4d0637230e615bdf1d177531 (patch) | |
tree | 0f79583951db0b9ee6aa275677ed5c4add40e560 /src/mongo/rpc | |
parent | c20e3c5001923d8e8385dab70786da97888b039e (diff) | |
download | mongo-ad1169d34cbd457a4d0637230e615bdf1d177531.tar.gz |
SERVER-53423: Make ConnectString::connect return a status instead of setting error message
Diffstat (limited to 'src/mongo/rpc')
-rw-r--r-- | src/mongo/rpc/op_msg_integration_test.cpp | 155 |
1 files changed, 57 insertions, 98 deletions
diff --git a/src/mongo/rpc/op_msg_integration_test.cpp b/src/mongo/rpc/op_msg_integration_test.cpp index c3f285e46c5..6d3bb094720 100644 --- a/src/mongo/rpc/op_msg_integration_test.cpp +++ b/src/mongo/rpc/op_msg_integration_test.cpp @@ -46,6 +46,7 @@ #include "mongo/util/scopeguard.h" namespace mongo { +namespace { template <typename F> bool waitForCondition(F&& f) { @@ -63,6 +64,13 @@ bool waitForCondition(F&& f) { return false; } +std::unique_ptr<DBClientBase> getIntegrationTestConnection() { + auto swConn = unittest::getFixtureConnectionString().connect("integration_test"); + uassertStatusOK(swConn.getStatus()); + return std::move(swConn.getValue()); +} + + // Returns the connection name by filtering on the appName of a $currentOp command. If no result is // found, return an empty string. std::string getThreadNameByAppName(DBClientBase* conn, StringData appName) { @@ -78,10 +86,7 @@ std::string getThreadNameByAppName(DBClientBase* conn, StringData appName) { } TEST(OpMsg, UnknownRequiredFlagClosesConnection) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); auto request = OpMsgRequest::fromDBAndBody("admin", BSON("ping" << 1)).serialize(); OpMsg::setFlag(&request, 1u << 15); // This should be the last required flag to be assigned. @@ -91,10 +96,7 @@ TEST(OpMsg, UnknownRequiredFlagClosesConnection) { } TEST(OpMsg, UnknownOptionalFlagIsIgnored) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); auto request = OpMsgRequest::fromDBAndBody("admin", BSON("ping" << 1)).serialize(); OpMsg::setFlag(&request, 1u << 31); // This should be the last optional flag to be assigned. @@ -106,10 +108,7 @@ TEST(OpMsg, UnknownOptionalFlagIsIgnored) { } TEST(OpMsg, FireAndForgetInsertWorks) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); conn->dropCollection("test.collection"); @@ -125,10 +124,7 @@ TEST(OpMsg, FireAndForgetInsertWorks) { } TEST(OpMsg, DocumentSequenceLargeDocumentMultiInsertWorks) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); conn->dropCollection("test.collection"); @@ -159,10 +155,7 @@ TEST(OpMsg, DocumentSequenceLargeDocumentMultiInsertWorks) { } TEST(OpMsg, DocumentSequenceMaxWriteBatchWorks) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); conn->dropCollection("test.collection"); @@ -282,10 +275,7 @@ TEST(OpMsg, CloseConnectionOnFireAndForgetNotWritablePrimaryError) { } TEST(OpMsg, DocumentSequenceReturnsWork) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); auto opMsgRequest = OpMsgRequest::fromDBAndBody("admin", BSON("echo" << 1)); opMsgRequest.sequences.push_back({"example", {BSON("a" << 1), BSON("b" << 2)}}); @@ -326,10 +316,7 @@ void enableClientChecksum() { } void exhaustGetMoreTest(bool enableChecksum) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); // Only test exhaust against a standalone. if (conn->isReplicaSetMember() || conn->isMongos()) { @@ -421,10 +408,7 @@ TEST(OpMsg, ServerHandlesExhaustGetMoreCorrectlyWithChecksum) { } TEST(OpMsg, FindIgnoresExhaust) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); // Only test exhaust against a standalone. if (conn->isReplicaSetMember() || conn->isMongos()) { @@ -456,10 +440,7 @@ TEST(OpMsg, FindIgnoresExhaust) { } TEST(OpMsg, ServerDoesNotSetMoreToComeOnErrorInGetMore) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); // Only test exhaust against a standalone. if (conn->isReplicaSetMember() || conn->isMongos()) { @@ -506,10 +487,7 @@ TEST(OpMsg, ServerDoesNotSetMoreToComeOnErrorInGetMore) { } TEST(OpMsg, MongosIgnoresExhaustForGetMore) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); if (!conn->isMongos()) { return; @@ -558,10 +536,9 @@ TEST(OpMsg, MongosIgnoresExhaustForGetMore) { } TEST(OpMsg, ServerHandlesExhaustIsMasterCorrectly) { - std::string errMsg; - auto fixtureConn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, fixtureConn); + auto swConn = unittest::getFixtureConnectionString().connect("integration_test"); + uassertStatusOK(swConn.getStatus()); + auto fixtureConn = std::move(swConn.getValue()); DBClientBase* conn = fixtureConn.get(); if (fixtureConn->isReplicaSetMember()) { @@ -621,10 +598,9 @@ TEST(OpMsg, ServerHandlesExhaustIsMasterCorrectly) { } TEST(OpMsg, ServerHandlesExhaustIsMasterWithTopologyChange) { - std::string errMsg; - auto fixtureConn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, fixtureConn); + auto swConn = unittest::getFixtureConnectionString().connect("integration_test"); + uassertStatusOK(swConn.getStatus()); + auto fixtureConn = std::move(swConn.getValue()); DBClientBase* conn = fixtureConn.get(); if (fixtureConn->isReplicaSetMember()) { @@ -687,10 +663,9 @@ TEST(OpMsg, ServerHandlesExhaustIsMasterWithTopologyChange) { } TEST(OpMsg, ServerRejectsExhaustIsMasterWithoutMaxAwaitTimeMS) { - std::string errMsg; - auto fixtureConn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, fixtureConn); + auto swConn = unittest::getFixtureConnectionString().connect("integration_test"); + uassertStatusOK(swConn.getStatus()); + auto fixtureConn = std::move(swConn.getValue()); DBClientBase* conn = fixtureConn.get(); if (fixtureConn->isReplicaSetMember()) { @@ -712,10 +687,7 @@ TEST(OpMsg, ServerRejectsExhaustIsMasterWithoutMaxAwaitTimeMS) { } void serverStatusCorrectlyShowsExhaustMetrics(std::string commandName) { - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); if (conn->isReplicaSetMember()) { // Don't run on replica sets as the RSM will use the streamable hello or isMaster protocol @@ -757,10 +729,9 @@ void serverStatusCorrectlyShowsExhaustMetrics(std::string commandName) { ASSERT_OK(getStatusFromCommandResult(res)); // Start a new connection to the server to check the serverStatus metrics. - std::string newErrMsg; - auto conn2 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", newErrMsg)); - uassert(ErrorCodes::SocketException, newErrMsg, conn2); + auto conn2 = + std::move(unittest::getFixtureConnectionString().connect("integration_test").getValue()); + uassert(ErrorCodes::SocketException, "connection failed", conn2); auto serverStatusCmd = BSON("serverStatus" << 1); BSONObj serverStatusReply; @@ -788,11 +759,10 @@ TEST(OpMsg, ServerStatusCorrectlyShowsExhaustIsMasterMetricsWithIsMasterAlias) { } void exhaustMetricSwitchingCommandNames(bool useLegacyCommandNameAtStart) { - std::string errMsg; const auto conn1AppName = "integration_test"; - auto conn1 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect(conn1AppName, errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn1); + auto swConn1 = unittest::getFixtureConnectionString().connect(conn1AppName); + uassertStatusOK(swConn1.getStatus()); + auto conn1 = std::move(swConn1.getValue()); if (conn1->isReplicaSetMember()) { // Don't run on replica sets as the RSM will use the streamable hello or isMaster protocol @@ -839,10 +809,9 @@ void exhaustMetricSwitchingCommandNames(bool useLegacyCommandNameAtStart) { ASSERT_OK(getStatusFromCommandResult(res)); // Start a new connection to the server to check the serverStatus metrics. - std::string newErrMsg; - auto conn2 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test2", newErrMsg)); - uassert(ErrorCodes::SocketException, newErrMsg, conn2); + auto conn2 = + std::move(unittest::getFixtureConnectionString().connect("integration_test2").getValue()); + uassert(ErrorCodes::SocketException, "connection failed", conn2); std::string threadName; ASSERT(waitForCondition([&] { @@ -927,11 +896,10 @@ TEST(OpMsg, ExhaustHelloMetricSwitchingCommandNames) { void exhaustMetricDecrementsOnNewOpAfterTerminatingExhaustStream(bool useLegacyCommandName) { - std::string errMsg; const auto conn1AppName = "integration_test"; - auto conn1 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect(conn1AppName, errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn1); + auto swConn1 = unittest::getFixtureConnectionString().connect(conn1AppName); + uassertStatusOK(swConn1.getStatus()); + auto conn1 = std::move(swConn1.getValue()); if (conn1->isReplicaSetMember()) { // Don't run on replica sets as the RSM will use the streamable hello or isMaster protocol @@ -977,10 +945,9 @@ void exhaustMetricDecrementsOnNewOpAfterTerminatingExhaustStream(bool useLegacyC ASSERT_OK(getStatusFromCommandResult(res)); // Start a new connection to the server to check the serverStatus metrics. - std::string newErrMsg; - auto conn2 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test2", newErrMsg)); - uassert(ErrorCodes::SocketException, newErrMsg, conn2); + auto conn2 = + std::move(unittest::getFixtureConnectionString().connect("integration_test2").getValue()); + uassert(ErrorCodes::SocketException, "connection 2 failed", conn2); std::string threadName; ASSERT(waitForCondition([&] { @@ -1042,11 +1009,10 @@ TEST(OpMsg, ExhaustHelloMetricDecrementsOnNewOpAfterTerminatingExhaustStream) { } void exhaustMetricOnNewExhaustAfterTerminatingExhaustStream(bool useLegacyCommandName) { - std::string errMsg; const auto conn1AppName = "integration_test"; - auto conn1 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect(conn1AppName, errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn1); + auto swConn1 = unittest::getFixtureConnectionString().connect(conn1AppName); + uassertStatusOK(swConn1.getStatus()); + auto conn1 = std::move(swConn1.getValue()); if (conn1->isReplicaSetMember()) { // Don't run on replica sets as the RSM will use the streamable hello or isMaster protocol @@ -1092,10 +1058,9 @@ void exhaustMetricOnNewExhaustAfterTerminatingExhaustStream(bool useLegacyComman ASSERT_OK(getStatusFromCommandResult(res)); // Start a new connection to the server to check the serverStatus metrics. - std::string newErrMsg; - auto conn2 = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test2", newErrMsg)); - uassert(ErrorCodes::SocketException, newErrMsg, conn2); + auto conn2 = + std::move(unittest::getFixtureConnectionString().connect("integration_test2").getValue()); + uassert(ErrorCodes::SocketException, "connection failed", conn2); std::string threadName; ASSERT(waitForCondition([&] { @@ -1175,10 +1140,7 @@ TEST(OpMsg, ExhaustWithDBClientCursorBehavesCorrectly) { // correctly. The externally visible behavior should technically be the same as a non-exhaust // cursor. The exhaust cursor should ideally provide a performance win over non-exhaust, but we // don't measure that here. - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); // Only test exhaust against a standalone. if (conn->isReplicaSetMember() || conn->isMongos()) { @@ -1228,10 +1190,7 @@ TEST(OpMsg, ExhaustWithDBClientCursorBehavesCorrectly) { void checksumTest(bool enableChecksum) { // The server replies with a checksum if and only if the request has a checksum. - std::string errMsg; - auto conn = std::unique_ptr<DBClientBase>( - unittest::getFixtureConnectionString().connect("integration_test", errMsg)); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); if (!enableChecksum) { disableClientChecksum(); @@ -1258,9 +1217,7 @@ TEST(OpMsg, ServerRepliesWithChecksumToRequestWithChecksum) { } TEST(OpMsg, ServerHandlesReallyLargeMessagesGracefully) { - std::string errMsg; - auto conn = unittest::getFixtureConnectionString().connect("integration_test", errMsg); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto conn = getIntegrationTestConnection(); auto buildInfo = conn->runCommand(OpMsgRequest::fromDBAndBody("admin", BSON("buildInfo" << 1))) ->getCommandReply(); @@ -1299,9 +1256,10 @@ public: uri.setHelloOk(helloOk.get()); } - std::string errMsg; - auto conn = connStr.connect(_appName, errMsg, 0, &uri); - uassert(ErrorCodes::SocketException, errMsg, conn); + auto swConn = connStr.connect(_appName, 0, &uri); + uassertStatusOK(swConn.getStatus()); + auto conn = std::move(swConn.getValue()); + uassert(ErrorCodes::SocketException, "connection failed", conn); _configureFailPoint(conn.get()); return conn; @@ -1360,4 +1318,5 @@ TEST(OpMsg, HelloOkCanBeDisabled) { ASSERT(!isHelloOk); } +} // namespace } // namespace mongo |