X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-compact;h=5f18497e6b57558963e30562565d3c2798836202;hb=refs%2Ftags%2Fv1.1.0-pre1;hp=e69771650797b9a3ff55d1ca7f3755e7f2972799;hpb=35ff6bb106909b1c1232666a9792156dfa398ea8;p=public-inbox.git diff --git a/script/public-inbox-compact b/script/public-inbox-compact index e6977165..5f18497e 100755 --- a/script/public-inbox-compact +++ b/script/public-inbox-compact @@ -4,12 +4,13 @@ use strict; use warnings; use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev); -use PublicInbox::V2Writable; use PublicInbox::Search; use PublicInbox::Config; +use PublicInbox::InboxWritable; use Cwd 'abs_path'; use File::Temp qw(tempdir); use File::Path qw(remove_tree); +use PublicInbox::Spawn qw(spawn); my $usage = "Usage: public-inbox-compact REPO_DIR\n"; my $dir = shift or die $usage; my $config = PublicInbox::Config->new; @@ -35,15 +36,20 @@ $ibx->umask_prepare; sub commit_changes ($$$) { my ($im, $old, $new) = @_; my @st = stat($old) or die "failed to stat($old): $!\n"; - link("$old/over.sqlite3", "$new/over.sqlite3") or die - "failed to link {$old => $new}/over.sqlite3: $!\n"; + + my $over = "$old/over.sqlite3"; + if (-f $over) { + require PublicInbox::Over; + $over = PublicInbox::Over->new($over); + $over->connect->sqlite_backup_to_file("$new/over.sqlite3"); + } rename($old, "$new/old") or die "rename $old => $new/old: $!\n"; chmod($st[2] & 07777, $new) or die "chmod $old: $!\n"; rename($new, $old) or die "rename $new => $old: $!\n"; $im->lock_release; remove_tree("$old/old") or die "failed to remove $old/old: $!\n"; } - +my @compact = qw(xapian-compact --no-renumber); if ($v == 2) { require PublicInbox::V2Writable; my $v2w = PublicInbox::V2Writable->new($ibx); @@ -53,19 +59,24 @@ if ($v == 2) { my $new = tempdir('compact-XXXXXXXX', CLEANUP => 1, DIR => $dir); $ibx->with_umask(sub { $v2w->lock_acquire; - my @parts; + my %pids; while (defined(my $dn = readdir($dh))) { if ($dn =~ /\A\d+\z/) { - push @parts, "$old/$dn"; + my $cmd = [ @compact, "$old/$dn", "$new/$dn" ]; + $pids{spawn($cmd)} = join(' ', @$cmd); } elsif ($dn eq '.' || $dn eq '..') { + } elsif ($dn =~ /\Aover\.sqlite3/) { } else { warn "W: skipping unknown Xapian DB: $old/$dn\n" } } close $dh; - die "No Xapian parts found in $old\n" unless @parts; - my $cmd = ['xapian-compact', @parts, "$new/0" ]; - PublicInbox::Import::run_die($cmd); + die "No Xapian parts found in $old\n" unless keys %pids; + while (scalar keys %pids) { + my $pid = waitpid(-1, 0); + my $desc = delete $pids{$pid}; + die "$desc failed: $?\n" if $?; + } commit_changes($v2w, $old, $new); }); } elsif ($v == 1) { @@ -78,7 +89,7 @@ if ($v == 2) { my $new = tempdir('compact-XXXXXXXX', CLEANUP => 1, DIR => $v1_root); $ibx->with_umask(sub { $im->lock_acquire; - PublicInbox::Import::run_die(['xapian-compact', $old, $new]); + PublicInbox::Import::run_die([@compact, $old, $new]); commit_changes($im, $old, $new); }); } else {