]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/ExtSearchIdx.pm
extindex: better locations for {quit} checks
[public-inbox.git] / lib / PublicInbox / ExtSearchIdx.pm
index 67d720368922d6013253fc4be27c7464c02f3265..f479cf9e1a3fd4ee42ff9e03eeba26b26c1b1411 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};
@@ -902,10 +908,9 @@ ibx_id = ? AND xnum >= ? AND xnum <= ?
                                for my $num (@$docids) {
                                        $self->{oidx}->eidxq_add($num);
                                }
-                               return if $sync->{quit};
                        }
+                       return if $sync->{quit};
                }
-               return if $sync->{quit};
                next unless scalar keys %x3m;
                $self->git->async_wait_all; # wait for reindex_unseen
 
@@ -915,11 +920,22 @@ 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) {
                                _unref_doc($sync, $i, $ibx, $xnum, $bin);
                        }
+                       return if $sync->{quit};
                }
        }
        defined($hi) and ($hi < $max) and