Index: rietveld.py |
diff --git a/rietveld.py b/rietveld.py |
index d49e5dd3aaaf064cd04b4d52560807d1e7dcf76a..8e99e4bc2a1663b8fb8d094b5d9155154a6aecca 100644 |
--- a/rietveld.py |
+++ b/rietveld.py |
@@ -431,18 +431,23 @@ class Rietveld(object): |
except urllib2.URLError, e: |
if retry >= (self._maxtries - 1): |
raise |
- if (not 'Name or service not known' in e.reason and |
- not 'EOF occurred in violation of protocol' in e.reason and |
- not 'timed out' in e.reason and |
- not 'The handshake operation timed out' in e.reason and |
- # On windows we hit weird bug http://crbug.com/537417 |
- # with message '[Errno 10060] A connection attempt failed...' |
- not (sys.platform.startswith('win') and |
- isinstance(e.reason, socket.error) and |
- e.reason.errno == errno.ETIMEDOUT |
- ) |
- ): |
- # Usually internal GAE flakiness. |
+ |
+ def is_transient(): |
+ # The idea here is to retry if the error isn't permanent. |
+ # Unfortunately, there are so many different possible errors, |
+ # that we end up enumerating those that are known to us to be |
+ # transient. |
+ # The reason can be a string or another exception, e.g., |
+ # socket.error or whatever else. |
+ reason_as_str = str(e.reason) |
+ for retry_anyway in [ |
+ 'Name or service not known', |
+ 'EOF occurred in violation of protocol', |
+ 'timed out']: |
+ if retry_anyway in reason_as_str: |
+ return True |
+ return False # Assume permanent otherwise. |
+ if not is_transient(): |
raise |
except socket.error, e: |
if retry >= (self._maxtries - 1): |