From fcb6930c5398118216150f8fe36d20ac45d5726a Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Thu, 14 Jul 2016 02:11:11 +0200 Subject: [PATCH] recreate: fix hogged signal handlers --- src/borg/archiver.py | 40 ++++++++++++++++++++-------------------- src/borg/helpers.py | 11 +++++++++++ 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index b2e98fb6e..701ddf351 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -40,6 +40,7 @@ from .helpers import update_excludes, check_extension_modules from .helpers import dir_is_tagged, is_slow_msgpack, yes, sysinfo from .helpers import log_multi from .helpers import parse_pattern, PatternMatcher, PathPrefixPattern +from .helpers import signal_handler from .item import Item from .key import key_creator, RepoKey, PassphraseKey from .platform import get_flags @@ -938,27 +939,26 @@ class Archiver: file_status_printer=self.print_file_status, dry_run=args.dry_run) - signal.signal(signal.SIGTERM, interrupt) - signal.signal(signal.SIGINT, interrupt) - - if args.location.archive: - name = args.location.archive - if recreater.is_temporary_archive(name): - self.print_error('Refusing to work on temporary archive of prior recreate: %s', name) - return self.exit_code - recreater.recreate(name, args.comment) - else: - for archive in manifest.list_archive_infos(sort_by='ts'): - name = archive.name + with signal_handler(signal.SIGTERM, interrupt), \ + signal_handler(signal.SIGINT, interrupt): + if args.location.archive: + name = args.location.archive if recreater.is_temporary_archive(name): - continue - print('Processing', name) - if not recreater.recreate(name, args.comment): - break - manifest.write() - repository.commit() - cache.commit() - return self.exit_code + self.print_error('Refusing to work on temporary archive of prior recreate: %s', name) + return self.exit_code + recreater.recreate(name, args.comment) + else: + for archive in manifest.list_archive_infos(sort_by='ts'): + name = archive.name + if recreater.is_temporary_archive(name): + continue + print('Processing', name) + if not recreater.recreate(name, args.comment): + break + manifest.write() + repository.commit() + cache.commit() + return self.exit_code @with_repository(manifest=False) def do_with_lock(self, args, repository): diff --git a/src/borg/helpers.py b/src/borg/helpers.py index 401f1ea7c..00abc68b1 100644 --- a/src/borg/helpers.py +++ b/src/borg/helpers.py @@ -7,6 +7,7 @@ import os.path import platform import pwd import re +import signal import socket import sys import stat @@ -16,6 +17,7 @@ import unicodedata import uuid from binascii import hexlify from collections import namedtuple, deque +from contextlib import contextmanager from datetime import datetime, timezone, timedelta from fnmatch import translate from functools import wraps, partial @@ -1535,3 +1537,12 @@ class CompressionDecider2: compr_args.update(compr_spec) logger.debug("len(data) == %d, len(lz4(data)) == %d, choosing %s", data_len, cdata_len, compr_spec) return compr_args, Chunk(data, **meta) + + +@contextmanager +def signal_handler(signo, handler): + old_signal_handler = signal.signal(signo, handler) + try: + yield + finally: + signal.signal(signo, old_signal_handler)