Skip to content

Commit 6b364fa

Browse files
committed
Use hello command after seeing helloOk in legacy hello response
1 parent 1774612 commit 6b364fa

File tree

7 files changed

+170
-33
lines changed

7 files changed

+170
-33
lines changed

src/libmongoc/src/mongoc/mongoc-server-monitor.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,8 @@ _server_monitor_polling_hello (mongoc_server_monitor_t *server_monitor,
329329
const bson_t *hello;
330330
bool ret;
331331

332-
hello = _mongoc_topology_scanner_get_hello_cmd (
333-
server_monitor->topology->scanner);
332+
hello = _mongoc_topology_scanner_get_monitoring_cmd (
333+
server_monitor->topology->scanner, server_monitor->description->hello_ok);
334334
bson_copy_to (hello, &cmd);
335335

336336
_server_monitor_append_cluster_time (server_monitor, &cmd);
@@ -609,8 +609,8 @@ _server_monitor_awaitable_hello (mongoc_server_monitor_t *server_monitor,
609609
const bson_t *hello;
610610
bool ret = false;
611611

612-
hello = _mongoc_topology_scanner_get_hello_cmd (
613-
server_monitor->topology->scanner);
612+
hello = _mongoc_topology_scanner_get_monitoring_cmd (
613+
server_monitor->topology->scanner, server_monitor->description->hello_ok);
614614
bson_copy_to (hello, &cmd);
615615

616616
_server_monitor_append_cluster_time (server_monitor, &cmd);
@@ -1052,6 +1052,16 @@ static BSON_THREAD_FUN (_server_monitor_thread, server_monitor_void)
10521052
continue;
10531053
}
10541054

1055+
/* Update the server description of the server monitor to ensure we're
1056+
* running the correct heartbeat command in the future */
1057+
if (description->has_hello_response) {
1058+
mongoc_server_description_handle_hello (
1059+
server_monitor->description,
1060+
&description->last_hello_response,
1061+
description->round_trip_time_msec,
1062+
&description->error);
1063+
}
1064+
10551065
_server_monitor_update_topology_description (server_monitor, description);
10561066

10571067
/* Immediately proceed to the next check if the previous response was

src/libmongoc/src/mongoc/mongoc-topology-scanner-private.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ typedef struct mongoc_topology_scanner_node {
5454
int64_t last_used;
5555
int64_t last_failed;
5656
bool has_auth;
57+
bool hello_ok;
5758
mongoc_host_list_t host;
5859
struct mongoc_topology_scanner *ts;
5960

@@ -84,6 +85,7 @@ typedef struct mongoc_topology_scanner {
8485
int64_t connect_timeout_msec;
8586
mongoc_topology_scanner_node_t *nodes;
8687
bson_t hello_cmd;
88+
bson_t legacy_hello_cmd;
8789
bson_t handshake_cmd;
8890
bson_t cluster_time;
8991
bool handshake_ok_to_send;
@@ -130,7 +132,8 @@ mongoc_topology_scanner_valid (mongoc_topology_scanner_t *ts);
130132
void
131133
mongoc_topology_scanner_add (mongoc_topology_scanner_t *ts,
132134
const mongoc_host_list_t *host,
133-
uint32_t id);
135+
uint32_t id,
136+
bool hello_ok);
134137

135138
void
136139
mongoc_topology_scanner_scan (mongoc_topology_scanner_t *ts, uint32_t id);
@@ -194,7 +197,8 @@ _mongoc_topology_scanner_get_speculative_auth_mechanism (
194197
const mongoc_uri_t *uri);
195198

196199
const bson_t *
197-
_mongoc_topology_scanner_get_hello_cmd (mongoc_topology_scanner_t *ts);
200+
_mongoc_topology_scanner_get_monitoring_cmd (mongoc_topology_scanner_t *ts,
201+
bool hello_ok);
198202

199203
const bson_t *
200204
_mongoc_topology_scanner_get_handshake_cmd (mongoc_topology_scanner_t *ts);

src/libmongoc/src/mongoc/mongoc-topology-scanner.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,22 +106,27 @@ _jumpstart_other_acmds (mongoc_topology_scanner_node_t *node,
106106
static void
107107
_add_hello (mongoc_topology_scanner_t *ts)
108108
{
109-
bson_t *cmd = &ts->hello_cmd;
110109
mongoc_server_api_t *api = ts->api;
111110

111+
BSON_APPEND_INT32 (&ts->hello_cmd, "hello", 1);
112+
BSON_APPEND_BOOL (&ts->hello_cmd, "helloOk", true);
113+
112114
if (api) {
113-
BSON_APPEND_INT32 (cmd, "hello", 1);
114-
_mongoc_cmd_append_server_api (cmd, api);
115+
BSON_APPEND_INT32 (&ts->legacy_hello_cmd, "hello", 1);
116+
117+
_mongoc_cmd_append_server_api (&ts->hello_cmd, api);
118+
_mongoc_cmd_append_server_api (&ts->legacy_hello_cmd, api);
115119
} else {
116-
BSON_APPEND_INT32 (cmd, HANDSHAKE_CMD_LEGACY_HELLO, 1);
117-
BSON_APPEND_BOOL (cmd, "helloOk", true);
120+
BSON_APPEND_INT32 (&ts->legacy_hello_cmd, HANDSHAKE_CMD_LEGACY_HELLO, 1);
121+
BSON_APPEND_BOOL (&ts->legacy_hello_cmd, "helloOk", true);
118122
}
119123
}
120124

121125
static void
122126
_init_hello (mongoc_topology_scanner_t *ts)
123127
{
124128
bson_init (&ts->hello_cmd);
129+
bson_init (&ts->legacy_hello_cmd);
125130
bson_init (&ts->handshake_cmd);
126131
bson_init (&ts->cluster_time);
127132

@@ -132,6 +137,7 @@ static void
132137
_reset_hello (mongoc_topology_scanner_t *ts)
133138
{
134139
bson_reinit (&ts->hello_cmd);
140+
bson_reinit (&ts->legacy_hello_cmd);
135141
bson_reinit (&ts->handshake_cmd);
136142

137143
_add_hello (ts);
@@ -255,7 +261,7 @@ _build_handshake_cmd (mongoc_topology_scanner_t *ts)
255261
char buf[16];
256262

257263
bson_destroy (doc);
258-
bson_copy_to (&ts->hello_cmd, doc);
264+
bson_copy_to (&ts->legacy_hello_cmd, doc);
259265

260266
BSON_APPEND_DOCUMENT_BEGIN (doc, HANDSHAKE_FIELD, &subdoc);
261267
res = _mongoc_handshake_build_doc_with_application (&subdoc, ts->appname);
@@ -280,9 +286,10 @@ _build_handshake_cmd (mongoc_topology_scanner_t *ts)
280286
}
281287

282288
const bson_t *
283-
_mongoc_topology_scanner_get_hello_cmd (mongoc_topology_scanner_t *ts)
289+
_mongoc_topology_scanner_get_monitoring_cmd (mongoc_topology_scanner_t *ts,
290+
bool hello_ok)
284291
{
285-
return &ts->hello_cmd;
292+
return hello_ok ? &ts->hello_cmd : &ts->legacy_hello_cmd;
286293
}
287294

288295
/* Caller must lock topology->mutex to protect handshake_cmd. This
@@ -303,7 +310,7 @@ _mongoc_topology_scanner_get_handshake_cmd (mongoc_topology_scanner_t *ts)
303310

304311
/* If the doc turned out to be too big */
305312
if (!ts->handshake_ok_to_send) {
306-
return &ts->hello_cmd;
313+
return &ts->legacy_hello_cmd;
307314
}
308315

309316
return &ts->handshake_cmd;
@@ -321,7 +328,8 @@ _begin_hello_cmd (mongoc_topology_scanner_node_t *node,
321328

322329
if (node->last_used != -1 && node->last_failed == -1) {
323330
/* The node's been used before and not failed recently */
324-
bson_copy_to (&ts->hello_cmd, &cmd);
331+
bson_copy_to (_mongoc_topology_scanner_get_monitoring_cmd (ts, node->hello_ok),
332+
&cmd);
325333
} else {
326334
bson_copy_to (_mongoc_topology_scanner_get_handshake_cmd (ts), &cmd);
327335
}
@@ -429,6 +437,7 @@ mongoc_topology_scanner_destroy (mongoc_topology_scanner_t *ts)
429437

430438
mongoc_async_destroy (ts->async);
431439
bson_destroy (&ts->hello_cmd);
440+
bson_destroy (&ts->legacy_hello_cmd);
432441
bson_destroy (&ts->handshake_cmd);
433442
bson_destroy (&ts->cluster_time);
434443
mongoc_server_api_destroy (ts->api);
@@ -450,7 +459,8 @@ mongoc_topology_scanner_valid (mongoc_topology_scanner_t *ts)
450459
void
451460
mongoc_topology_scanner_add (mongoc_topology_scanner_t *ts,
452461
const mongoc_host_list_t *host,
453-
uint32_t id)
462+
uint32_t id,
463+
bool hello_ok)
454464
{
455465
mongoc_topology_scanner_node_t *node;
456466

@@ -462,6 +472,7 @@ mongoc_topology_scanner_add (mongoc_topology_scanner_t *ts,
462472
node->ts = ts;
463473
node->last_failed = -1;
464474
node->last_used = -1;
475+
node->hello_ok = hello_ok;
465476
bson_init (&node->speculative_auth_response);
466477

467478
DL_APPEND (ts->nodes, node);

src/libmongoc/src/mongoc/mongoc-topology.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,19 @@ _mongoc_topology_reconcile_add_nodes (mongoc_server_description_t *sd,
4343
mongoc_topology_t *topology)
4444
{
4545
mongoc_topology_scanner_t *scanner = topology->scanner;
46+
mongoc_topology_scanner_node_t *node;
47+
48+
/* Search by ID and update hello_ok */
49+
node = mongoc_topology_scanner_get_node (scanner, sd->id);
50+
if (node) {
51+
node->hello_ok = sd->hello_ok;
52+
53+
return true;
54+
}
4655

47-
/* quickly search by id, then check if a node for this host was retired in
48-
* this scan. */
49-
if (!mongoc_topology_scanner_get_node (scanner, sd->id) &&
50-
!mongoc_topology_scanner_has_node_for_host (scanner, &sd->host)) {
51-
mongoc_topology_scanner_add (scanner, &sd->host, sd->id);
56+
/* Check if a node for this host was retired in this scan. */
57+
if (!mongoc_topology_scanner_has_node_for_host (scanner, &sd->host)) {
58+
mongoc_topology_scanner_add (scanner, &sd->host, sd->id, sd->hello_ok);
5259
mongoc_topology_scanner_scan (scanner, sd->id);
5360
}
5461

@@ -189,9 +196,9 @@ _mongoc_topology_scanner_cb (uint32_t id,
189196
_mongoc_topology_update_no_lock (
190197
id, hello_response, rtt_msec, topology, error);
191198

192-
/* The processing of the hello results above may have added/removed
193-
* server descriptions. We need to reconcile that with our monitoring
194-
* agents
199+
/* The processing of the hello results above may have added, changed, or
200+
* removed server descriptions. We need to reconcile that with our
201+
* monitoring agents
195202
*/
196203
mongoc_topology_reconcile (topology);
197204

@@ -442,7 +449,7 @@ mongoc_topology_new (const mongoc_uri_t *uri, bool single_threaded)
442449
while (hl) {
443450
mongoc_topology_description_add_server (
444451
&topology->description, hl->host_and_port, &id);
445-
mongoc_topology_scanner_add (topology->scanner, hl, id);
452+
mongoc_topology_scanner_add (topology->scanner, hl, id, false);
446453

447454
hl = hl->next;
448455
}

src/libmongoc/tests/test-happy-eyeballs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ _testcase_run (he_testcase_t *testcase)
304304
testcase->state.start = bson_get_monotonic_time ();
305305

306306
mongoc_topology_scanner_add (
307-
ts, &testcase->state.host, 1 /* any server id is ok. */);
307+
ts, &testcase->state.host, 1 /* any server id is ok. */, false);
308308
mongoc_topology_scanner_scan (ts, 1);
309309
/* how many commands should we have initially? */
310310
ASSERT_CMPINT ((int) (ts->async->ncmds), ==, expected->initial_acmds);

src/libmongoc/tests/test-mongoc-topology-scanner.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ _test_topology_scanner (bool with_ssl)
9292
mongoc_topology_scanner_add (
9393
topology_scanner,
9494
mongoc_uri_get_hosts (mock_server_get_uri (servers[i])),
95-
(uint32_t) i);
95+
(uint32_t) i,
96+
false);
9697
}
9798

9899
for (i = 0; i < 3; i++) {
@@ -498,7 +499,7 @@ test_topology_scanner_dns_testcase (dns_testcase_t *testcase)
498499
BSON_ASSERT (!host.next);
499500
bson_free (host_str);
500501

501-
mongoc_topology_scanner_add (ts, &host, 1);
502+
mongoc_topology_scanner_add (ts, &host, 1, false);
502503
mongoc_topology_scanner_scan (ts, 1 /* any server id is ok. */);
503504
ASSERT_CMPINT ((int) (ts->async->ncmds), ==, testcase->expected_ncmds);
504505
mongoc_topology_scanner_work (ts);
@@ -603,7 +604,7 @@ test_topology_retired_fails_to_initiate (void)
603604
BSON_ASSERT (_mongoc_host_list_from_string (
604605
&host_list, mock_server_get_host_and_port (server)));
605606

606-
mongoc_topology_scanner_add (scanner, &host_list, 1);
607+
mongoc_topology_scanner_add (scanner, &host_list, 1, false);
607608
mongoc_topology_scanner_start (scanner, false);
608609
BSON_ASSERT (scanner->async->ncmds > 0);
609610
/* retire the node */

0 commit comments

Comments
 (0)