summaryrefslogtreecommitdiff
path: root/src/mongo/rpc
diff options
context:
space:
mode:
authorAndrew Shuvalov <andrew.shuvalov@mongodb.com>2020-12-28 21:40:42 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-01-07 01:21:45 +0000
commitad1169d34cbd457a4d0637230e615bdf1d177531 (patch)
tree0f79583951db0b9ee6aa275677ed5c4add40e560 /src/mongo/rpc
parentc20e3c5001923d8e8385dab70786da97888b039e (diff)
downloadmongo-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.cpp155
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