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-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,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 10A431FA17 for ; Sat, 2 Jan 2021 09:13:45 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/6] import: switch to using ProcessPipe Date: Fri, 1 Jan 2021 19:13:42 -1400 Message-Id: <20210102091344.13477-5-e@80x24.org> In-Reply-To: <20210102091344.13477-1-e@80x24.org> References: <20210102091344.13477-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This saves us a few lines of code, but also prevents misreaping by sibling processes. --- lib/PublicInbox/Import.pm | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm index 47a529ff..b5780d2b 100644 --- a/lib/PublicInbox/Import.pm +++ b/lib/PublicInbox/Import.pm @@ -54,9 +54,9 @@ sub new { sub gfi_start { my ($self) = @_; - return ($self->{in}, $self->{out}) if $self->{pid}; + return ($self->{in}, $self->{out}) if $self->{in}; - my ($in_r, $pid, $out_r, $out_w); + my ($in_r, $out_r, $out_w); pipe($out_r, $out_w) or die "pipe failed: $!"; $self->lock_acquire; @@ -72,13 +72,11 @@ sub gfi_start { chomp @t; $self->{-tree} = { map { $_ => 1 } @t }; } - my @cmd = ('git', "--git-dir=$git->{git_dir}", - qw(fast-import --quiet --done --date-format=raw)); - ($in_r, $pid) = popen_rd(\@cmd, undef, { 0 => $out_r }); + $in_r = $self->{in} = $git->popen(qw(fast-import + --quiet --done --date-format=raw), + undef, { 0 => $out_r }); $out_w->autoflush(1); - $self->{in} = $in_r; $self->{out} = $out_w; - $self->{pid} = $pid; $self->{nchg} = 0; }; if ($@) { @@ -162,14 +160,14 @@ sub check_remove_v1 { sub checkpoint { my ($self) = @_; - return unless $self->{pid}; + return unless $self->{in}; print { $self->{out} } "checkpoint\n" or wfail; undef; } sub progress { my ($self, $msg) = @_; - return unless $self->{pid}; + return unless $self->{in}; print { $self->{out} } "progress $msg\n" or wfail; readline($self->{in}) eq "progress $msg\n" or die "progress $msg not received\n"; @@ -218,7 +216,7 @@ sub barrier { # used for v2 sub get_mark { my ($self, $mark) = @_; - die "not active\n" unless $self->{pid}; + die "not active\n" unless $self->{in}; my ($r, $w) = $self->gfi_start; print $w "get-mark $mark\n" or wfail; defined(my $oid = <$r>) or die "get-mark failed, need git 2.6.0+\n"; @@ -481,10 +479,7 @@ sub done { eval { my $r = delete $self->{in} or die 'BUG: missing {in} when done'; print $w "done\n" or wfail; - my $pid = delete $self->{pid} or - die 'BUG: missing {pid} when done'; - waitpid($pid, 0) == $pid or die 'fast-import did not finish'; - $? == 0 or die "fast-import failed: $?"; + close $r or die "fast-import failed: $?"; # ProcessPipe::CLOSE }; my $wait_err = $@; my $nchg = delete $self->{nchg};