-# Copyright (C) 2018-2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2018-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
package PublicInbox::Xapcmd;
use strict;
use File::Temp 0.19 (); # ->newdir
use File::Path qw(remove_tree);
use File::Basename qw(dirname);
-use POSIX qw(WNOHANG);
+use POSIX qw(WNOHANG _exit);
# support testing with dev versions of Xapian which installs
# commands with a version number suffix (e.g. "xapian-compact-1.5")
sub cb_spawn {
my ($cb, $args, $opt) = @_; # $cb = cpdb() or compact()
- defined(my $pid = fork) or die "fork: $!";
+ my $seed = rand(0xffffffff);
+ my $pid = fork // die "fork: $!";
return $pid if $pid > 0;
+ srand($seed);
+ $SIG{__DIE__} = sub { warn @_; _exit(1) }; # don't jump up stack
$cb->($args, $opt);
- POSIX::_exit(0);
+ _exit(0);
}
sub runnable_or_die ($) {
my $dir = dirname($old);
same_fs_or_die($dir, $old);
my $v = PublicInbox::Search::SCHEMA_VERSION();
- my $wip = File::Temp->newdir("xapian$v-XXXXXXXX", DIR => $dir);
+ my $wip = File::Temp->newdir("xapian$v-XXXX", DIR => $dir);
$tmp->{$old} = $wip;
nodatacow_dir($wip->dirname);
push @queue, [ $old, $wip ];
$src = [ map { "$old/$_" } @old_shards ];
}
foreach my $dn (0..$max_shard) {
- my $tmpl = "$dn-XXXXXXXX";
- my $wip = File::Temp->newdir($tmpl, DIR => $old);
+ my $wip = File::Temp->newdir("$dn-XXXX", DIR => $old);
same_fs_or_die($old, $wip->dirname);
my $cur = "$old/$dn";
push @queue, [ $src // $cur , $wip ];
sub check_compact () { runnable_or_die($XAPIAN_COMPACT) }
-sub _run {
+sub _run { # with_umask callback
my ($ibx, $cb, $opt) = @_;
my $im = $ibx->importer(0);
$im->lock_acquire;
}
sub progress_pfx ($) {
- my ($wip) = @_; # tempdir v2: ([0-9])+-XXXXXXXX
+ my ($wip) = @_; # tempdir v2: ([0-9])+-XXXX
my @p = split('/', $wip);
# return "xap15/0" for v2, or "xapian15" for v1:
}
# xapian-compact wrapper
-sub compact ($$) {
+sub compact ($$) { # cb_spawn callback
my ($args, $opt) = @_;
my ($src, $newdir) = @$args;
my $dst = ref($newdir) ? $newdir->dirname : $newdir;
# Like copydatabase(1), this is horribly slow; and it doesn't seem due
# to the overhead of Perl.
-sub cpdb ($$) {
+sub cpdb ($$) { # cb_spawn callback
my ($args, $opt) = @_;
my ($old, $newdir) = @$args;
my $new = $newdir->dirname;
if ($opt->{compact}) {
my $dir = dirname($new);
same_fs_or_die($dir, $new);
- $ft = File::Temp->newdir("$new.compact-XXXXXX", DIR => $dir);
+ $ft = File::Temp->newdir("$new.compact-XXXX", DIR => $dir);
setup_signals();
$tmp = $ft->dirname;
nodatacow_dir($tmp);