Description
Two bugs with mongoc_topology_select in 1.3.x when serverSelectionTryOnce is turned off.
Bug #1: instead of sleeping a half second between server checks, mongoc_topology_select sleeps half a second longer between each server check until the next sleep would exceed the server selection timeout.
Consider the 1.3.5 code in mongoc_topology_select. "try_once" is false, connectTimeoutMS is 500, socketTimeoutMS is 60,000:
/* call the start time "0" */
|
loop_start = loop_end = 0
|
expire_at = 30 seconds
|
next_update = something negative
|
topology->stale = true
|
|
|
first loop iteration:
|
scan_ready = something negative
|
sleep_usec = something negative
|
spend, let's say, 5 ms in _mongoc_topology_do_blocking_scan
|
topology->last_scan = now = 5ms
|
|
|
second loop iteration:
|
scan_ready = 505ms
|
sleep_usec = 505ms
|
sleep for 505ms
|
spend 5ms in _mongoc_topology_do_blocking_scan
|
topology->last_scan = now = 510ms
|
|
|
third loop iteration:
|
scan_ready = 1010ms
|
sleep_usec = 1010ms
|
sleep for 1010ms
|
spend 5ms in _mongoc_topology_do_blocking_scan
|
Bug #2: when scan_ready has advanced enough to exceed expire_at, the error message should be the standard "serverselectiontimeoutms timed out", not "minheartbeatfrequencyms not reached yet".