fts-lucene with virtual folders

Dmitry Nezhevenko dion at dion.org.ua
Tue Apr 12 09:40:55 UTC 2016


On Tue, Apr 12, 2016 at 11:26:05AM +0300, Dmitry Nezhevenko wrote:
> On Tue, Apr 12, 2016 at 11:05:08AM +0300, Dmitry Nezhevenko wrote:
> > indexer-worker(dion): Warning: fts-lucene: Settings have changed, rebuilding index for mailbox

> The root issue is that fts_lucene_settings_checksum reads checksum from
> mailbox with empty name (probably namespace root mbox). At the same time
> fts_index_set_header is called for all mailboxes in namespace except this
> 'root' mbox. 

This proof-of-concept patch fixes issue for me. I don't think that this is
right way to fix it. I've copied vname calculation code from
fts_index_have_compatible_settings. Maybe it's better to create
something like fts_index_write_settings_checksum() in fts-api.

Index: dovecot-2.2.22/src/plugins/fts-lucene/lucene-wrapper.cc
===================================================================
--- dovecot-2.2.22.orig/src/plugins/fts-lucene/lucene-wrapper.cc
+++ dovecot-2.2.22/src/plugins/fts-lucene/lucene-wrapper.cc
@@ -832,6 +832,11 @@ static void rescan_clear_unseen_mailboxe
 	struct mailbox_metadata metadata;
 	struct fts_index_header hdr;
 
+	struct mail_namespace *ns;
+	const char* vname;
+	struct fts_index_header hdr_root;
+	unsigned int len;
+
 	memset(&hdr, 0, sizeof(hdr));
 	hdr.settings_checksum = fts_lucene_settings_checksum(&index->set);
 
@@ -852,6 +857,26 @@ static void rescan_clear_unseen_mailboxe
 		mailbox_free(&box);
 	}
 	(void)mailbox_list_iter_deinit(&iter);
+
+	// Make sure we've stored settings checksum for non-INBOX namespaces
+	ns = mailbox_list_get_namespace(index->list);
+	if ((ns->flags & NAMESPACE_FLAG_INBOX_USER) == 0) {
+		len = strlen(ns->prefix);
+		if (len > 0 && ns->prefix[len-1] == mail_namespace_get_sep(ns))
+			len--;
+		vname = t_strndup(ns->prefix, len);
+
+		box = mailbox_alloc(index->list, vname,
+				    (enum mailbox_flags)0);
+		if (mailbox_open(box) == 0 &&
+		    fts_index_get_header(box, &hdr_root)) {
+			if (hdr_root.settings_checksum != hdr.settings_checksum) {
+				hdr_root.settings_checksum = hdr.settings_checksum;
+				(void)fts_index_set_header(box, &hdr_root);
+			}
+		}
+		mailbox_free(&box);
+	}
 }
 
 int lucene_index_rescan(struct lucene_index *index)
 
-- 
WBR, Dmitry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://dovecot.org/pipermail/dovecot/attachments/20160412/a00a621a/attachment.sig>


More information about the dovecot mailing list