about summary refs log tree commit homepage
path: root/lib/PublicInbox/OverIdx.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2020-12-04 12:09:29 +0000
committerEric Wong <e@80x24.org>2020-12-05 06:36:43 +0000
commit9356ec0cc5afc95a8fd398ddf898942ef0acdb74 (patch)
tree50f9de9c82572894a1cfdda2951c02890597a312 /lib/PublicInbox/OverIdx.pm
parent82ffb3c183ac20e00effa8a5a7b664eda59672de (diff)
downloadpublic-inbox-9356ec0cc5afc95a8fd398ddf898942ef0acdb74.tar.gz
We must use the result of link_refs() since it can trigger
merge_threads() and invalidate $old_tid.  In case
merge_threads() isn't triggered, link_refs() will return
$old_tid anyways.

When rethreading and allocating new {tid}, we also must update
the row where the now-expired {tid} came from to ensure only the
new {tid} is seen when reindexing subsequent messages in
history.  Otherwise, every subsequently reindexed+rethreaded
message could end up getting a new {tid}.

Reported-by: Kyle Meyer <kyle@kyleam.com>
Link: https://public-inbox.org/meta/87360nlc44.fsf@kyleam.com/
Diffstat (limited to 'lib/PublicInbox/OverIdx.pm')
-rw-r--r--lib/PublicInbox/OverIdx.pm12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/PublicInbox/OverIdx.pm b/lib/PublicInbox/OverIdx.pm
index 07cca4e5..88daa64f 100644
--- a/lib/PublicInbox/OverIdx.pm
+++ b/lib/PublicInbox/OverIdx.pm
@@ -170,8 +170,14 @@ sub _resolve_mid_to_tid {
                 $$tid = $cur_tid;
         } else { # rethreading, queue up dead ghosts
                 $$tid = next_tid($self);
-                my $num = $smsg->{num};
-                push(@{$self->{-ghosts_to_delete}}, $num) if $num < 0;
+                my $n = $smsg->{num};
+                if ($n > 0) {
+                        $self->{dbh}->prepare_cached(<<'')->execute($$tid, $n);
+UPDATE over SET tid = ? WHERE num = ?
+
+                } elsif ($n < 0) {
+                        push(@{$self->{-ghosts_to_delete}}, $n);
+                }
         }
         1;
 }
@@ -298,7 +304,7 @@ sub _add_over {
                 }
         } elsif ($n < 0) { # ghost
                 $$old_tid //= $cur_valid ? $cur_tid : next_tid($self);
-                link_refs($self, $refs, $$old_tid);
+                $$old_tid = link_refs($self, $refs, $$old_tid);
                 delete_by_num($self, $n);
                 $$v++;
         }