From cf3df165033bf36631bd890fa2375339cd95c593 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 7 May 2024 19:14:27 +0000 Subject: xap_helper: unconditionally reopen DBs on reuse 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. --- lib/PublicInbox/XapHelper.pm | 4 +++- lib/PublicInbox/xap_helper.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox') 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))); -- cgit v1.2.3-24-ge0c7