Mercurial > dovecot > core-2.2
changeset 17586:120b2a1645d8
fts-lucene: Delay initialization to fix assert-crash with mbox
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 03 Jul 2014 19:27:45 +0300 |
parents | cea292767b95 |
children | 4c4db2d76137 |
files | src/plugins/fts-lucene/fts-backend-lucene.c |
diffstat | 1 files changed, 42 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- 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;