Retry when speedtest fails. (#2657)

This commit is contained in:
Suica 2024-11-04 20:59:39 +09:00 committed by GitHub
parent 996b75e18c
commit e3123671bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 32 additions and 16 deletions

View File

@ -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