aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/error.py
diff options
context:
space:
mode:
authoralexv-smirnov <alex@ydb.tech>2023-06-13 11:05:01 +0300
committeralexv-smirnov <alex@ydb.tech>2023-06-13 11:05:01 +0300
commitbf0f13dd39ee3e65092ba3572bb5b1fcd125dcd0 (patch)
tree1d1df72c0541a59a81439842f46d95396d3e7189 /build/scripts/error.py
parent8bfdfa9a9bd19bddbc58d888e180fbd1218681be (diff)
downloadydb-bf0f13dd39ee3e65092ba3572bb5b1fcd125dcd0.tar.gz
add ymake export to ydb
Diffstat (limited to 'build/scripts/error.py')
-rw-r--r--build/scripts/error.py77
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