dovecot-2.2: fts-lucene: Delay initialization to fix assert-cras...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jul 3 16:29:15 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/120b2a1645d8
changeset: 17586:120b2a1645d8
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jul 03 19:27:45 2014 +0300
description:
fts-lucene: Delay initialization to fix assert-crash with mbox

diffstat:

 src/plugins/fts-lucene/fts-backend-lucene.c |  57 +++++++++++++++++++++-------
 1 files changed, 42 insertions(+), 15 deletions(-)

diffs (135 lines):

diff -r cea292767b95 -r 120b2a1645d8 src/plugins/fts-lucene/fts-backend-lucene.c
--- a/src/plugins/fts-lucene/fts-backend-lucene.c	Thu Jul 03 19:17:16 2014 +0300
+++ b/src/plugins/fts-lucene/fts-backend-lucene.c	Thu Jul 03 19:27:45 2014 +0300
@@ -126,14 +126,35 @@
 	return &backend->backend;
 }
 
+static void fts_backend_lucene_real_init(struct lucene_fts_backend *backend)
+{
+	struct fts_lucene_user *fuser =
+		FTS_LUCENE_USER_CONTEXT(backend->backend.ns->user);
+	const char *path;
+
+	if (backend->index != NULL)
+		return;
+
+	/* initialize this path lazily, because with mbox format the get_path()
+	   is overridden by the mbox code, but it hasn't had a chance to do
+	   that yet in fts_backend_lucene_init(). */
+	path = mailbox_list_get_root_forced(backend->backend.ns->list,
+					    MAILBOX_LIST_PATH_TYPE_INDEX);
+
+	backend->dir_path = i_strconcat(path, "/"LUCENE_INDEX_DIR_NAME, NULL);
+	backend->index = lucene_index_init(backend->dir_path,
+					   backend->backend.ns->list,
+					   &fuser->set);
+
+	path = t_strconcat(backend->dir_path, "/"LUCENE_EXPUNGE_LOG_NAME, NULL);
+	backend->expunge_log = fts_expunge_log_init(path);
+}
+
 static int
 fts_backend_lucene_init(struct fts_backend *_backend, const char **error_r)
 {
-	struct lucene_fts_backend *backend =
-		(struct lucene_fts_backend *)_backend;
 	struct fts_lucene_user *fuser =
 		FTS_LUCENE_USER_CONTEXT(_backend->ns->user);
-	const char *path;
 
 	if (fuser == NULL) {
 		/* invalid settings */
@@ -142,15 +163,6 @@
 	}
 
 	/* fts already checked that index exists */
-	path = mailbox_list_get_root_forced(_backend->ns->list,
-					    MAILBOX_LIST_PATH_TYPE_INDEX);
-
-	backend->dir_path = i_strconcat(path, "/"LUCENE_INDEX_DIR_NAME, NULL);
-	backend->index = lucene_index_init(backend->dir_path,
-					   _backend->ns->list, &fuser->set);
-
-	path = t_strconcat(backend->dir_path, "/"LUCENE_EXPUNGE_LOG_NAME, NULL);
-	backend->expunge_log = fts_expunge_log_init(path);
 	return 0;
 }
 
@@ -159,8 +171,10 @@
 	struct lucene_fts_backend *backend =
 		(struct lucene_fts_backend *)_backend;
 
-	lucene_index_deinit(backend->index);
-	fts_expunge_log_deinit(&backend->expunge_log);
+	if (backend->index != NULL)
+		lucene_index_deinit(backend->index);
+	if (backend->expunge_log != NULL)
+		fts_expunge_log_deinit(&backend->expunge_log);
 	i_free(backend->dir_path);
 	i_free(backend);
 }
@@ -176,6 +190,8 @@
 	struct fts_index_header hdr;
 	uint32_t set_checksum;
 
+	fts_backend_lucene_real_init(backend);
+
 	if (fts_index_get_header(box, &hdr)) {
 		set_checksum = fts_lucene_settings_checksum(&fuser->set);
 		if (!fts_index_have_compatible_settings(_backend->ns->list,
@@ -210,6 +226,8 @@
 
 	i_assert(!backend->updating);
 
+	fts_backend_lucene_real_init(backend);
+
 	ctx = i_new(struct lucene_fts_backend_update_context, 1);
 	ctx->ctx.backend = _backend;
 	ctx->mime_parts = fuser->set.mime_parts;
@@ -425,7 +443,8 @@
 	struct lucene_fts_backend *backend =
 		(struct lucene_fts_backend *)_backend;
 
-	lucene_index_close(backend->index);
+	if (backend->index != NULL)
+		lucene_index_close(backend->index);
 	return 0;
 }
 
@@ -434,6 +453,8 @@
 	struct lucene_fts_backend *backend =
 		(struct lucene_fts_backend *)_backend;
 
+	fts_backend_lucene_real_init(backend);
+
 	if (lucene_index_rescan(backend->index) < 0)
 		return -1;
 	return lucene_index_optimize(backend->index);
@@ -445,6 +466,8 @@
 		(struct lucene_fts_backend *)_backend;
 	int ret;
 
+	fts_backend_lucene_real_init(backend);
+
 	ret = lucene_index_expunge_from_log(backend->index,
 					    backend->expunge_log);
 	if (ret == 0) {
@@ -465,6 +488,8 @@
 		(struct lucene_fts_backend *)_backend;
 	int ret;
 
+	fts_backend_lucene_real_init(backend);
+
 	if (fts_backend_select(backend, box) < 0)
 		return -1;
 	T_BEGIN {
@@ -532,6 +557,8 @@
 		(struct lucene_fts_backend *)_backend;
 	int ret;
 
+	fts_backend_lucene_real_init(backend);
+
 	T_BEGIN {
 		HASH_TABLE_TYPE(wguid_result) guids;
 


More information about the dovecot-cvs mailing list