changeset 22956:fc76e2678988

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.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 03 May 2018 18:33:25 +0300
parents 812e5c961328
children 1d2167636cc6
files src/plugins/fts/fts-storage.c
diffstat 1 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts/fts-storage.c	Thu May 03 18:33:00 2018 +0300
+++ b/src/plugins/fts/fts-storage.c	Thu May 03 18:33:25 2018 +0300
@@ -482,6 +482,7 @@
 {
 	struct fts_transaction_context *ft = FTS_CONTEXT(_mail->transaction);
 	struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(_mail->box->list);
+	struct mail_private *pmail = (struct mail_private *)_mail;
 
 	if (ft->failed)
 		return;
@@ -492,9 +493,30 @@
 			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,