about summary refs log tree commit homepage
path: root/lib/PublicInbox/ExtSearchIdx.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/ExtSearchIdx.pm')
-rw-r--r--lib/PublicInbox/ExtSearchIdx.pm19
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/PublicInbox/ExtSearchIdx.pm b/lib/PublicInbox/ExtSearchIdx.pm
index cf61237c..8cdad23d 100644
--- a/lib/PublicInbox/ExtSearchIdx.pm
+++ b/lib/PublicInbox/ExtSearchIdx.pm
@@ -343,20 +343,18 @@ sub _sync_inbox ($$$) {
 
 sub gc_unref_doc ($$$$) {
         my ($self, $ibx_id, $eidx_key, $docid) = @_;
-        my $dbh = $self->{oidx}->dbh;
-
+        my $remain = 0;
         # for debug/info purposes, oids may no longer be accessible
+        my $dbh = $self->{oidx}->dbh;
         my $sth = $dbh->prepare_cached(<<'', undef, 1);
 SELECT oidbin FROM xref3 WHERE docid = ? AND ibx_id = ?
 
         $sth->execute($docid, $ibx_id);
         my @oid = map { unpack('H*', $_->[0]) } @{$sth->fetchall_arrayref};
-
-        $dbh->prepare_cached(<<'')->execute($docid, $ibx_id);
-DELETE FROM xref3 WHERE docid = ? AND ibx_id = ?
-
-        my $remain = $self->{oidx}->get_xref3($docid);
-        if (scalar(@$remain)) {
+        for my $oid (@oid) {
+                $remain += $self->{oidx}->remove_xref3($docid, $oid, $eidx_key);
+        }
+        if ($remain) {
                 $self->{oidx}->eidxq_add($docid); # enqueue for reindex
                 for my $oid (@oid) {
                         warn "I: unref #$docid $eidx_key $oid\n";
@@ -421,6 +419,11 @@ DELETE FROM xref3 WHERE docid NOT IN (SELECT num FROM over)
 
         warn "I: eliminated $nr stale xref3 entries\n" if $nr != 0;
 
+        # fixup from old bugs:
+        $nr = $dbh->do(<<'');
+DELETE FROM over WHERE num NOT IN (SELECT docid FROM xref3)
+
+        warn "I: eliminated $nr stale over entries\n" if $nr != 0;
         done($self);
 }