X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FInbox.pm;h=241001d30924a04d6e16f8c8d14776ff88bc3a91;hb=1814b1a0b78770c8ba9e7a0adef56c4c324d4064;hp=407751c30637c7b3988b051140bbdc16a385cf0c;hpb=eeeae20893a2595631359e719eadac9686572734;p=public-inbox.git diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index 407751c3..241001d3 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -22,9 +22,6 @@ my $CLEANUP = {}; # string(inbox) -> inbox sub git_cleanup ($) { my ($self) = @_; my $git = $self->{git} or return; - if (my $async_cat = delete $self->{async_cat}) { - $async_cat->close; - } $git->cleanup; } @@ -34,7 +31,7 @@ sub cleanup_task () { for my $ibx (values %$CLEANUP) { my $again; if ($have_devel_peek) { - foreach my $f (qw(mm search over)) { + 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; @@ -48,9 +45,9 @@ sub cleanup_task () { $again = 1 if $git->cleanup; } } + check_inodes($ibx); if ($have_devel_peek) { - $again ||= !!($ibx->{over} || $ibx->{mm} || - $ibx->{search}); + $again ||= !!$ibx->{search}; } $next->{"$ibx"} = $ibx if $again; } @@ -185,7 +182,6 @@ sub mm { my ($self) = @_; $self->{mm} ||= eval { require PublicInbox::Msgmap; - _cleanup_later($self); my $dir = $self->{inboxdir}; if ($self->version >= 2) { PublicInbox::Msgmap->new_file("$dir/msgmap.sqlite3"); @@ -195,22 +191,27 @@ sub mm { }; } -sub search ($;$) { - my ($self, $over_only) = @_; +sub search ($;$$) { + my ($self, $over_only, $ctx) = @_; my $srch = $self->{search} ||= eval { _cleanup_later($self); require PublicInbox::Search; PublicInbox::Search->new($self); }; - ($over_only || eval { $srch->xdb }) ? $srch : undef; + ($over_only || eval { $srch->xdb }) ? $srch : do { + $ctx and $ctx->{env}->{'psgi.errors'}->print(<{name}' search went away unexpectedly +EOF + undef; + }; } sub over ($) { my ($self) = @_; my $srch = search($self, 1) or return; - $self->{over} ||= eval { + $self->{over} //= eval { my $over = $srch->{over_ro}; - $over->dbh_new; # may fail + $over->dbh; # may fail $over; } } @@ -410,12 +411,21 @@ sub unsubscribe_unlock { delete $self->{unlock_subs}->{$ident}; } +sub check_inodes ($) { + my ($self) = @_; + for (qw(over mm)) { # TODO: search + $self->{$_}->check_inodes if $self->{$_}; + } +} + # called by inotify sub on_unlock { my ($self) = @_; + check_inodes($self); my $subs = $self->{unlock_subs} or return; for (values %$subs) { eval { $_->on_inbox_unlock($self) }; + warn "E: $@ ($self->{inboxdir})\n" if $@; } }