* Bound HTTP request timeouts and retry budget With no request timeout, Retry(total=30, backoff_factor=2, backoff_max=60) let a single unreachable server hang the client for around 26 minutes: backoff sleeps alone sum to that, and each of the 30 connection attempts could itself stall indefinitely without a timeout. Measured a black-holed connect attempt taking 75s on this machine with no timeout set, confirming the mechanism. - Add HTTP_TIMEOUT (connect, read) and a tighter retry budget (HTTP_RETRY_TOTAL/BACKOFF_FACTOR/BACKOFF_MAX) in dsc/const.py, bounding the worst case to a few minutes. - Pass timeout=HTTP_TIMEOUT on both SeafileClient HTTP calls (token fetch, remote library listing). - Add NetworkError(DscError) so a network failure is caught by start.py's existing top-level DscError handling instead of producing a bare traceback. - Add tests/test_http.py covering the retry policy values, timeout propagation, and error wrapping. - Check off the corresponding IMPROVEMENTS.md items. * Include URL and status code in NetworkError messages Copilot review on PR #28 flagged that the non-200 path for remote library listing raised NetworkError with only the raw response body, losing which request failed and its status code. The token-fetch error had the same gap. Both now include the URL and HTTP status. --------- Co-authored-by: Maxim Shulga <maxim.shulga@alludo.com>
26 lines
635 B
Python
26 lines
635 B
Python
"""Errors that must end the container with a useful message."""
|
|
|
|
|
|
class DscError(Exception):
|
|
"""Base class for failures that stop the client."""
|
|
|
|
|
|
class ConfigError(DscError):
|
|
"""The container was configured in a way that cannot be acted on."""
|
|
|
|
|
|
class DaemonError(DscError):
|
|
"""A seaf-cli command failed."""
|
|
|
|
|
|
class DaemonTimeout(DscError):
|
|
"""The daemon did not reach the expected state in time."""
|
|
|
|
|
|
class NetworkError(DscError):
|
|
"""A request to the Seafile server failed or exceeded its timeout."""
|
|
|
|
|
|
class GracefulShutdown(DscError):
|
|
"""SIGTERM or SIGINT was received; stop the daemon and exit cleanly."""
|