Skip to content

Commit d3ec435

Browse files
committed
CDRIVER-699 don't depend on precise clock
On Windows, at least, the clock resolution is milliseconds, which is not always fine enough to know that a blocking scan has been tried once since the selection loop began.
1 parent 6ec3b7a commit d3ec435

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

src/mongoc/mongoc-topology.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ mongoc_topology_select (mongoc_topology_t *topology,
377377
mongoc_server_description_t *selected_server = NULL;
378378
bool try_once;
379379
int64_t sleep_usec;
380+
bool tried_once;
380381

381382
/* These names come from the Server Selection Spec pseudocode */
382383
int64_t loop_start; /* when we entered this function */
@@ -393,6 +394,7 @@ mongoc_topology_select (mongoc_topology_t *topology,
393394
+ ((int64_t) topology->server_selection_timeout_msec * 1000);
394395

395396
if (topology->single_threaded) {
397+
tried_once = false;
396398
next_update = topology->last_scan + topology->heartbeat_msec * 1000;
397399
if (next_update < loop_start) {
398400
/* we must scan now */
@@ -418,6 +420,7 @@ mongoc_topology_select (mongoc_topology_t *topology,
418420

419421
/* takes up to connectTimeoutMS. sets "last_scan", clears "stale" */
420422
_mongoc_topology_do_blocking_scan (topology);
423+
tried_once = true;
421424
}
422425

423426
selected_server = mongoc_topology_description_select(&topology->description,
@@ -431,16 +434,18 @@ mongoc_topology_select (mongoc_topology_t *topology,
431434
}
432435

433436
topology->stale = true;
434-
loop_end = bson_get_monotonic_time ();
435437

436438
if (try_once) {
437-
if (topology->last_scan > loop_start) {
438-
/* we tried once */
439+
if (tried_once) {
440+
goto FAIL;
441+
}
442+
} else {
443+
loop_end = bson_get_monotonic_time ();
444+
445+
if (loop_end > expire_at) {
446+
/* no time left in server_selection_timeout_msec */
439447
goto FAIL;
440448
}
441-
} else if (loop_end > expire_at) {
442-
/* no time left in server_selection_timeout_msec */
443-
goto FAIL;
444449
}
445450
}
446451
}

0 commit comments

Comments
 (0)