about summary refs log tree commit homepage
path: root/lib/PublicInbox/Xapcmd.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-05-23 09:36:45 +0000
committerEric Wong <e@80x24.org>2019-05-23 17:43:50 +0000
commitf0cc8e6795077bc7a04e579655a1c5e90c80a4e8 (patch)
tree5ded87a2cf31a8f9b8c83161fb9bdedf82e35fae /lib/PublicInbox/Xapcmd.pm
parentd537fa4148134fe45595305a7398895682f43c96 (diff)
downloadpublic-inbox-f0cc8e6795077bc7a04e579655a1c5e90c80a4e8.tar.gz
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.
Diffstat (limited to 'lib/PublicInbox/Xapcmd.pm')
-rw-r--r--lib/PublicInbox/Xapcmd.pm21
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/PublicInbox/Xapcmd.pm b/lib/PublicInbox/Xapcmd.pm
index 586d7e6a..999ddd1c 100644
--- a/lib/PublicInbox/Xapcmd.pm
+++ b/lib/PublicInbox/Xapcmd.pm
@@ -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);
         });