Retry when speedtest fails. (#2657)
This commit is contained in:
parent
996b75e18c
commit
e3123671bf
|
|
@ -1,6 +1,7 @@
|
||||||
import datetime
|
import datetime
|
||||||
import pydantic
|
import pydantic
|
||||||
import http.client
|
import http.client
|
||||||
|
import urllib.error
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from typing import (
|
from typing import (
|
||||||
|
|
@ -32,27 +33,42 @@ class MirrorStatusEntryV3(pydantic.BaseModel):
|
||||||
_speed: float | None = None
|
_speed: float | None = None
|
||||||
_hostname: str | None = None
|
_hostname: str | None = None
|
||||||
_port: int | None = None
|
_port: int | None = None
|
||||||
|
_speedtest_retries: int | None = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def speed(self) -> float | None:
|
def speed(self) -> float:
|
||||||
if self._speed is None:
|
if self._speed is None:
|
||||||
info(f"Checking download speed of {self._hostname}[{self.score}] by fetching: {self.url}core/os/x86_64/core.db")
|
if not self._speedtest_retries:
|
||||||
req = urllib.request.Request(url=f"{self.url}core/os/x86_64/core.db")
|
self._speedtest_retries = 3
|
||||||
|
elif self._speedtest_retries < 1:
|
||||||
|
self._speedtest_retries = 1
|
||||||
|
|
||||||
try:
|
_retry = 0
|
||||||
with urllib.request.urlopen(req, None, 5) as handle, DownloadTimer(timeout=5) as timer:
|
while _retry < self._speedtest_retries and self._speed is None:
|
||||||
size = len(handle.read())
|
info(f"Checking download speed of {self._hostname}[{self.score}] by fetching: {self.url}core/os/x86_64/core.db")
|
||||||
|
req = urllib.request.Request(url=f"{self.url}core/os/x86_64/core.db")
|
||||||
|
|
||||||
self._speed = size / timer.time
|
try:
|
||||||
debug(f" speed: {self._speed} ({int(self._speed / 1024 / 1024 * 100) / 100}MiB/s)")
|
with urllib.request.urlopen(req, None, 5) as handle, DownloadTimer(timeout=5) as timer:
|
||||||
except http.client.IncompleteRead:
|
size = len(handle.read())
|
||||||
debug(" speed: <undetermined>")
|
|
||||||
self._speed = 0
|
self._speed = size / timer.time
|
||||||
except urllib.error.URLError as error:
|
debug(f" speed: {self._speed} ({int(self._speed / 1024 / 1024 * 100) / 100}MiB/s)")
|
||||||
debug(f" speed: <undetermined> ({error})")
|
# Do not retry error
|
||||||
self._speed = 0
|
except (urllib.error.URLError, ) as error:
|
||||||
except Exception as error:
|
debug(f" speed: <undetermined> ({error}), skip")
|
||||||
debug(f" speed: <undetermined> ({error})")
|
self._speed = 0
|
||||||
|
# Do retry error
|
||||||
|
except (http.client.IncompleteRead, ConnectionResetError) as error:
|
||||||
|
debug(f" speed: <undetermined> ({error}), retry")
|
||||||
|
# Catch all
|
||||||
|
except Exception as error:
|
||||||
|
debug(f" speed: <undetermined> ({error}), skip")
|
||||||
|
self._speed = 0
|
||||||
|
|
||||||
|
_retry += 1
|
||||||
|
|
||||||
|
if self._speed is None:
|
||||||
self._speed = 0
|
self._speed = 0
|
||||||
|
|
||||||
return self._speed
|
return self._speed
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue