From 83deedb13a5c24a7be049dd3fa880031f2dd0d61 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Fri, 4 Mar 2022 23:32:12 +0100 Subject: [PATCH] kill filter process in case of borg exceptions, fixes #6401 in the finally-block, we wait for the filter process to die. but it only dies voluntarily if all data was processed by the filter and it terminates due to EOF. otoh, if borg has thrown an early exception, e.g. "archive already exists", we need to kill the filter process to bring it to an early end. in that case, we also do not need to check the filter rc, because we know we killed it. --- src/borg/helpers/process.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/borg/helpers/process.py b/src/borg/helpers/process.py index bf87869f6..7af8d5fcb 100644 --- a/src/borg/helpers/process.py +++ b/src/borg/helpers/process.py @@ -329,6 +329,14 @@ def create_filter_process(cmd, stream, stream_close, inbound=True): try: yield stream + except Exception: + # something went wrong with processing the stream by borg + logger.debug('Exception, killing the filter...') + proc.kill() + borg_succeeded = False + raise + else: + borg_succeeded = True finally: if stream_close: stream.close() @@ -339,5 +347,6 @@ def create_filter_process(cmd, stream, stream_close, inbound=True): logger.debug('filter cmd exited with code %d', rc) if filter_stream_close: filter_stream.close() - if rc: + if borg_succeeded and rc: + # if borg did not succeed, we know that we killed the filter process raise Error('filter %s failed, rc=%d' % (cmd, rc))