Skip to content

Commit ff6d426

Browse files
committed
CDRIVER-1922 second assert err in stream_not_found
1 parent e3e9359 commit ff6d426

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed

src/mongoc/mongoc-cluster.c

+10-6
Original file line numberDiff line numberDiff line change
@@ -1489,10 +1489,14 @@ mongoc_server_stream_t *
14891489
_mongoc_cluster_stream_for_server (mongoc_cluster_t *cluster,
14901490
uint32_t server_id,
14911491
bool reconnect_ok,
1492-
bson_error_t *error)
1492+
bson_error_t *error /* OUT */)
14931493
{
14941494
mongoc_topology_t *topology;
14951495
mongoc_server_stream_t *server_stream;
1496+
bson_error_t err_local;
1497+
/* if fetch_stream fails we need a place to receive error details and pass
1498+
* them to mongoc_topology_invalidate_server. */
1499+
bson_error_t *err_ptr = error ? error : &err_local;
14961500

14971501
ENTRY;
14981502

@@ -1503,27 +1507,27 @@ _mongoc_cluster_stream_for_server (mongoc_cluster_t *cluster,
15031507
server_stream = mongoc_cluster_fetch_stream_single (cluster,
15041508
server_id,
15051509
reconnect_ok,
1506-
error);
1510+
err_ptr);
15071511

15081512
} else {
15091513
server_stream = mongoc_cluster_fetch_stream_pooled (cluster,
15101514
server_id,
15111515
reconnect_ok,
1512-
error);
1516+
err_ptr);
15131517

15141518
}
15151519

15161520
if (!server_stream) {
1517-
/* Server Discovery And Monitoring Spec: When an application operation
1521+
/* Server Discovery And Monitoring Spec: "When an application operation
15181522
* fails because of any network error besides a socket timeout, the
15191523
* client MUST replace the server's description with a default
15201524
* ServerDescription of type Unknown, and fill the ServerDescription's
1521-
* error field with useful information.
1525+
* error field with useful information."
15221526
*
15231527
* error was filled by fetch_stream_single/pooled, pass it to invalidate()
15241528
*/
15251529
mongoc_cluster_disconnect_node (cluster, server_id);
1526-
mongoc_topology_invalidate_server (topology, server_id, error);
1530+
mongoc_topology_invalidate_server (topology, server_id, err_ptr);
15271531
}
15281532

15291533
RETURN (server_stream);

tests/test-mongoc-client.c

+83
Original file line numberDiff line numberDiff line change
@@ -2538,6 +2538,83 @@ test_client_appname_pooled_no_uri (void)
25382538
test_client_appname (true, false);
25392539
}
25402540

2541+
/* test a disconnect with a NULL bson_error_t * passed to command_simple() */
2542+
static void
2543+
_test_null_error_pointer (bool pooled)
2544+
{
2545+
mock_server_t *server;
2546+
mongoc_uri_t *uri;
2547+
mongoc_client_pool_t *pool = NULL;
2548+
mongoc_client_t *client;
2549+
future_t *future;
2550+
request_t *request;
2551+
2552+
capture_logs (true);
2553+
2554+
server = mock_server_with_autoismaster (0);
2555+
mock_server_run (server);
2556+
uri = mongoc_uri_copy (mock_server_get_uri (server));
2557+
mongoc_uri_set_option_as_int32 (uri, "serverSelectionTimeoutMS", 1000);
2558+
2559+
if (pooled) {
2560+
pool = mongoc_client_pool_new (uri);
2561+
client = mongoc_client_pool_pop (pool);
2562+
} else {
2563+
client = mongoc_client_new_from_uri (uri);
2564+
}
2565+
2566+
/* connect */
2567+
future = future_client_command_simple (client, "test",
2568+
tmp_bson ("{'ping': 1}"), NULL, NULL,
2569+
NULL);
2570+
request = mock_server_receives_command (server, "test",
2571+
MONGOC_QUERY_SLAVE_OK, NULL);
2572+
mock_server_replies_ok_and_destroys (request);
2573+
ASSERT (future_get_bool (future));
2574+
future_destroy (future);
2575+
2576+
/* disconnect */
2577+
mock_server_destroy (server);
2578+
if (pooled) {
2579+
mongoc_cluster_disconnect_node (&client->cluster, 1);
2580+
} else {
2581+
mongoc_topology_scanner_node_t *scanner_node;
2582+
2583+
scanner_node = mongoc_topology_scanner_get_node (
2584+
client->topology->scanner, 1);
2585+
mongoc_stream_destroy (scanner_node->stream);
2586+
scanner_node->stream = NULL;
2587+
}
2588+
2589+
/* doesn't abort with assertion failure */
2590+
future = future_client_command_simple (client, "test",
2591+
tmp_bson ("{'ping': 1}"), NULL, NULL,
2592+
NULL /* error */);
2593+
2594+
ASSERT (!future_get_bool (future));
2595+
future_destroy (future);
2596+
2597+
if (pooled) {
2598+
mongoc_client_pool_push (pool, client);
2599+
mongoc_client_pool_destroy (pool);
2600+
} else {
2601+
mongoc_client_destroy (client);
2602+
}
2603+
2604+
mongoc_uri_destroy (uri);
2605+
}
2606+
2607+
static void
2608+
test_null_error_pointer_single (void *ctx)
2609+
{
2610+
_test_null_error_pointer (false);
2611+
}
2612+
2613+
static void
2614+
test_null_error_pointer_pooled (void *ctx)
2615+
{
2616+
_test_null_error_pointer (true);
2617+
}
25412618

25422619
void
25432620
test_client_install (TestSuite *suite)
@@ -2640,4 +2717,10 @@ test_client_install (TestSuite *suite)
26402717
TestSuite_AddLive (suite, "/Client/select_server/pooled", test_mongoc_client_select_server_pooled);
26412718
TestSuite_AddLive (suite, "/Client/select_server/err/single", test_mongoc_client_select_server_error_single);
26422719
TestSuite_AddLive (suite, "/Client/select_server/err/pooled", test_mongoc_client_select_server_error_pooled);
2720+
TestSuite_AddFull (suite, "/Client/null_error_pointer/single",
2721+
test_null_error_pointer_single, NULL, NULL,
2722+
test_framework_skip_if_slow);
2723+
TestSuite_AddFull (suite, "/Client/null_error_pointer/pooled",
2724+
test_null_error_pointer_pooled, NULL, NULL,
2725+
test_framework_skip_if_slow);
26432726
}

0 commit comments

Comments
 (0)