Source code for swh.loader.svn.svn_retry

# Copyright (C) 2022  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information


import logging

from subvertpy import SubversionException
from tenacity import retry
from tenacity.before_sleep import before_sleep_log
from tenacity.retry import retry_if_exception
from tenacity.stop import stop_after_attempt
from tenacity.wait import wait_exponential

logger = logging.getLogger(__name__)

SVN_RETRY_WAIT_EXP_BASE = 10
SVN_RETRY_MAX_ATTEMPTS = 3


[docs] def is_retryable_svn_exception(exception): if isinstance(exception, SubversionException): return exception.args[0].startswith( ( "Connection timed out", "Unable to connect to a repository at URL", "Error running context: The server unexpectedly closed the connection", "ra_serf: The server sent a truncated HTTP response body", "Unexpected HTTP status 504 'Gateway Time-out'", ) ) return isinstance(exception, (ConnectionResetError, TimeoutError))
[docs] def svn_retry(): return retry( retry=retry_if_exception(is_retryable_svn_exception), wait=wait_exponential(exp_base=SVN_RETRY_WAIT_EXP_BASE), stop=stop_after_attempt(max_attempt_number=SVN_RETRY_MAX_ATTEMPTS), before_sleep=before_sleep_log(logger, logging.DEBUG), reraise=True, )