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