From: Eric Wong <e@80x24.org>
Date: Thu, 23 May 2019 09:37:02 +0000 (+0000)
Subject: xapcmd: cleanup on interrupted xcpdb "--compact"
X-Git-Tag: v1.2.0~238
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=ea3528394f0ee5c47f9b94a4d92d129c709990df;p=public-inbox.git

xapcmd: cleanup on interrupted xcpdb "--compact"

We should not have leftover junk on interrupted invocations.
---

diff --git a/lib/PublicInbox/Xapcmd.pm b/lib/PublicInbox/Xapcmd.pm
index 74abf999..5b6d06b8 100644
--- a/lib/PublicInbox/Xapcmd.pm
+++ b/lib/PublicInbox/Xapcmd.pm
@@ -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