From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 918881F8C8 for ; Sun, 26 Sep 2021 00:02:32 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] lei note-event: ignore kw_changed exceptions Date: Sun, 26 Sep 2021 00:02:32 +0000 Message-Id: <20210926000232.5004-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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. --- lib/PublicInbox/LeiNoteEvent.pm | 4 +++- lib/PublicInbox/LeiSearch.pm | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/LeiNoteEvent.pm b/lib/PublicInbox/LeiNoteEvent.pm index d24294850fd2..2a7b52c13487 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 a10e6e176775..568277a6f404 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}) &&