diff options
author | Eric Wong <e@80x24.org> | 2019-01-31 00:32:42 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-01-31 00:32:42 +0000 |
commit | 2d4403cf9972f8ae78aa52fe6ce7a01d9b6757c1 (patch) | |
tree | 4bc738af91593e725f5f5088cc3f8c3a446fd695 /lib/PublicInbox/Git.pm | |
parent | 3041de7ee07ca13d3d8465aa68f076269e19fc3b (diff) | |
download | public-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.pm | 18 |
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 |