From dc10c9172e1197c77c246ea75aae63388dcd641e Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sat, 24 Aug 2019 11:49:54 -0500 Subject: [PATCH] fsck: only specify -t1 when par2 appears to support it It looks like par2 may reject the "-t1" argument even when it's new enough to support parallelism, so we can't rely on detecting the version. Instead, before running the first real par2 command, test -t1 in a sandbox to decide whether we can use it. Signed-off-by: Rob Browning Tested-by: Rob Browning --- cmd/fsck-cmd.py | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/cmd/fsck-cmd.py b/cmd/fsck-cmd.py index 8fc4f7f..8ba698c 100755 --- a/cmd/fsck-cmd.py +++ b/cmd/fsck-cmd.py @@ -7,6 +7,9 @@ exec "$bup_python" "$0" ${1+"$@"} from __future__ import absolute_import, print_function import sys, os, glob, subprocess +from shutil import rmtree +from subprocess import call +from tempfile import mkdtemp from bup import options, git from bup.helpers import Sha1, chunkyreader, istty2, log, progress @@ -42,24 +45,45 @@ def par2_setup(): else: par2_ok = 1 -def parv(lvl): - if opt.verbose >= lvl: - if istty2: - return [] - else: - return ['-q'] +def is_par2_parallel(): + # A true result means it definitely allows -t1; a false result is + # technically inconclusive, but likely means no. + tmpdir = mkdtemp(prefix="bup-fsck") + try: + canary = tmpdir + '/canary' + with open(canary, 'w') as f: + print('canary', file=f) + rc = call(('par2', 'create', '-qq', '-t1', canary)) + return rc == 0 + finally: + rmtree(tmpdir) + +_par2_parallel = None + +def par2(action, args, verb_floor=0): + global _par2_parallel + if _par2_parallel is None: + _par2_parallel = is_par2_parallel() + cmd = ['par2', action] + if opt.verbose >= verb_floor and not istty2: + cmd.append('-q') else: - return ['-qq'] + cmd.append('-qq') + if _par2_parallel: + cmd.append('-t1') + cmd.extend(args) + return run(cmd) def par2_generate(base): - return run(['par2', 'create', '-t1', '-n1', '-c200'] + parv(2) - + ['--', base, base+'.pack', base+'.idx']) + return par2('create', + ['-n1', '-c200', '--', base, base + '.pack', base + '.idx'], + verb_floor=2) def par2_verify(base): - return run(['par2', 'verify', '-t1'] + parv(3) + ['--', base]) + return par2('verify', ['--', base], verb_floor=3) def par2_repair(base): - return run(['par2', 'repair', '-t1'] + parv(2) + ['--', base]) + return par2('repair', ['--', base], verb_floor=2) def quick_verify(base): f = open(base + '.pack', 'rb') -- 2.39.2