fix(aria2): disable fsync and relax RPC timeouts to prevent aria2 freeze on large files

aria2 default --fsync=true calls fsync() after each write, which blocks
the entire single-threaded process on large files under Docker overlay.
Add --fsync=false to eliminate this blocking source.

Relax aiohttp session timeout: total=30 → sock_connect=10, sock_read=60
so that transient I/O delays don't cut off legitimate tellStatus RPCs.

Increase retry params (4 attempts, 3s delay) to give aria2 more recovery
time when blocked on synchronous I/O.
This commit is contained in:
Will Miao
2026-06-26 14:19:37 +08:00
parent 4ef32d3a96
commit 154fcd803b
2 changed files with 6 additions and 3 deletions

View File

@@ -138,7 +138,7 @@ class Aria2Downloader:
self._transfers.pop(download_id, None)
async def _get_status_with_retry(
self, download_id: str, *, max_retries: int = 3, retry_delay: float = 1.0
self, download_id: str, *, max_retries: int = 4, retry_delay: float = 3.0
) -> Optional[Dict[str, Any]]:
"""Call get_status with retry for transient RPC failures.
@@ -510,6 +510,7 @@ class Aria2Downloader:
"--continue=true",
"--daemon=false",
"--quiet=true",
"--fsync=false",
f"--stop-with-process={os.getpid()}",
]
@@ -649,7 +650,9 @@ class Aria2Downloader:
if self._rpc_session is None or self._rpc_session.closed:
async with self._rpc_session_lock:
if self._rpc_session is None or self._rpc_session.closed:
timeout = aiohttp.ClientTimeout(total=30)
timeout = aiohttp.ClientTimeout(
total=None, sock_connect=10, sock_read=60
)
self._rpc_session = aiohttp.ClientSession(timeout=timeout)
return self._rpc_session