]> Sergey Matveev's repositories - public-inbox.git/commitdiff
searchidx: merge old thread id from ghosts
authorEric Wong <e@80x24.org>
Tue, 21 Jun 2016 03:16:53 +0000 (03:16 +0000)
committerEric Wong <e@80x24.org>
Tue, 21 Jun 2016 03:21:11 +0000 (03:21 +0000)
We failed to discard old thread IDs when vivifying ghosts
due to out-of-order message arrival.  This rectifies the
failure and will trigger a re-index.

lib/PublicInbox/Search.pm
lib/PublicInbox/SearchIdx.pm

index 8c0bab185d489008356e8efeafa641893549eac7..bf50365a04603d86d9722a923e4a36f0b8287c77 100644 (file)
@@ -36,7 +36,8 @@ use constant {
        # 8 - remove redundant/unneeded document data
        # 9 - disable Message-ID compression (SHA-1)
        # 10 - optimize doc for NNTP overviews
-       SCHEMA_VERSION => 10,
+       # 11 - merge threads when vivifying ghosts
+       SCHEMA_VERSION => 11,
 
        # n.b. FLAG_PURE_NOT is expensive not suitable for a public website
        # as it could become a denial-of-service vector
index 31346876bcfefdd1f123d2537e1a06313db1e2cc..58eccc1a2d67241ed273e940fee0d1fb2b27c51d 100644 (file)
@@ -150,7 +150,7 @@ sub add_message {
 
                if ($was_ghost) {
                        $doc_id = $smsg->doc_id;
-                       $self->link_message($smsg);
+                       $self->link_message($smsg, $smsg->thread_id);
                        $doc->set_data($smsg->to_doc_data);
                        $db->replace_document($doc_id, $doc);
                } else {
@@ -211,7 +211,7 @@ sub next_thread_id {
 }
 
 sub link_message {
-       my ($self, $smsg) = @_;
+       my ($self, $smsg, $old_tid) = @_;
        my $doc = $smsg->{doc};
        my $mid = $smsg->mid;
        my $mime = $smsg->mime;
@@ -247,6 +247,7 @@ sub link_message {
                # but we can never trust clients to do the right thing
                my $ref = shift @refs;
                $tid = $self->_resolve_mid_to_tid($ref);
+               $self->merge_threads($tid, $old_tid) if defined $old_tid;
 
                # the rest of the refs should point to this tid:
                foreach $ref (@refs) {