From: Timo Sirainen Date: Thu, 3 May 2018 15:33:25 +0000 (+0300) Subject: fts: When indexing virtual mailbox, index each real mailbox entirely X-Git-Tag: 2.3.2.rc1~24 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5af358949ebb8c2f8f5a75668d6c53d9a127ff1e;p=thirdparty%2Fdovecot%2Fcore.git fts: When indexing virtual mailbox, index each real mailbox entirely Index all the unindexed messages in them at once, instead of jumping between real mailboxes and indexing them in small pieces. --- diff --git a/src/plugins/fts/fts-storage.c b/src/plugins/fts/fts-storage.c index 17d5c30742..c14fedc5da 100644 --- a/src/plugins/fts/fts-storage.c +++ b/src/plugins/fts/fts-storage.c @@ -486,6 +486,7 @@ static void fts_mail_index(struct mail *_mail) { struct fts_transaction_context *ft = FTS_CONTEXT_REQUIRE(_mail->transaction); struct fts_mailbox_list *flist = FTS_LIST_CONTEXT_REQUIRE(_mail->box->list); + struct mail_private *pmail = (struct mail_private *)_mail; if (ft->failed) return; @@ -496,9 +497,30 @@ static void fts_mail_index(struct mail *_mail) return; } } + if (pmail->vmail != NULL) { + /* Indexing via virtual mailbox: Index all the mails in this + same real mailbox. */ + uint32_t msgs_count = + mail_index_view_get_messages_count(_mail->box->view); + + fts_backend_update_set_mailbox(flist->update_ctx, _mail->box); + if (ft->next_index_seq > msgs_count) { + /* everything indexed already */ + } else if (fts_mail_precache_range(_mail->transaction, + flist->update_ctx, + ft->next_index_seq, + msgs_count, + &ft->precache_extra_count) < 0) { + ft->failed = TRUE; + } else { + ft->next_index_seq = msgs_count+1; + } + return; + } + if (ft->next_index_seq < _mail->seq) { - /* most likely a virtual mailbox. we'll first need to - index all mails up to the current one. */ + /* we'll first need to index all the missing mails up to the + current one. */ fts_backend_update_set_mailbox(flist->update_ctx, _mail->box); if (fts_mail_precache_range(_mail->transaction, flist->update_ctx,