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;
 }