]> Sergey Matveev's repositories - public-inbox.git/commitdiff
xapcmd: do not reset %SIG until last Xtmpdir is done
authorEric Wong <e@80x24.org>
Thu, 23 May 2019 09:37:04 +0000 (09:37 +0000)
committerEric Wong <e@80x24.org>
Thu, 23 May 2019 17:43:51 +0000 (17:43 +0000)
To properly handle compact tmpdir cleanup in single process
situations, we need to carefully account for Xtmpdir not
being a singleton and ensuring we don't clobber signal
handlers which belong to other Xtmpdirs.

lib/PublicInbox/Xapcmd.pm

index a294d539d292e564ef7d9733da90fe80430c2343..999819c74b6ccb52eac4de475b2a74a318efad89 100644 (file)
@@ -22,6 +22,8 @@ sub commit_changes ($$$) {
        my $im = $ibx->importer(0);
        $im->lock_acquire if !$opt->{-coarse_lock};
 
+       $SIG{INT} or die 'BUG: $SIG{INT} not handled';
+
        while (my ($old, $new) = each %$tmp) {
                my @st = stat($old) or die "failed to stat($old): $!\n";
 
@@ -346,7 +348,12 @@ sub new {
 sub done {
        my ($self) = @_;
        delete $owner{"$self"};
-       $SIG{INT} = $SIG{HUP} = $SIG{PIPE} = $SIG{TERM} = 'DEFAULT';
+
+       my %known_pids;
+       $known_pids{$_}++ foreach values %owner;
+       if (!$known_pids{$$}) {
+               $SIG{INT} = $SIG{HUP} = $SIG{PIPE} = $SIG{TERM} = 'DEFAULT';
+       }
        %$self = ();
 }
 
@@ -357,7 +364,7 @@ sub DESTROY {
        foreach my $new (values %$self) {
                remove_tree($new) unless -d "$new/old";
        }
-       $SIG{INT} = $SIG{HUP} = $SIG{PIPE} = $SIG{TERM} = 'DEFAULT';
+       done($self);
 }
 
 1;