From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 93E1A1F4C0 for ; Thu, 31 Oct 2019 05:36:31 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] qspawn: psgi_qx: delay callback until waitpid returns Date: Thu, 31 Oct 2019 05:36:31 +0000 Message-Id: <20191031053631.10191-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We need to detect "git apply" failures reliably when patches fail. This is necessary for solving for blob 81c1164ae5 in https://public-inbox.org/git/ when at least two messages can solve for it (and one of them fails): 1. https://public-inbox.org/git/b9fb52b8-8168-6bf0-9a72-1e6c44a281a5@oracle.com/ 2. https://public-inbox.org/git/56664222-6c29-09dc-ef78-7b380b113c4a@oracle.com/ --- lib/PublicInbox/Qspawn.pm | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm index cb3dc51..651fa39 100644 --- a/lib/PublicInbox/Qspawn.pm +++ b/lib/PublicInbox/Qspawn.pm @@ -106,17 +106,22 @@ sub waitpid_err ($$) { } } - return unless $err; - $self->{err} = $err; - if ($env && !$env->{'qspawn.quiet'}) { - log_err($env, join(' ', @{$self->{args}}) . ": $err"); + if ($err) { + $self->{err} = $err; + if ($env && !$env->{'qspawn.quiet'}) { + log_err($env, join(' ', @{$self->{args}}) . ": $err"); + } + } + if (my $fin_cb = delete $self->{fin_cb}) { + eval { $fin_cb->() } } } -sub do_waitpid ($;$) { - my ($self, $env) = @_; +sub do_waitpid ($;$$) { + my ($self, $env, $fin_cb) = @_; my $pid = $self->{pid}; $self->{env} = $env; + $self->{fin_cb} = $fin_cb; # PublicInbox::DS may not be loaded eval { PublicInbox::DS::dwaitpid($pid, \&waitpid_err, $self) }; # done if we're running in PublicInbox::DS::EventLoop @@ -127,10 +132,12 @@ sub do_waitpid ($;$) { } } -sub finish ($;$) { - my ($self, $env) = @_; +sub finish ($;$$) { + my ($self, $env, $fin_cb) = @_; if (delete $self->{rpipe}) { - do_waitpid($self, $env); + do_waitpid($self, $env, $fin_cb); + } elsif ($fin_cb) { + eval { $fin_cb->() }; } } @@ -154,9 +161,8 @@ sub psgi_qx { my $end = sub { my $err = $_[0]; # $! log_err($env, "psgi_qx: $err") if defined($err); - finish($self, $env); - eval { $qx_cb->(\$scalar) }; - $qx = $scalar = undef; + finish($self, $env, sub { $qx_cb->(\$scalar) }); + $qx = undef; }; my $rpipe; # comes from popen_rd my $async = $env->{'pi-httpd.async'};