]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Inbox.pm
inbox: reinstate periodic cleanup of Xapian and SQLite objects
[public-inbox.git] / lib / PublicInbox / Inbox.pm
index f77944f5c441b0ffa849eb84c89a9fbd7db3bc71..a0d69f1813f92b1efa148ca35a7f85590bdbb236 100644 (file)
@@ -7,6 +7,7 @@ use strict;
 use warnings;
 use PublicInbox::Git;
 use PublicInbox::MID qw(mid2path);
+use Devel::Peek qw(SvREFCNT);
 
 my $cleanup_timer;
 eval {
@@ -18,7 +19,11 @@ eval {
 my $CLEANUP = {}; # string(inbox) -> inbox
 sub cleanup_task () {
        $cleanup_timer = undef;
-       delete $_->{git} for values %$CLEANUP;
+       for my $ibx (values %$CLEANUP) {
+               foreach my $f (qw(git mm search)) {
+                       delete $ibx->{$f} if SvREFCNT($ibx->{$f}) == 1;
+               }
+       }
        $CLEANUP = {};
 }
 
@@ -76,18 +81,23 @@ sub git {
        $self->{git} ||= eval {
                my $g = PublicInbox::Git->new($self->{mainrepo});
                $g->{-httpbackend_limiter} = $self->{-httpbackend_limiter};
+               _cleanup_later($self);
                $g;
        };
 }
 
 sub mm {
        my ($self) = @_;
-       $self->{mm} ||= eval { PublicInbox::Msgmap->new($self->{mainrepo}) };
+       $self->{mm} ||= eval {
+               _cleanup_later($self);
+               PublicInbox::Msgmap->new($self->{mainrepo});
+       };
 }
 
 sub search {
        my ($self) = @_;
        $self->{search} ||= eval {
+               _cleanup_later($self);
                PublicInbox::Search->new($self->{mainrepo}, $self->{altid});
        };
 }
@@ -216,7 +226,8 @@ sub msg_by_smsg ($$;$) {
 
        # backwards compat to fallback to msg_by_mid
        # TODO: remove if we bump SCHEMA_VERSION in Search.pm:
-       defined(my $blob = $smsg->blob) or return msg_by_mid($self, $smsg->mid);
+       defined(my $blob = $smsg->{blob}) or
+                       return msg_by_mid($self, $smsg->mid);
 
        my $str = git($self)->cat_file($blob, $ref);
        $$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str;