]> Sergey Matveev's repositories - public-inbox.git/commitdiff
xapcmd: cleanup on interrupted xcpdb "--compact"
authorEric Wong <e@80x24.org>
Thu, 23 May 2019 09:37:02 +0000 (09:37 +0000)
committerEric Wong <e@80x24.org>
Thu, 23 May 2019 17:43:51 +0000 (17:43 +0000)
We should not have leftover junk on interrupted invocations.

lib/PublicInbox/Xapcmd.pm

index 74abf9999e88274a55c2eb55b7efaf3b22ac0384..5b6d06b8eaed32bdf2b1afdd6a18d6abc9cb338a 100644 (file)
@@ -247,7 +247,16 @@ sub cpdb ($$) {
        my ($args, $opt) = @_;
        my ($old, $new) = @$args;
        my $src = Search::Xapian::Database->new($old);
-       my $tmp = $opt->{compact} ? "$new.compact" : $new;
+       my ($xtmp, $tmp);
+       if ($opt->{compact}) {
+               my $newdir = dirname($new);
+               same_fs_or_die($newdir, $new);
+               $tmp = tempdir("$new.compact-XXXXXX", DIR => $newdir);
+               $xtmp = PublicInbox::Xtmpdirs->new;
+               $xtmp->{$new} = $tmp;
+       } else {
+               $tmp = $new;
+       }
 
        # like copydatabase(1), be sure we don't overwrite anything in case
        # of other bugs:
@@ -295,7 +304,7 @@ sub cpdb ($$) {
        } while (cpdb_retryable($src, $pfx));
 
        $pr->(sprintf($fmt, $nr)) if $pr;
-       return unless $opt->{compact};
+       return unless $xtmp;
 
        $src = $dst = undef; # flushes and closes
 
@@ -303,6 +312,7 @@ sub cpdb ($$) {
        # since $dst isn't readable by HTTP or NNTP clients, yet:
        compact([ $tmp, $new ], $opt);
        remove_tree($tmp) or die "failed to remove $tmp: $!\n";
+       $xtmp->done;
 }
 
 # slightly easier-to-manage manage than END{} blocks