diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /build/scripts/error.py | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'build/scripts/error.py')
-rw-r--r-- | build/scripts/error.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/build/scripts/error.py b/build/scripts/error.py new file mode 100644 index 0000000000..f7d8ecb2cc --- /dev/null +++ b/build/scripts/error.py @@ -0,0 +1,77 @@ +# Sync content of this file with devtools/ya/core/error/__init__.py + +TEMPORARY_ERROR_MESSAGES = [ + 'Connection reset by peer', + 'Connection timed out', + 'Function not implemented', + 'I/O operation on closed file', + 'Internal Server Error', + 'Network connection closed unexpectedly', + 'Network is unreachable', + 'No route to host', + 'No space left on device', + 'Not enough space', + 'Temporary failure in name resolution', + 'The read operation timed out', + 'timeout: timed out', +] + + +# Node exit codes +class ExitCodes(object): + TEST_FAILED = 10 + COMPILATION_FAILED = 11 + INFRASTRUCTURE_ERROR = 12 + NOT_RETRIABLE_ERROR = 13 + YT_STORE_FETCH_ERROR = 14 + + +def merge_exit_codes(exit_codes): + return max(e if e >= 0 else 1 for e in exit_codes) if exit_codes else 0 + + +def is_temporary_error(exc): + import logging + logger = logging.getLogger(__name__) + + if getattr(exc, 'temporary', False): + logger.debug("Exception has temporary attribute: %s", exc) + return True + + import errno + err = getattr(exc, 'errno', None) + + if err == errno.ECONNREFUSED or err == errno.ENETUNREACH: + logger.debug("Exception has errno attribute: %s (errno=%s)", exc, err) + return True + + import socket + + if isinstance(exc, socket.timeout) or isinstance(getattr(exc, 'reason', None), socket.timeout): + logger.debug("Socket timeout exception: %s", exc) + return True + + if isinstance(exc, socket.gaierror): + logger.debug("Getaddrinfo exception: %s", exc) + return True + + import urllib2 + + if isinstance(exc, urllib2.HTTPError) and exc.code in (429, ): + logger.debug("urllib2.HTTPError: %s", exc) + return True + + import httplib + + if isinstance(exc, httplib.IncompleteRead): + logger.debug("IncompleteRead exception: %s", exc) + return True + + exc_str = str(exc) + + for message in TEMPORARY_ERROR_MESSAGES: + if message in exc_str: + logger.debug("Found temporary error pattern (%s): %s", message, exc_str) + return True + + return False |