Skip to content

Commit 4df2aa5

Browse files
committed
CDRIVER-2576 check stream_run_ismaster return
1 parent fde9edf commit 4df2aa5

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/mongoc/mongoc-cluster.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,10 @@ _mongoc_cluster_run_ismaster (mongoc_cluster_t *cluster,
721721
sd = _mongoc_stream_run_ismaster (
722722
cluster, node->stream, node->connection_address, server_id);
723723

724+
if (!sd) {
725+
return NULL;
726+
}
727+
724728
if (sd->type == MONGOC_SERVER_UNKNOWN) {
725729
memcpy (error, &sd->error, sizeof (bson_error_t));
726730
mongoc_server_description_destroy (sd);

tests/test-mongoc-cluster.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,6 +1305,52 @@ dollar_query_test_t tests[] = {
13051305
true},
13061306
{NULL}};
13071307

1308+
static void
1309+
test_cluster_ismaster_fails (void)
1310+
{
1311+
mock_server_t *mock_server;
1312+
mongoc_uri_t *uri;
1313+
mongoc_server_description_t *sd;
1314+
mongoc_client_pool_t *pool;
1315+
mongoc_client_t *client;
1316+
request_t *request;
1317+
future_t *future;
1318+
bson_error_t error;
1319+
int autoresponder_id;
1320+
1321+
mock_server = mock_server_new ();
1322+
autoresponder_id =
1323+
mock_server_auto_ismaster (mock_server, "{ 'isMaster': 1.0 }");
1324+
mock_server_run (mock_server);
1325+
uri = mongoc_uri_copy (mock_server_get_uri (mock_server));
1326+
/* increase heartbeatFrequencyMS to prevent background server selection. */
1327+
mongoc_uri_set_option_as_int32 (uri, "heartbeatFrequencyMS", 99999);
1328+
pool = mongoc_client_pool_new (uri);
1329+
mongoc_uri_destroy (uri);
1330+
client = mongoc_client_pool_pop (pool);
1331+
/* do server selection to add this server to the topology. this does not add
1332+
* a cluster node for this server. */
1333+
sd = mongoc_client_select_server (client, false, NULL, NULL);
1334+
BSON_ASSERT (sd);
1335+
mongoc_server_description_destroy (sd);
1336+
mock_server_remove_autoresponder (mock_server, autoresponder_id);
1337+
/* now create a cluster node by running a command. */
1338+
future = future_client_command_simple (
1339+
client, "test", tmp_bson ("{'ping': 1}"), NULL, NULL, &error);
1340+
/* the client adds a cluster node, creating a stream to the server, and then
1341+
* sends an ismaster request. */
1342+
request = mock_server_receives_ismaster (mock_server);
1343+
/* CDRIVER-2576: the server replies with an error, so
1344+
* _mongoc_stream_run_ismaster returns NULL, which
1345+
* _mongoc_cluster_run_ismaster must check. */
1346+
mock_server_replies_simple (request, "{'ok': 0}");
1347+
request_destroy (request);
1348+
future_wait (future);
1349+
future_destroy (future);
1350+
mock_server_destroy (mock_server);
1351+
mongoc_client_pool_push (pool, client);
1352+
mongoc_client_pool_destroy (pool);
1353+
}
13081354

13091355
void
13101356
test_cluster_install (TestSuite *suite)
@@ -1426,4 +1472,6 @@ test_cluster_install (TestSuite *suite)
14261472
"/Cluster/not_master_auth/pooled/op_msg",
14271473
test_not_master_auth_pooled_op_msg,
14281474
test_framework_skip_if_slow);
1475+
TestSuite_AddMockServerTest (
1476+
suite, "/Cluster/ismaster_fails", test_cluster_ismaster_fails);
14291477
}

0 commit comments

Comments
 (0)