]> Sergey Matveev's repositories - public-inbox.git/commitdiff
xapcmd: support spawn options
authorEric Wong <e@80x24.org>
Thu, 23 May 2019 09:36:45 +0000 (09:36 +0000)
committerEric Wong <e@80x24.org>
Thu, 23 May 2019 17:43:50 +0000 (17:43 +0000)
copydatabase(1) is exceptionally noisy and it's output is
confusing when run in parallel.  Support redirects at least, and
env while we're at it to give us future options.

We can also stuff a -jobs parameter into the options to limit
parallelism since it can be useful for low-priority upgrade
jobs.

lib/PublicInbox/Xapcmd.pm

index 586d7e6aab16ae649dbf40c998f9de2d6fafdef1..999ddd1cb239cefe57eaaaa70e866f30a311ac32 100644 (file)
@@ -25,7 +25,8 @@ sub commit_changes ($$$) {
 }
 
 sub run {
-       my ($ibx, $cmd) = @_;
+       my ($ibx, $cmd, $env, $opt) = @_;
+       $opt ||= {};
        my $dir = $ibx->{mainrepo} or die "no mainrepo in inbox\n";
        which($cmd->[0]) or die "$cmd->[0] not found in PATH\n";
        $ibx->umask_prepare;
@@ -50,13 +51,21 @@ sub run {
                die "No Xapian parts found in $old\n" unless @cmds;
        }
        my $im = $ibx->importer(0);
+       my $max = $opt->{jobs} || scalar(@cmds);
        $ibx->with_umask(sub {
                $im->lock_acquire;
-               my %pids = map {; spawn($_) => join(' ', @$_) } @cmds;
-               while (scalar keys %pids) {
-                       my $pid = waitpid(-1, 0);
-                       my $desc = delete $pids{$pid};
-                       die "$desc failed: $?\n" if $?;
+               my %pids;
+               while (@cmds) {
+                       while (scalar(keys(%pids)) < $max && scalar(@cmds)) {
+                               my $x = shift @cmds;
+                               $pids{spawn($x, $env, $opt)} = $x;
+                       }
+
+                       while (scalar keys %pids) {
+                               my $pid = waitpid(-1, 0);
+                               my $x = delete $pids{$pid};
+                               die join(' ', @$x)." failed: $?\n" if $?;
+                       }
                }
                commit_changes($im, $old, $new);
        });