diff options
Diffstat (limited to 'buildstream/_scheduler/job.py')
-rw-r--r-- | buildstream/_scheduler/job.py | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/buildstream/_scheduler/job.py b/buildstream/_scheduler/job.py index 5d2e22646..5de6fae9e 100644 --- a/buildstream/_scheduler/job.py +++ b/buildstream/_scheduler/job.py @@ -77,6 +77,7 @@ class Job(): # Only relevant in parent process after spawning self.pid = None # The child's pid in the parent self.result = None # Return value of child action in the parent + self.workspace_dict = None # A serialized Workspace object, after any modifications self.tries = 0 @@ -262,11 +263,8 @@ class Job(): detail=env_dump, logfile=filename) try: + # Try the task action result = self.action(element) - if result is not None: - envelope = Envelope('result', result) - self.queue.put(envelope) - except BstError as e: elapsed = datetime.datetime.now() - starttime @@ -278,6 +276,9 @@ class Job(): elapsed=elapsed, detail=e.detail, logfile=filename, sandbox=e.sandbox) + # Report changes in the workspace, even if there was a handled failure + self.child_send_workspace(element) + # Report the exception to the parent (for internal testing purposes) self.child_send_error(e) self.child_shutdown(1) @@ -295,14 +296,22 @@ class Job(): logfile=filename) self.child_shutdown(1) - elapsed = datetime.datetime.now() - starttime - self.message(element, MessageType.SUCCESS, self.action_name, elapsed=elapsed, - logfile=filename) + else: + # No exception occurred in the action + self.child_send_workspace(element) + + if result is not None: + envelope = Envelope('result', result) + self.queue.put(envelope) - # Shutdown needs to stay outside of the above context manager, - # make sure we dont try to handle SIGTERM while the process - # is already busy in sys.exit() - self.child_shutdown(0) + elapsed = datetime.datetime.now() - starttime + self.message(element, MessageType.SUCCESS, self.action_name, elapsed=elapsed, + logfile=filename) + + # Shutdown needs to stay outside of the above context manager, + # make sure we dont try to handle SIGTERM while the process + # is already busy in sys.exit() + self.child_shutdown(0) def child_send_error(self, e): domain = None @@ -318,6 +327,12 @@ class Job(): }) self.queue.put(envelope) + def child_send_workspace(self, element): + workspace = element._get_workspace() + if workspace: + envelope = Envelope('workspace', workspace.to_dict()) + self.queue.put(envelope) + def child_complete(self, pid, returncode, element): if returncode != 0 and self.tries <= self.max_retries: self.shutdown() @@ -406,6 +421,8 @@ class Job(): elif envelope.message_type == 'result': assert self.result is None self.result = envelope.message + elif envelope.message_type == 'workspace': + self.workspace_dict = envelope.message else: raise Exception() |