X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-compact;h=5f18497e6b57558963e30562565d3c2798836202;hb=f826a7830bce67c0f8c653baf97f7769bb2c57d9;hp=79cd039b38b9b7ea50f2fdfdea549d98e9036882;hpb=c4aa293b2320feb805c5afeaa373f608e5bc8618;p=public-inbox.git diff --git a/script/public-inbox-compact b/script/public-inbox-compact index 79cd039b..5f18497e 100755 --- a/script/public-inbox-compact +++ b/script/public-inbox-compact @@ -4,9 +4,9 @@ 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); @@ -36,13 +36,20 @@ $ibx->umask_prepare; sub commit_changes ($$$) { my ($im, $old, $new) = @_; my @st = stat($old) or die "failed to stat($old): $!\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); @@ -52,37 +59,19 @@ if ($v == 2) { my $new = tempdir('compact-XXXXXXXX', CLEANUP => 1, DIR => $dir); $ibx->with_umask(sub { $v2w->lock_acquire; - my @parts; - my $skel; + my %pids; while (defined(my $dn = readdir($dh))) { if ($dn =~ /\A\d+\z/) { - push @parts, "$old/$dn"; - } elsif ($dn eq 'skel') { - $skel = "$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; - my %pids; - - if (@parts) { - my $pid = spawn(['xapian-compact', @parts, "$new/0" ]); - defined $pid or die "compact failed: $?\n"; - $pids{$pid} = 'xapian-compact (parts)'; - } else { - warn "No parts found in $old\n"; - } - if (defined $skel) { - my $pid = spawn(['xapian-compact', $skel, "$new/skel"]); - defined $pid or die "compact failed: $?\n"; - $pids{$pid} = 'xapian-compact (skel)'; - } else { - warn "$old/skel missing\n"; - } - scalar keys %pids or - die "No xapian-compact processes running\n"; + 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}; @@ -100,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 {