Merge pull request #1330 from enkore/issue/972

recreate: fix hogged signal handlers
This commit is contained in:
TW 2016-07-14 14:53:21 +02:00 committed by GitHub
commit 963bdd340c
2 changed files with 31 additions and 20 deletions

View File

@ -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):

View File

@ -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)