]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Xapcmd.pm
treewide: shorten temporary filename
[public-inbox.git] / lib / PublicInbox / Xapcmd.pm
index 6a74daf92b5be1e4345ce473f28a66b3db5e7f1b..9791f02cf76aaf7ecff9d8f8419d5b2843a41ec1 100644 (file)
@@ -1,4 +1,4 @@
-# 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;
@@ -9,7 +9,7 @@ use PublicInbox::SearchIdx;
 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")
@@ -89,10 +89,13 @@ sub commit_changes ($$$$) {
 
 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 ($) {
@@ -109,8 +112,7 @@ sub prepare_reindex ($$$) {
                        $opt->{reindex}->{from} = $lc;
                }
        } else { # v2
-               my $max;
-               $im->git_dir_latest(\$max) or return;
+               my $max = $ibx->max_git_epoch // return;
                my $from = $opt->{reindex}->{from};
                my $mm = $ibx->mm;
                my $v = PublicInbox::Search::SCHEMA_VERSION();
@@ -190,7 +192,7 @@ sub prepare_run {
                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 ];
@@ -218,8 +220,7 @@ sub prepare_run {
                        $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 ];
@@ -236,7 +237,7 @@ sub prepare_run {
 
 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;
@@ -271,7 +272,6 @@ sub run {
 
        local %SIG = %SIG;
        setup_signals();
-       $ibx->umask_prepare;
        $ibx->with_umask(\&_run, $ibx, $cb, $opt);
 }
 
@@ -290,7 +290,7 @@ sub cpdb_retryable ($$) {
 }
 
 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:
@@ -303,7 +303,7 @@ sub kill_compact { # setup_signals callback
 }
 
 # xapian-compact wrapper
-sub compact ($$) {
+sub compact ($$) { # cb_spawn callback
        my ($args, $opt) = @_;
        my ($src, $newdir) = @$args;
        my $dst = ref($newdir) ? $newdir->dirname : $newdir;
@@ -384,7 +384,7 @@ sub cpdb_loop ($$$;$$) {
 
 # 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;
@@ -417,7 +417,7 @@ sub cpdb ($$) {
        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);