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)
sub xsmsg_vmd {
my ($self, $smsg, $want_label) = @_;
return if $smsg->{kw}; # already set by LeiXSearch->mitem_kw
- $self->retry_reopen(\&_xsmsg_vmd, $smsg, $want_label);
+ eval { $self->retry_reopen(\&_xsmsg_vmd, $smsg, $want_label) };
+ warn "$$ $0 (nshard=$self->{nshard}) $smsg->{blob}: $@" if $@;
}
# when a message has no Message-IDs at all, this is needed for
$git->cat_async($cur->{blob}, \&_cmp_1st,
[$chash, $xoids, $cur, $lms]);
if ($min && scalar(keys %$xoids) >= $min) {
- $git->cat_async_wait;
+ $git->async_wait_all;
return $xoids;
}
}
}
}
- $git->cat_async_wait;
+ $git->async_wait_all;
scalar(keys %$xoids) ? $xoids : undef;
}
# 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}) &&