Пример #1
0
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
Пример #2
0
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
Пример #3
0
 def _get_rtt(server_name):
     return server_name, get_http_rtt(server_name)
Пример #4
0
 def _get_rtt(server_name):
     return server_name, get_http_rtt(server_name)