summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2019-04-01 15:00:11 +0200
committerJürg Billeter <j@bitron.ch>2019-04-12 11:17:33 +0200
commit96cca33a756b5855153e84f719029e80f2fa69c2 (patch)
treee65641e5ab5d460b7c65c20d1e668783df947891
parent902384aa43fd6ff3ab04503a7df935a7c561c495 (diff)
downloadbuildstream-96cca33a756b5855153e84f719029e80f2fa69c2.tar.gz
_sandboxremote.py: Fetch only needed directories
-rw-r--r--buildstream/sandbox/_sandboxremote.py24
1 files changed, 21 insertions, 3 deletions
diff --git a/buildstream/sandbox/_sandboxremote.py b/buildstream/sandbox/_sandboxremote.py
index 1219afefc..2cb7e2538 100644
--- a/buildstream/sandbox/_sandboxremote.py
+++ b/buildstream/sandbox/_sandboxremote.py
@@ -29,6 +29,7 @@ import grpc
from .. import utils
from .._message import Message, MessageType
from .sandbox import Sandbox, SandboxCommandError, _SandboxBatch
+from ..storage.directory import VirtualDirectoryError
from ..storage._casbaseddirectory import CasBasedDirectory
from .. import _signals
from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2, remote_execution_pb2_grpc
@@ -253,7 +254,7 @@ class SandboxRemote(Sandbox):
raise SandboxError("Failed trying to send CancelOperation request: "
"{} ({})".format(e.details(), e.code().name))
- def process_job_output(self, output_directories, output_files):
+ def process_job_output(self, output_directories, output_files, *, failure):
# Reads the remote execution server response to an execution request.
#
# output_directories is an array of OutputDirectory objects.
@@ -295,7 +296,23 @@ class SandboxRemote(Sandbox):
# Fetch the file blobs if needed
if self._output_files_required or artifactcache.has_push_remotes():
- required_blobs = cascache.required_blobs_for_directory(dir_digest)
+ required_blobs = []
+ directories = []
+
+ directories.append(self._output_directory)
+ if self._build_directory and (self._build_directory_always or failure):
+ directories.append(self._build_directory)
+
+ for directory in directories:
+ try:
+ vdir = new_dir.descend(*directory.strip(os.sep).split(os.sep))
+ dir_digest = vdir._get_digest()
+ required_blobs += cascache.required_blobs_for_directory(dir_digest)
+ except VirtualDirectoryError:
+ # If the directory does not exist, there is no need to
+ # download file blobs.
+ pass
+
local_missing_blobs = cascache.local_missing_blobs(required_blobs)
if local_missing_blobs:
if self._output_files_required:
@@ -401,7 +418,8 @@ class SandboxRemote(Sandbox):
action_result = self._extract_action_result(operation)
# Get output of build
- self.process_job_output(action_result.output_directories, action_result.output_files)
+ self.process_job_output(action_result.output_directories, action_result.output_files,
+ failure=action_result.exit_code != 0)
if stdout:
if action_result.stdout_raw: