]> Sergey Matveev's repositories - public-inbox.git/commitdiff
solver: break up patch application steps
authorEric Wong <e@80x24.org>
Sat, 19 Jan 2019 04:57:08 +0000 (04:57 +0000)
committerEric Wong <e@80x24.org>
Sun, 20 Jan 2019 04:24:54 +0000 (04:24 +0000)
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

index 29cfd218dec3a0c6750b4f6aaf5d0d71c5f8019b..71494e07b5426f9e656c5adeccdcb37daf9dbf86 100644 (file)
@@ -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);
        }
 }