about summary refs log tree commit homepage
path: root/lib/PublicInbox/Git.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-01-31 00:32:42 +0000
committerEric Wong <e@80x24.org>2019-01-31 00:32:42 +0000
commit2d4403cf9972f8ae78aa52fe6ce7a01d9b6757c1 (patch)
tree4bc738af91593e725f5f5088cc3f8c3a446fd695 /lib/PublicInbox/Git.pm
parent3041de7ee07ca13d3d8465aa68f076269e19fc3b (diff)
downloadpublic-inbox-2d4403cf9972f8ae78aa52fe6ce7a01d9b6757c1.tar.gz
Otherwise, long-running but idle git processes may keep unlinked
packs around indefinitely and waste disk space.
Diffstat (limited to 'lib/PublicInbox/Git.pm')
-rw-r--r--lib/PublicInbox/Git.pm18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index e844884a..a756684a 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -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