]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/ExtSearchIdx.pm
extindex: guard against false mismatch unrefs
[public-inbox.git] / lib / PublicInbox / ExtSearchIdx.pm
index 67d720368922d6013253fc4be27c7464c02f3265..cb5256a2c5625826b90d6aea26e75bf5863aeef9 100644 (file)
@@ -859,14 +859,20 @@ sub _reindex_check_ibx ($$$) {
        my $slice = 10000;
        my $opt = { limit => $slice };
        my ($beg, $end) = (1, $slice);
-       my $err = sync_inbox($self, $sync, $ibx) and return;
-       my $max = $ibx->mm->num_highwater;
+       my $ekey = $ibx->eidx_key;
+       my ($max, $max0);
+       do {
+               $max0 = $ibx->mm->num_highwater;
+               sync_inbox($self, $sync, $ibx) and return; # warned
+               $max = $ibx->mm->num_highwater;
+               return if $sync->{quit};
+       } while ($max > $max0 &&
+               warn("# $ekey moved $max0..$max, resyncing..\n"));
        $end = $max if $end > $max;
 
        # first, check if we missed any messages in target $ibx
        my $msgs;
        my $pr = $sync->{-opt}->{-progress};
-       my $ekey = $ibx->eidx_key;
        local $sync->{-regen_fmt} = "$ekey checking %u/$max\n";
        ${$sync->{nr}} = 0;
        my $fast = $sync->{-opt}->{fast};
@@ -915,6 +921,16 @@ ibx_id = ? AND xnum >= ? AND xnum <= ?
                        my ($xnum, $hex) = unpack('JH*', $k);
                        my $bin = pack('H*', $hex);
                        my $exp = $mismatch{$xnum};
+                       if (defined $exp) {
+                               my $smsg = $ibx->over->get_art($xnum) // next;
+                               # $xnum may be expired by another process
+                               if ($smsg->{blob} eq $hex) {
+                                       warn <<"";
+BUG: (non-fatal) $ekey #$xnum $smsg->{blob} still matches (old exp: $exp)
+
+                                       next;
+                               } # else: continue to unref
+                       }
                        my $m = defined($exp) ? "mismatch (!= $exp)" : 'stale';
                        warn("# $xnum:$hex (#@$docids): $m\n");
                        for my $i (@$docids) {