diff --git a/slapos/grid/slapgrid.py b/slapos/grid/slapgrid.py index a3e4737b5c72c830b23a22648ab32e321ec0a05a..8b78ed803c77eae6c9e5a9bd5203d6307812ab4a 100644 --- a/slapos/grid/slapgrid.py +++ b/slapos/grid/slapgrid.py @@ -541,18 +541,27 @@ class Slapgrid(object): process_handler.stdin.close() process_handler.stdin = None - time.sleep(self.promise_timeout) - - if process_handler.poll() is None: + # Check if the promise finished every tenth of second, + # but timeout after promise_timeout. + sleep_time = 0.1 + increment_limit = int(self.promise_timeout / sleep_time) + for current_increment in range(0, increment_limit): + if process_handler.poll() is None: + time.sleep(sleep_time) + continue + if process_handler.poll() == 0: + # Success! + break + else: + stderr = process_handler.communicate()[1] + if stderr is None: + stderr = "No error output from '%s'." % promise + else: + stderr = "Promise '%s':" % promise + stderr + raise Slapgrid.PromiseError(stderr) + else: process_handler.terminate() raise Slapgrid.PromiseError("The promise '%s' timed out" % promise) - elif process_handler.poll() != 0: - stderr = process_handler.communicate()[1] - if stderr is None: - stderr = "No error output from '%s'." % promise - else: - stderr = "Promise '%s':" % promise + stderr - raise Slapgrid.PromiseError(stderr) if not promise_present: self.logger.info("No promise.")