diff options
author | Eric Wong <e@80x24.org> | 2021-05-28 19:47:23 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-05-28 22:37:53 +0000 |
commit | 5944277a4dc986f9adf9ba69a1e6e44899ad98c1 (patch) | |
tree | 45c8fe978d381e61eb3e7658ef89fa51f7a2103d /lib/PublicInbox/LeiXSearch.pm | |
parent | 82e141cdf4a00de174b0a919689d846bb387cbf5 (diff) | |
download | public-inbox-5944277a4dc986f9adf9ba69a1e6e44899ad98c1.tar.gz |
Xapian DBs may be modified by a parallel process while we're reading it, and Xapian's MVCC model places the burden on readers to retry operations. We'll also have retry_reopen croak instead of die on errors, which ought to help us track down some "Document not found" errors I've occasionally seen when using "lei <q|up>".
Diffstat (limited to 'lib/PublicInbox/LeiXSearch.pm')
-rw-r--r-- | lib/PublicInbox/LeiXSearch.pm | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm index 760f9718..2e548a7a 100644 --- a/lib/PublicInbox/LeiXSearch.pm +++ b/lib/PublicInbox/LeiXSearch.pm @@ -67,17 +67,23 @@ sub remotes { @{$_[0]->{remotes} // []} } # called by PublicInbox::Search::xdb (usually via ->mset) sub xdb_shards_flat { @{$_[0]->{shards_flat} // []} } -sub mitem_kw ($$;$) { - my ($smsg, $mitem, $flagged) = @_; - my $kw = xap_terms('K', my $doc = $mitem->get_document); +sub _mitem_kw { # retry_reopen callback + my ($srch, $smsg, $mitem, $flagged) = @_; + my $doc = $mitem->get_document; + my $kw = xap_terms('K', $doc); $kw->{flagged} = 1 if $flagged; + my $L = xap_terms('L', $doc); # we keep the empty {kw} array here to prevent expensive work in # ->xsmsg_vmd, _unbless_smsg will clobber it iff it's empty $smsg->{kw} = [ sort keys %$kw ]; - my $L = xap_terms('L', $doc); $smsg->{L} = [ sort keys %$L ] if scalar(keys %$L); } +sub mitem_kw ($$$;$) { + my ($srch, $smsg, $mitem, $flagged) = @_; + $srch->retry_reopen(\&_mitem_kw, $smsg, $mitem, $flagged); +} + # like over->get_art sub smsg_for { my ($self, $mitem) = @_; @@ -90,7 +96,7 @@ sub smsg_for { my $smsg = $ibx->over->get_art($num); return if $smsg->{bytes} == 0; # external message if ($ibx->can('msg_keywords')) { - mitem_kw($smsg, $mitem); + mitem_kw($self, $smsg, $mitem); } $smsg; } @@ -194,7 +200,8 @@ sub query_one_mset { # for --threads and l2m w/o sort my $mitem = delete $n2item{$n}; next if $smsg->{bytes} == 0; if ($mitem && $can_kw) { - mitem_kw($smsg, $mitem, $fl); + mitem_kw($srch, $smsg, $mitem, + $fl); } elsif ($mitem && $fl) { # call ->xsmsg_vmd, later $smsg->{lei_q_tt_flagged} = 1; @@ -210,7 +217,7 @@ sub query_one_mset { # for --threads and l2m w/o sort my $mitem = $items[$i++]; my $smsg = $over->get_art($n) or next; next if $smsg->{bytes} == 0; - mitem_kw($smsg, $mitem, $fl) if $can_kw; + mitem_kw($srch, $smsg, $mitem, $fl) if $can_kw; $each_smsg->($smsg, $mitem); } } |