about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2024-05-07 19:14:27 +0000
committerEric Wong <e@80x24.org>2024-05-08 06:00:01 +0000
commitcf3df165033bf36631bd890fa2375339cd95c593 (patch)
tree03ea43332c4b2ad8b1e0d22b7332269098cfb921 /lib/PublicInbox
parentb99860c560a6a4a79c73015612c855d978c3e00e (diff)
downloadpublic-inbox-cf3df165033bf36631bd890fa2375339cd95c593.tar.gz
Reopening Xapian DBs is a fairly cheap operation and Xapian
avoids doing work when nothing's changed, so just do it
to ensure we always get the latest updates in search results.

The old synchronous search interface worked around this by
having a timer based expiration in hopes of mitigating
fragmentation problems, but perhaps that's not worth doing
anymore now that memory fragmentation from Perl itself is
better understood.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/XapHelper.pm4
-rw-r--r--lib/PublicInbox/xap_helper.h1
2 files changed, 4 insertions, 1 deletions
diff --git a/lib/PublicInbox/XapHelper.pm b/lib/PublicInbox/XapHelper.pm
index 099bc4fe..c9957f64 100644
--- a/lib/PublicInbox/XapHelper.pm
+++ b/lib/PublicInbox/XapHelper.pm
@@ -191,8 +191,9 @@ sub dispatch {
                 or return;
         my $dirs = delete $req->{d} or die 'no -d args';
         my $key = join("\0", @$dirs);
+        my $new;
         $req->{srch} = $SRCH{$key} //= do {
-                my $new = { qp_flags => $PublicInbox::Search::QP_FLAGS };
+                $new = { qp_flags => $PublicInbox::Search::QP_FLAGS };
                 my $first = shift @$dirs;
                 my $slow_phrase = -f "$first/iamchert";
                 $new->{xdb} = $X->{Database}->new($first);
@@ -207,6 +208,7 @@ sub dispatch {
                 $new->{qp} = $new->qparse_new;
                 $new;
         };
+        $req->{srch}->{xdb}->reopen unless $new;
         $req->{Q} && !$req->{srch}->{qp_extra_done} and
                 srch_init_extra $req;
         my $timeo = $req->{K};
diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h
index bdc1c5b1..a30a8768 100644
--- a/lib/PublicInbox/xap_helper.h
+++ b/lib/PublicInbox/xap_helper.h
@@ -712,6 +712,7 @@ static void dispatch(struct req *req)
         req->srch = *s;
         if (req->srch != kbuf.srch) { // reuse existing
                 free_srch(kbuf.srch);
+                req->srch->db->reopen();
         } else if (!srch_init(req)) {
                 assert(kbuf.srch == *((struct srch **)tfind(
                                         kbuf.srch, &srch_tree, srch_cmp)));