From: Eric Wong Date: Sun, 26 Sep 2021 00:02:32 +0000 (+0000) Subject: lei note-event: ignore kw_changed exceptions X-Git-Tag: v1.7.0~266 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=bf7fdfe4b939c3a97b20fd3e9b65c9cd493a692d;p=public-inbox.git lei note-event: ignore kw_changed exceptions The note-event worker may see changes before a Xapian shard commit happens, meaning keyword lookups fail as a result. Just emit the request to the lei/store worker since it's a fairly cheap operation at this point. We'll try harder to look for kw changes, too, since deduplication changes may lead to multiple docids being resolved for a single message. --- diff --git a/lib/PublicInbox/LeiNoteEvent.pm b/lib/PublicInbox/LeiNoteEvent.pm index d2429485..2a7b52c1 100644 --- a/lib/PublicInbox/LeiNoteEvent.pm +++ b/lib/PublicInbox/LeiNoteEvent.pm @@ -42,7 +42,9 @@ sub eml_event ($$$$) { $sto->wq_do('index_eml_only', $eml, $vmd, $xoids); } elsif ($state =~ /\Atag-(?:rw|ro)\z/) { my $docids = []; - my $c = $self->{lse}->kw_changed($eml, $vmd->{kw}, $docids); + my $c = eval { + $self->{lse}->kw_changed($eml, $vmd->{kw}, $docids); + } // 1; # too new, assume changed since still to-be-committed. if (scalar @$docids) { # already in lei/store $sto->wq_do('set_eml_vmd', undef, $vmd, $docids) if $c; } elsif (my $xoids = $self->{lei}->ale->xoids_for($eml)) { diff --git a/lib/PublicInbox/LeiSearch.pm b/lib/PublicInbox/LeiSearch.pm index a10e6e17..568277a6 100644 --- a/lib/PublicInbox/LeiSearch.pm +++ b/lib/PublicInbox/LeiSearch.pm @@ -9,6 +9,7 @@ use parent qw(PublicInbox::ExtSearch); # PublicInbox::Search->reopen use PublicInbox::Search qw(xap_terms); use PublicInbox::ContentHash qw(content_digest content_hash); use PublicInbox::MID qw(mids mids_for_index); +use Carp qw(croak); # get combined docid from over.num: # (not generic Xapian, only works with our sharding scheme) @@ -131,14 +132,19 @@ sub xoids_for { # returns true if $eml is indexed by lei/store and keywords don't match sub kw_changed { my ($self, $eml, $new_kw_sorted, $docids) = @_; + my $cur_kw; if ($eml) { my $xoids = xoids_for($self, $eml) // return; $docids //= []; @$docids = sort { $a <=> $b } values %$xoids; } - my $cur_kw = eval { msg_keywords($self, $docids->[0]) }; - die "E: #$docids->[0] keyword lookup failure: $@\n" if $@; - + for my $id (@$docids) { + $cur_kw = eval { msg_keywords($self, $id) } and last; + } + if (!defined($cur_kw) && $@) { + $docids = join(', num:', @$docids); + croak "E: num:$docids keyword lookup failure: $@"; + } # RFC 5550 sec 5.9 on the $Forwarded keyword states: # "Once set, the flag SHOULD NOT be cleared" if (exists($cur_kw->{forwarded}) &&