Mercurial > dovecot > core-2.2
changeset 13264:86d752132290
fts-lucene: Once enough messages have been deleted, trigger optimize via indexer.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 16 Aug 2011 22:23:48 +0300 |
parents | 8d38b23d77f8 |
children | 2d4175c9ff52 |
files | src/plugins/fts-lucene/fts-backend-lucene.c |
diffstat | 1 files changed, 25 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts-lucene/fts-backend-lucene.c Tue Aug 16 22:22:32 2011 +0300 +++ b/src/plugins/fts-lucene/fts-backend-lucene.c Tue Aug 16 22:23:48 2011 +0300 @@ -4,6 +4,7 @@ #include "array.h" #include "hash.h" #include "hex-binary.h" +#include "strescape.h" #include "mail-namespace.h" #include "mail-storage-private.h" #include "fts-expunge-log.h" @@ -36,14 +37,15 @@ struct mailbox *box; uint32_t last_uid; + char *first_box_vname; uint32_t uid; char *hdr_name; unsigned int added_msgs; - bool lucene_opened; + struct fts_expunge_log_append_ctx *expunge_ctx; - struct fts_expunge_log_append_ctx *expunge_ctx; + bool lucene_opened; }; static int fts_backend_lucene_mkdir(struct lucene_fts_backend *backend) @@ -205,11 +207,6 @@ unsigned int expunges; uint32_t numdocs; - if (!ctx->ctx.backend->syncing) { - /* only indexer process can actually do anything - about optimizing */ - return FALSE; - } if (ctx->added_msgs >= LUCENE_OPTIMIZE_BATCH_MSGS_COUNT) return TRUE; if (lucene_index_get_doc_count(backend->index, &numdocs) < 0) @@ -241,9 +238,26 @@ ret = -1; } - if (fts_backend_lucene_need_optimize(ctx)) - (void)fts_backend_optimize(_ctx->backend); + if (fts_backend_lucene_need_optimize(ctx)) { + if (ctx->ctx.backend->syncing) + (void)fts_backend_optimize(_ctx->backend); + else { + struct mail_user *user = backend->backend.ns->user; + const char *cmd, *path; + int fd; + /* the optimize affects all mailboxes within namespace, + so just use any mailbox name in it */ + cmd = t_strdup_printf("OPTIMIZE\t0\t%s\t%s\n", + str_tabescape(user->username), + str_tabescape(ctx->first_box_vname)); + fd = fts_indexer_cmd(user, cmd, &path); + if (fd != -1) + (void)close(fd); + } + } + + i_free(ctx->first_box_vname); i_free(ctx); return ret; } @@ -259,6 +273,8 @@ (void)fts_index_set_last_uid(ctx->box, ctx->last_uid); ctx->last_uid = 0; } + if (ctx->first_box_vname == NULL) + ctx->first_box_vname = i_strdup(box->vname); ctx->box = box; }