diff options
author | Eric Wong <e@80x24.org> | 2019-05-23 09:36:45 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-05-23 17:43:50 +0000 |
commit | f0cc8e6795077bc7a04e579655a1c5e90c80a4e8 (patch) | |
tree | 5ded87a2cf31a8f9b8c83161fb9bdedf82e35fae | |
parent | d537fa4148134fe45595305a7398895682f43c96 (diff) | |
download | public-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.
-rw-r--r-- | lib/PublicInbox/Xapcmd.pm | 21 |
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); }); |