From 5cc07742d4225384b45ca0280d49e22cfc6407ff Mon Sep 17 00:00:00 2001 From: Zack Cerza Date: Fri, 31 Mar 2017 15:41:59 -0600 Subject: [PATCH] parallel: Let exceptions interrupt other greenlets Signed-off-by: Zack Cerza --- teuthology/parallel.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/teuthology/parallel.py b/teuthology/parallel.py index ac47165a56..d17faf326f 100644 --- a/teuthology/parallel.py +++ b/teuthology/parallel.py @@ -1,15 +1,18 @@ import logging import sys +import gevent import gevent.pool import gevent.queue log = logging.getLogger(__name__) + class ExceptionHolder(object): def __init__(self, exc_info): self.exc_info = exc_info + def capture_traceback(func, *args, **kwargs): """ Utility function to capture tracebacks of any exception func @@ -20,6 +23,7 @@ def capture_traceback(func, *args, **kwargs): except Exception: return ExceptionHolder(sys.exc_info()) + def resurrect_traceback(exc): if isinstance(exc, ExceptionHolder): exc_info = exc.exc_info @@ -30,6 +34,7 @@ def resurrect_traceback(exc): raise exc_info[0], exc_info[1], exc_info[2] + class parallel(object): """ This class is a context manager for running functions in parallel. @@ -73,20 +78,13 @@ class parallel(object): return self def __exit__(self, type_, value, traceback): - self.group.join() - if value is not None: return False - try: - # raises if any greenlets exited with an exception - for result in self: - log.debug('result is %s', repr(result)) - pass - except Exception: - # Emit message here because traceback gets stomped when we re-raise - log.exception("Exception in parallel execution") - raise + # raises if any greenlets exited with an exception + for result in self: + log.debug('result is %s', repr(result)) + return True def __iter__(self): -- 2.39.5