| Index: tools/telemetry/telemetry/util/cloud_storage.py
|
| diff --git a/tools/telemetry/telemetry/util/cloud_storage.py b/tools/telemetry/telemetry/util/cloud_storage.py
|
| index ccad47fce92eda765b2b5211fb856f913d847848..5060cafe631a4cda840f477bb90ba85dc8fdb158 100644
|
| --- a/tools/telemetry/telemetry/util/cloud_storage.py
|
| +++ b/tools/telemetry/telemetry/util/cloud_storage.py
|
| @@ -69,6 +69,10 @@ class NotFoundError(CloudStorageError):
|
| pass
|
|
|
|
|
| +class ServerError(CloudStorageError):
|
| + pass
|
| +
|
| +
|
| # TODO(tonyg/dtu): Can this be replaced with distutils.spawn.find_executable()?
|
| def _FindExecutableInPath(relative_executable_path, *extra_search_paths):
|
| search_paths = list(extra_search_paths) + os.environ['PATH'].split(os.pathsep)
|
| @@ -136,13 +140,13 @@ def _RunCommand(args):
|
| 'You are attempting to access protected data with no configured',
|
| 'Failure: No handler was ready to authenticate.')):
|
| raise CredentialsError(gsutil_path)
|
| - if 'status=401' in stderr or 'status 401' in stderr:
|
| - raise CredentialsError(gsutil_path)
|
| if 'status=403' in stderr or 'status 403' in stderr:
|
| raise PermissionError(gsutil_path)
|
| if (stderr.startswith('InvalidUriError') or 'No such object' in stderr or
|
| 'No URLs matched' in stderr):
|
| raise NotFoundError(stderr)
|
| + if '500 Internal Server Error' in stderr:
|
| + raise ServerError(stderr)
|
| raise CloudStorageError(stderr)
|
|
|
| return stdout
|
| @@ -178,7 +182,11 @@ def Delete(bucket, remote_path):
|
| def Get(bucket, remote_path, local_path):
|
| url = 'gs://%s/%s' % (bucket, remote_path)
|
| logging.info('Downloading %s to %s' % (url, local_path))
|
| - _RunCommand(['cp', url, local_path])
|
| + try:
|
| + _RunCommand(['cp', url, local_path])
|
| + except ServerError:
|
| + logging.info('Cloud Storage server error, retrying download')
|
| + _RunCommand(['cp', url, local_path])
|
|
|
|
|
| def Insert(bucket, remote_path, local_path, publicly_readable=False):
|
| @@ -218,9 +226,7 @@ def GetIfChanged(file_path, bucket=None):
|
|
|
| for bucket in buckets:
|
| try:
|
| - url = 'gs://%s/%s' % (bucket, expected_hash)
|
| - _RunCommand(['cp', url, file_path])
|
| - logging.info('Downloaded %s to %s' % (url, file_path))
|
| + Get(bucket, expected_hash, file_path)
|
| return True
|
| except NotFoundError:
|
| continue
|
|
|