-# Long-running "git-cat-file --batch" processes won't notice
-# unlinked packs, so we need to restart those processes occasionally.
-# Xapian and SQLite file handles are mostly stable, but sometimes an
-# admin will attempt to replace them atomically after compact/vacuum
-# and we need to be prepared for that.
-my $cleanup_timer;
-my $cleanup_avail = -1; # 0, or 1
-my $have_devel_peek;
-my $CLEANUP = {}; # string(inbox) -> inbox
-
-sub git_cleanup ($) {
- my ($self) = @_;
- my $git = $self->{git} or return;
- $git->cleanup;
-}
-
-sub cleanup_task () {
- $cleanup_timer = undef;
- my $next = {};
- for my $ibx (values %$CLEANUP) {
- my $again;
- if ($have_devel_peek) {
- foreach my $f (qw(search)) {
- # we bump refcnt by assigning tmp, here:
- my $tmp = $ibx->{$f} or next;
- next if Devel::Peek::SvREFCNT($tmp) > 2;
- delete $ibx->{$f};
- # refcnt is zero when tmp is out-of-scope
- }
- }
- git_cleanup($ibx);
- if (my $gits = $ibx->{-repo_objs}) {
- foreach my $git (@$gits) {
- $again = 1 if $git->cleanup;
- }
- }
+# returns true if further checking is required
+sub check_inodes ($) {
+ for (qw(over mm)) { $_[0]->{$_}->check_inodes if $_[0]->{$_} }
+}
+
+sub do_cleanup {
+ my ($ibx) = @_;
+ my $live;
+ if (defined $ibx->{git}) {
+ $live = $ibx->isa(__PACKAGE__) ? $ibx->{git}->cleanup(1)
+ : $ibx->{git}->cleanup_if_unlinked;
+ delete($ibx->{git}) unless $live;
+ }
+ if ($live) {