]> Sergey Matveev's repositories - public-inbox.git/commitdiff
git_async_cat: unref pipes on EOF from git->cleanup
authorEric Wong <e@yhbt.net>
Mon, 6 Jul 2020 06:11:02 +0000 (06:11 +0000)
committerEric Wong <e@yhbt.net>
Mon, 6 Jul 2020 20:01:15 +0000 (20:01 +0000)
We avoided a managed circular reference in 10ee3548084c125f
but introduced a pipe FD leak, instead.  So handle the EOF
we get when the "git cat-file --batch" process exits and
closes its stdout FD.

v2: remove ->close entirely.  PublicInbox::Git->cleanup
handles all cleanup.  This prevents us from inadvertantly
deleting the {async_cat} field associated with a different
pipe than the one GAC is monitoring.

Fixes: 10ee3548084c125f ("git_async_cat: remove circular reference")
lib/PublicInbox/GitAsyncCat.pm

index 0b777204a7ccfe021fe102c3218c2af4de5565ce..e618d366a8bc31dbbcafd29b702160787d267fcb 100644 (file)
@@ -24,7 +24,8 @@ sub _add {
 
 sub event_step {
        my ($self) = @_;
-       my $git = $self->{git} or return; # ->close-ed
+       my $git = $self->{git};
+       return $self->close if ($git->{in} // 0) != ($self->{sock} // 1);
        my $inflight = $git->{inflight};
        if ($inflight && @$inflight) {
                $git->cat_async_step($inflight);
@@ -32,14 +33,6 @@ sub event_step {
        }
 }
 
-sub close {
-       my ($self) = @_;
-       if (my $git = delete $self->{git}) {
-               delete $git->{async_cat};
-       }
-       $self->SUPER::close; # PublicInbox::DS::close
-}
-
 sub git_async_cat ($$$$) {
        my ($git, $oid, $cb, $arg) = @_;
        $git->cat_async($oid, $cb, $arg);