]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiSearch.pm
git: use async_wait_all everywhere
[public-inbox.git] / lib / PublicInbox / LeiSearch.pm
index 37bfc65e27cc7515b0b7d285b84e81120dbd3d5f..4e048e9a40b7a9f2794d067eeef15f750b0d1d61 100644 (file)
@@ -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)
@@ -42,9 +43,9 @@ sub _oid_kw { # retry_reopen callback
 }
 
 # returns undef if blob is unknown
-sub oid_keywords {
-       my ($self, $oidhex) = @_;
-       my @num = $self->over->blob_exists($oidhex) or return;
+sub oidbin_keywords {
+       my ($self, $oidbin) = @_;
+       my @num = $self->over->oidbin_exists($oidbin) or return;
        $self->retry_reopen(\&_oid_kw, \@num);
 }
 
@@ -71,7 +72,8 @@ sub _xsmsg_vmd { # retry_reopen
 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
@@ -117,27 +119,32 @@ sub xoids_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}) &&