Skip to content

Commit

Permalink
getdeps: introduce TransientFailure exception type
Browse files Browse the repository at this point in the history
Summary:
The goal is to return an error code > 127 in the case of a
transient, retryable, infrastructure error.  This diff generates
those in the case of failure in downloading a URL or from interacting
with LFS.

Reviewed By: strager

Differential Revision: D15266838

fbshipit-source-id: 4f52a791320123968869032c37912dded464a86e
  • Loading branch information
wez authored and facebook-github-bot committed May 10, 2019
1 parent 5957be2 commit 4cc8480
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
10 changes: 9 additions & 1 deletion build/fbcode_builder/getdeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import sys

from getdeps.buildopts import setup_build_options
from getdeps.errors import TransientFailure
from getdeps.load import load_project, manifests_in_dependency_order
from getdeps.manifest import ManifestParser
from getdeps.platform import HostType, context_from_host_tuple
Expand Down Expand Up @@ -407,7 +408,14 @@ def main():
return 0
try:
return args.func(args)
except subprocess.CalledProcessError:
except TransientFailure as exc:
print("TransientFailure: %s" % str(exc))
# This return code is treated as a retryable transient infrastructure
# error by Facebook's internal CI, rather than eg: a build or code
# related error that needs to be fixed before progress can be made.
return 128
except subprocess.CalledProcessError as exc:
print("%s" % str(exc), file=sys.stderr)
print("!! Failed", file=sys.stderr)
return 1

Expand Down
16 changes: 16 additions & 0 deletions build/fbcode_builder/getdeps/errors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright (c) 2019-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree. An additional grant
# of patent rights can be found in the PATENTS file in the same directory.

from __future__ import absolute_import, division, print_function, unicode_literals


class TransientFailure(Exception):
""" Raising this error causes getdeps to return with an error code
that Sandcastle will consider to be a retryable transient
infrastructure error """

pass
9 changes: 8 additions & 1 deletion build/fbcode_builder/getdeps/fetcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

from .copytree import prefetch_dir_if_eden
from .envfuncs import Env
from .errors import TransientFailure
from .platform import is_windows
from .runcmd import run_cmd

Expand Down Expand Up @@ -548,7 +549,13 @@ def progress(self, count, block, total):

progress = Progress()
start = time.time()
(_filename, headers) = urlretrieve(url, file_name, reporthook=progress.progress)
try:
(_filename, headers) = urlretrieve(url, file_name, reporthook=progress.progress)
except OSError as exc:
raise TransientFailure(
"Failed to download %s to %s: %s" % (url, file_name, str(exc))
)

end = time.time()
sys.stdout.write(" [Complete in %f seconds]\n" % (end - start))
sys.stdout.flush()
Expand Down

0 comments on commit 4cc8480

Please sign in to comment.