]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Inbox.pm
search: remove {over_ro} field
[public-inbox.git] / lib / PublicInbox / Inbox.pm
index b2b0b56fdd31f55795e9e11d3543dd06834f856e..3b5ac970d07cf43af6d86b656d92606f108cefc9 100644 (file)
@@ -31,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;
@@ -45,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;
        }
@@ -182,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");
@@ -192,24 +191,28 @@ 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(<<EOF);
+`$self->{name}' search went away unexpectedly
+EOF
+               undef;
+       };
 }
 
-sub over ($) {
-       my ($self) = @_;
-       my $srch = search($self, 1) or return;
-       $self->{over} ||= eval {
-               my $over = $srch->{over_ro};
-               $over->dbh_new; # may fail
+sub over {
+       $_[0]->{over} //= eval {
+               my $srch = search($_[0], 1) or return;
+               my $over = PublicInbox::Over->new("$srch->{xpfx}/over.sqlite3");
+               $over->dbh; # may fail
                $over;
-       }
+       };
 }
 
 sub try_cat {
@@ -407,12 +410,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 $@;
        }
 }