From 7fa037d0be9d1a8b891084a3c1215a1af5aa886b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 19 Jan 2019 04:57:08 +0000 Subject: solver: break up patch application steps We want more fine-grained scheduling for PSGI use, as the patch application step can take hundreds of milliseconds on my modest hardware --- lib/PublicInbox/SolverGit.pm | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm index 29cfd218..71494e07 100644 --- a/lib/PublicInbox/SolverGit.pm +++ b/lib/PublicInbox/SolverGit.pm @@ -236,8 +236,8 @@ sub prepare_index ($$$$) { "$mode_a $oid_full\t", git_quote($path_a), "\n"; } -sub do_apply ($$$$) { - my ($out, $wt_git, $wt_dir, $di) = @_; +sub do_apply_begin ($$$) { + my ($out, $wt_dir, $di) = @_; my $tmp = delete $di->{tmp} or die "BUG: no tmp ", di_url($di); $tmp->flush or die "tmp->flush failed: $!"; @@ -248,11 +248,19 @@ sub do_apply ($$$$) { my $rdr = { 0 => fileno($tmp), 1 => $err_fd, 2 => $err_fd }; my $cmd = [ qw(git -C), $wt_dir, qw(apply --cached --whitespace=warn --verbose) ]; - reap(spawn($cmd, undef, $rdr), 'apply'); + spawn($cmd, undef, $rdr); +} - local $/ = "\0"; - my $rd = popen_rd([qw(git -C), $wt_dir, qw(ls-files -s -z)]); +sub do_apply_continue ($$) { + my ($wt_dir, $apply_pid) = @_; + reap($apply_pid, 'apply'); + popen_rd([qw(git -C), $wt_dir, qw(ls-files -s -z)]); +} +sub do_apply_end ($$$$) { + my ($out, $wt_git, $rd, $di) = @_; + + local $/ = "\0"; defined(my $line = <$rd>) or die "failed to read ls-files: $!"; chomp $line or die "no trailing \\0 in [$line] from ls-files"; @@ -314,7 +322,9 @@ sub apply_patches ($$$$$) { or die "print \$out failed: $!"; # apply the patch! - $found->{$di->{oid_b}} = do_apply($out, $wt_git, $wt_dir, $di); + my $apply_pid = do_apply_begin($out, $wt_dir, $di); + my $rd = do_apply_continue($wt_dir, $apply_pid); + $found->{$di->{oid_b}} = do_apply_end($out, $wt_git, $rd, $di); } } -- cgit v1.2.3-24-ge0c7