]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Git.pm
inbox: perform cleanup of Git objects for coderepos
[public-inbox.git] / lib / PublicInbox / Git.pm
index e844884a2acf8f5d94469c65ee37d4550d455627..a756684a70355b6435b26b753f1dc6593e5481fa 100644 (file)
@@ -206,7 +206,15 @@ sub check {
 }
 
 sub _destroy {
-       my ($self, $in, $out, $pid) = @_;
+       my ($self, $in, $out, $pid, $expire) = @_;
+       my $rfh = $self->{$in} or return;
+       if (defined $expire) {
+               # at least FreeBSD 11.2 and Linux 4.20 update mtime of the
+               # read end of a pipe when the pipe is written to; dunno
+               # about other OSes.
+               my $mtime = (stat($rfh))[9];
+               return if $mtime > $expire;
+       }
        my $p = delete $self->{$pid} or return;
        foreach my $f ($in, $out) {
                delete $self->{$f};
@@ -236,10 +244,12 @@ sub qx {
        <$fh>
 }
 
+# returns true if there are pending "git cat-file" processes
 sub cleanup {
-       my ($self) = @_;
-       _destroy($self, qw(in out pid));
-       _destroy($self, qw(in_c out_c pid_c));
+       my ($self, $expire) = @_;
+       _destroy($self, qw(in out pid), $expire);
+       _destroy($self, qw(in_c out_c pid_c), $expire);
+       !!($self->{pid} || $self->{pid_c});
 }
 
 # assuming a well-maintained repo, this should be a somewhat