Skip to content

Commit 2f89aed

Browse files
scotthuntkevinAlbs
andauthored
CDRIVER-5548 Enable setting socket timeout per client (#1556)
* this allows use of a single mongoc_client_pool_t even when different timeout values are desired * note: timeout is restored on mongoc_client_pool_push() --------- Co-authored-by: Kevin Albertson <[email protected]>
1 parent 58aa8c3 commit 2f89aed

9 files changed

+91
-2
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
:man_page: mongoc_client_set_sockettimeoutms
2+
3+
mongoc_client_set_sockettimeoutms()
4+
===================================
5+
6+
Synopsis
7+
--------
8+
9+
.. code-block:: c
10+
11+
void
12+
mongoc_client_set_sockettimeoutms (mongoc_client_t *client, int32_t timeoutms);
13+
14+
Change the ``sockettimeoutms`` of the :symbol:`mongoc_client_t`.
15+
16+
If ``client`` was obtained from a :symbol:`mongoc_client_pool_t`, the socket timeout is restored to the previous value when calling :symbol:`mongoc_client_pool_push`.
17+
18+
Parameters
19+
----------
20+
21+
* ``client``: A :symbol:`mongoc_client_t`.
22+
* ``timeoutms``: The requested timeout value in milliseconds.
23+
24+
.. seealso::
25+
26+
| :ref:`URI Connection Options <connection_options>`

src/libmongoc/doc/mongoc_client_t.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ Example
8787
mongoc_client_set_read_concern
8888
mongoc_client_set_read_prefs
8989
mongoc_client_set_server_api
90+
mongoc_client_set_sockettimeoutms
9091
mongoc_client_set_ssl_opts
9192
mongoc_client_set_stream_initiator
9293
mongoc_client_set_write_concern

src/libmongoc/doc/mongoc_uri_t.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ IPv4 and IPv6
8484

8585
.. include:: includes/ipv4-and-ipv6.txt
8686

87+
.. _connection_options:
88+
8789
Connection Options
8890
------------------
8991

src/libmongoc/src/mongoc/mongoc-client-pool.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,9 @@ mongoc_client_pool_push (mongoc_client_pool_t *pool, mongoc_client_t *client)
366366
BSON_ASSERT_PARAM (pool);
367367
BSON_ASSERT_PARAM (client);
368368

369+
/* reset sockettimeoutms to the default in case it was changed with mongoc_client_set_sockettimeoutms() */
370+
mongoc_cluster_reset_sockettimeoutms (&client->cluster);
371+
369372
bson_mutex_lock (&pool->mutex);
370373
_mongoc_queue_push_head (&pool->queue, client);
371374

src/libmongoc/src/mongoc/mongoc-client.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,13 @@ mongoc_client_destroy (mongoc_client_t *client)
11251125
}
11261126

11271127

1128+
void
1129+
mongoc_client_set_sockettimeoutms (mongoc_client_t *client, int32_t timeoutms)
1130+
{
1131+
BSON_ASSERT_PARAM (client);
1132+
mongoc_cluster_set_sockettimeoutms (&client->cluster, timeoutms);
1133+
}
1134+
11281135
/*
11291136
*--------------------------------------------------------------------------
11301137
*

src/libmongoc/src/mongoc/mongoc-client.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ MONGOC_EXPORT (mongoc_client_t *)
107107
mongoc_client_new_from_uri (const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT;
108108
MONGOC_EXPORT (mongoc_client_t *)
109109
mongoc_client_new_from_uri_with_error (const mongoc_uri_t *uri, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT;
110+
MONGOC_EXPORT (void)
111+
mongoc_client_set_sockettimeoutms (mongoc_client_t *client, int32_t timeoutms);
110112
MONGOC_EXPORT (const mongoc_uri_t *)
111113
mongoc_client_get_uri (const mongoc_client_t *client);
112114
MONGOC_EXPORT (void)

src/libmongoc/src/mongoc/mongoc-cluster-private.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ mongoc_cluster_init (mongoc_cluster_t *cluster, const mongoc_uri_t *uri, void *c
7272
void
7373
mongoc_cluster_destroy (mongoc_cluster_t *cluster);
7474

75+
void
76+
mongoc_cluster_set_sockettimeoutms (mongoc_cluster_t *cluster, int32_t sockettimeoutms);
77+
78+
void
79+
mongoc_cluster_reset_sockettimeoutms (mongoc_cluster_t *cluster);
80+
7581
void
7682
mongoc_cluster_disconnect_node (mongoc_cluster_t *cluster, uint32_t id);
7783

src/libmongoc/src/mongoc/mongoc-cluster.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2513,8 +2513,7 @@ mongoc_cluster_init (mongoc_cluster_t *cluster, const mongoc_uri_t *uri, void *c
25132513
cluster->client = (mongoc_client_t *) client;
25142514
cluster->requires_auth = (mongoc_uri_get_username (uri) || mongoc_uri_get_auth_mechanism (uri));
25152515

2516-
cluster->sockettimeoutms =
2517-
mongoc_uri_get_option_as_int32 (uri, MONGOC_URI_SOCKETTIMEOUTMS, MONGOC_DEFAULT_SOCKETTIMEOUTMS);
2516+
mongoc_cluster_reset_sockettimeoutms (cluster);
25182517

25192518
cluster->socketcheckintervalms =
25202519
mongoc_uri_get_option_as_int32 (uri, MONGOC_URI_SOCKETCHECKINTERVALMS, MONGOC_TOPOLOGY_SOCKET_CHECK_INTERVAL_MS);
@@ -2562,6 +2561,21 @@ mongoc_cluster_destroy (mongoc_cluster_t *cluster) /* INOUT */
25622561
EXIT;
25632562
}
25642563

2564+
void
2565+
mongoc_cluster_set_sockettimeoutms (mongoc_cluster_t *cluster, int32_t timeoutms)
2566+
{
2567+
BSON_ASSERT_PARAM (cluster);
2568+
cluster->sockettimeoutms = timeoutms;
2569+
}
2570+
2571+
void
2572+
mongoc_cluster_reset_sockettimeoutms (mongoc_cluster_t *cluster)
2573+
{
2574+
BSON_ASSERT_PARAM (cluster);
2575+
cluster->sockettimeoutms =
2576+
mongoc_uri_get_option_as_int32 (cluster->uri, MONGOC_URI_SOCKETTIMEOUTMS, MONGOC_DEFAULT_SOCKETTIMEOUTMS);
2577+
}
2578+
25652579
static uint32_t
25662580
_mongoc_cluster_select_server_id (mongoc_client_session_t *cs,
25672581
mongoc_topology_t *topology,

src/libmongoc/tests/test-mongoc-client-pool.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <mongoc/mongoc.h>
22
#include "mongoc/mongoc-client-pool-private.h"
3+
#include <mongoc/mongoc-client-private.h>
34
#include "mongoc/mongoc-util-private.h"
45

56

@@ -454,6 +455,32 @@ test_client_pool_max_pool_size_exceeded (void)
454455
bson_free (args);
455456
}
456457

458+
static void
459+
test_client_pool_can_override_sockettimeoutms (void)
460+
{
461+
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017/?socketTimeoutMS=1000");
462+
mongoc_client_pool_t *pool = mongoc_client_pool_new (uri);
463+
464+
// Override the client's socketTimeoutMS.
465+
{
466+
mongoc_client_t *client = mongoc_client_pool_pop (pool);
467+
ASSERT_CMPINT32 (client->cluster.sockettimeoutms, ==, 1000);
468+
mongoc_client_set_sockettimeoutms (client, 2000);
469+
ASSERT_CMPINT32 (client->cluster.sockettimeoutms, ==, 2000);
470+
mongoc_client_pool_push (pool, client);
471+
}
472+
473+
// Pop again. Expect the newly popped client to have the socketTimeoutMS from the URI.
474+
{
475+
mongoc_client_t *client = mongoc_client_pool_pop (pool);
476+
ASSERT_CMPINT32 (client->cluster.sockettimeoutms, ==, 1000);
477+
mongoc_client_pool_push (pool, client);
478+
}
479+
480+
mongoc_client_pool_destroy (pool);
481+
mongoc_uri_destroy (uri);
482+
}
483+
457484
void
458485
test_client_pool_install (TestSuite *suite)
459486
{
@@ -478,4 +505,5 @@ test_client_pool_install (TestSuite *suite)
478505
#endif
479506
TestSuite_AddLive (suite, "/ClientPool/destroy_without_push", test_client_pool_destroy_without_pushing);
480507
TestSuite_AddLive (suite, "/ClientPool/max_pool_size_exceeded", test_client_pool_max_pool_size_exceeded);
508+
TestSuite_Add (suite, "/ClientPool/can_override_sockettimeoutms", test_client_pool_can_override_sockettimeoutms);
481509
}

0 commit comments

Comments
 (0)