summaryrefslogtreecommitdiff
path: root/crocoite/controller.py
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2019-01-27 10:19:37 +0100
committerLars-Dominik Braun <lars@6xq.net>2019-01-27 10:19:37 +0100
commit51d7fa07c5db9a1015ef210089a911c19796bd79 (patch)
tree8e13175492df5fe573205883d02ab72c459a4cc9 /crocoite/controller.py
parent53ed7436f6eb16bd609e8fb2a4478bb737a3824a (diff)
downloadcrocoite-51d7fa07c5db9a1015ef210089a911c19796bd79.tar.gz
crocoite-51d7fa07c5db9a1015ef210089a911c19796bd79.tar.bz2
crocoite-51d7fa07c5db9a1015ef210089a911c19796bd79.zip
recursive: Avoid deadlock if unknown exception occurs
Kill the subprocess and make sure we retrieve exceptions from .fetch()
Diffstat (limited to 'crocoite/controller.py')
-rw-r--r--crocoite/controller.py9
1 files changed, 9 insertions, 0 deletions
diff --git a/crocoite/controller.py b/crocoite/controller.py
index cbc6662..eb8908c 100644
--- a/crocoite/controller.py
+++ b/crocoite/controller.py
@@ -349,6 +349,9 @@ class RecursiveController:
except asyncio.CancelledError:
# graceful cancellation
process.send_signal (signal.SIGINT)
+ except Exception as e:
+ process.kill ()
+ raise e
finally:
code = await process.wait()
if code == 0:
@@ -382,6 +385,9 @@ class RecursiveController:
done, pending = await asyncio.wait (self.running,
return_when=asyncio.FIRST_COMPLETED)
self.running.difference_update (done)
+ # propagate exceptions
+ for r in done:
+ r.result ()
except asyncio.CancelledError:
self.logger.info ('cancel',
uuid='d58154c8-ec27-40f2-ab9e-e25c1b21cd88',
@@ -390,6 +396,9 @@ class RecursiveController:
finally:
done = await asyncio.gather (*self.running,
return_exceptions=True)
+ # propagate exceptions
+ for r in done:
+ r.result ()
self.running = set ()
log ()