def test_get_http_rtt(): with patch.object(requests, "request", side_effect=requests.RequestException): assert get_http_rtt(url="url", method="get") is None seconds = iter([0.2, 0.2, 0.5]) def request_mock(method, url, **_): assert method == "get" assert url == "url" return Mock(elapsed=timedelta(seconds=next(seconds))) with patch.object(requests, "request", side_effect=request_mock): assert get_http_rtt(url="url", method="get") == 0.3
def sort_servers_closest( servers: Sequence[str]) -> Sequence[Tuple[str, float]]: """Sorts a list of servers by http round-trip time Params: servers: sequence of http server urls Returns: sequence of pairs of url,rtt in seconds, sorted by rtt, excluding failed servers (possibly empty) """ if not {urlparse(url).scheme for url in servers}.issubset({'http', 'https'}): raise TransportError('Invalid server urls') get_rtt_jobs = [ gevent.spawn(lambda url: (url, get_http_rtt(url)), server_url) for server_url in servers ] # these tasks should never raise, returns None on errors gevent.joinall(get_rtt_jobs, raise_error=False) # block and wait tasks sorted_servers: List[Tuple[str, float]] = sorted( (job.value for job in get_rtt_jobs if job.value[1] is not None), key=itemgetter(1), ) log.debug('Matrix homeserver RTT times', rtt_times=sorted_servers) return sorted_servers
def _get_rtt(server_name): return server_name, get_http_rtt(server_name)
def _get_rtt(server_name): return server_name, get_http_rtt(server_name)