dovecot-2.2: lib-storage: Fixes to LAYOUT=index backend.

dovecot at dovecot.org dovecot at dovecot.org
Mon Nov 26 23:21:06 EET 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/a725b63608fb
changeset: 15412:a725b63608fb
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Nov 26 23:20:59 2012 +0200
description:
lib-storage: Fixes to LAYOUT=index backend.

diffstat:

 src/lib-storage/list/mailbox-list-index-backend.c |  12 +++++++-
 src/lib-storage/list/mailbox-list-index-iter.c    |   2 +-
 src/lib-storage/list/mailbox-list-index.c         |  32 +++++++++++++++-------
 src/lib-storage/list/mailbox-list-index.h         |   1 -
 src/lib-storage/list/mailbox-list-none.c          |   1 -
 src/lib-storage/mailbox-list-private.h            |   2 +
 6 files changed, 35 insertions(+), 15 deletions(-)

diffs (175 lines):

diff -r f64a91637f9b -r a725b63608fb src/lib-storage/list/mailbox-list-index-backend.c
--- a/src/lib-storage/list/mailbox-list-index-backend.c	Mon Nov 26 23:19:04 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-index-backend.c	Mon Nov 26 23:20:59 2012 +0200
@@ -36,10 +36,18 @@
 
 static int index_list_init(struct mailbox_list *_list, const char **error_r)
 {
+	const char *dir;
+
 	if (!_list->mail_set->mailbox_list_index) {
 		*error_r = "LAYOUT=index requires mailbox_list_index=yes";
 		return -1;
 	}
+	if (mailbox_list_get_root_path(_list, MAILBOX_LIST_PATH_TYPE_INDEX, &dir) &&
+	    mailbox_list_mkdir_root(_list, dir, MAILBOX_LIST_PATH_TYPE_INDEX) < 0) {
+		*error_r = t_strdup_printf("Failed to create the index root directory: %s",
+					   mailbox_list_get_last_error(_list, NULL));
+		return -1;
+	}
 	return 0;
 }
 
@@ -542,7 +550,7 @@
 	struct mailbox_list_iterate_context *ctx;
 	pool_t pool;
 
-	pool = pool_alloconly_create("mailbox list index iter", 1024);
+	pool = pool_alloconly_create("mailbox list index backend iter", 1024);
 	ctx = p_new(pool, struct mailbox_list_iterate_context, 1);
 	ctx->pool = pool;
 	ctx->list = list;
@@ -565,7 +573,7 @@
 
 struct mailbox_list index_mailbox_list = {
 	.name = MAILBOX_LIST_NAME_INDEX,
-	.props = 0,
+	.props = MAILBOX_LIST_PROP_NO_ROOT,
 	.mailbox_name_max_length = MAILBOX_LIST_NAME_MAX_LENGTH,
 
 	{
diff -r f64a91637f9b -r a725b63608fb src/lib-storage/list/mailbox-list-index-iter.c
--- a/src/lib-storage/list/mailbox-list-index-iter.c	Mon Nov 26 23:19:04 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-index-iter.c	Mon Nov 26 23:20:59 2012 +0200
@@ -40,7 +40,7 @@
 	pool_t pool;
 	char ns_sep = mail_namespace_get_sep(list->ns);
 
-	pool = pool_alloconly_create("mailbox list index iter", 1024);
+	pool = pool_alloconly_create("mailbox list index iter", 2048);
 	ctx = p_new(pool, struct mailbox_list_index_iterate_context, 1);
 	ctx->ctx.pool = pool;
 	ctx->ctx.list = list;
diff -r f64a91637f9b -r a725b63608fb src/lib-storage/list/mailbox-list-index.c
--- a/src/lib-storage/list/mailbox-list-index.c	Mon Nov 26 23:19:04 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-index.c	Mon Nov 26 23:20:59 2012 +0200
@@ -36,7 +36,7 @@
 	ilist->sync_log_file_offset = 0;
 }
 
-static void mailbox_list_index_index_open(struct mailbox_list *list)
+static int mailbox_list_index_index_open(struct mailbox_list *list)
 {
 	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
 	const struct mail_storage_settings *set = list->mail_set;
@@ -44,10 +44,14 @@
 	unsigned int lock_timeout;
 
 	if (ilist->opened)
-		return;
-	ilist->opened = TRUE;
+		return 0;
 
 	index_flags = mail_storage_settings_to_index_flags(set);
+	if (strcmp(list->name, MAILBOX_LIST_NAME_INDEX) == 0) {
+		/* LAYOUT=index. this is the only location for the mailbox
+		   data, so we must never move it into memory. */
+		index_flags |= MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY;
+	}
 	lock_timeout = set->mail_max_lock_timeout == 0 ? -1U :
 		set->mail_max_lock_timeout;
 
@@ -56,12 +60,17 @@
 	if (mail_index_open_or_create(ilist->index, index_flags) < 0) {
 		if (mail_index_move_to_memory(ilist->index) < 0) {
 			/* try opening once more. it should be created
-			   directly into memory now. */
+			   directly into memory now, except if it fails with
+			   LAYOUT=index backend. */
 			if (mail_index_open_or_create(ilist->index,
-						      index_flags) < 0)
-				i_panic("in-memory index creation failed");
+						      index_flags) < 0) {
+				mailbox_list_set_internal_error(list);
+				return -1;
+			}
 		}
 	}
+	ilist->opened = TRUE;
+	return 0;
 }
 
 struct mailbox_list_index_node *
@@ -344,7 +353,8 @@
 		return 0;
 	}
 
-	mailbox_list_index_index_open(list);
+	if (mailbox_list_index_index_open(list) < 0)
+		return -1;
 	if (mail_index_refresh(ilist->index) < 0) {
 		mailbox_list_index_set_index_error(list);
 		return -1;
@@ -380,7 +390,7 @@
 	if (!ilist->has_backing_store)
 		return;
 
-	mailbox_list_index_index_open(list);
+	(void)mailbox_list_index_index_open(list);
 
 	view = mail_index_view_open(ilist->index);
 	if (!mailbox_list_index_need_refresh(ilist, view)) {
@@ -481,7 +491,8 @@
 
 	/* update the "subscriptions changed" counter/timestamp. its purpose
 	   is to trigger NOTIFY watcher to handle SubscriptionChange events */
-	mailbox_list_index_index_open(_list);
+	if (mailbox_list_index_index_open(_list) < 0)
+		return -1;
 	view = mail_index_view_open(ilist->index);
 	mail_index_get_header_ext(view, ilist->subs_hdr_ext_id, &data, &size);
 	if (size != sizeof(counter))
@@ -510,7 +521,8 @@
 	/* layout=index doesn't have any backing store */
 	has_backing_store = strcmp(list->name, MAILBOX_LIST_NAME_INDEX) != 0;
 
-	if (!list->mail_set->mailbox_list_index) {
+	if (!list->mail_set->mailbox_list_index ||
+	    strcmp(list->name, MAILBOX_LIST_NAME_NONE) == 0) {
 		/* reserve the module context anyway, so syncing code knows
 		   that the index is disabled */
 		i_assert(has_backing_store);
diff -r f64a91637f9b -r a725b63608fb src/lib-storage/list/mailbox-list-index.h
--- a/src/lib-storage/list/mailbox-list-index.h	Mon Nov 26 23:19:04 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-index.h	Mon Nov 26 23:20:59 2012 +0200
@@ -27,7 +27,6 @@
 #include "mail-storage.h"
 #include "mailbox-list-private.h"
 
-#define MAILBOX_LIST_NAME_INDEX "index"
 #define MAILBOX_LIST_INDEX_HIERARHCY_SEP '~'
 #define MAILBOX_LIST_INDEX_PREFIX "dovecot.list.index"
 
diff -r f64a91637f9b -r a725b63608fb src/lib-storage/list/mailbox-list-none.c
--- a/src/lib-storage/list/mailbox-list-none.c	Mon Nov 26 23:19:04 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-none.c	Mon Nov 26 23:20:59 2012 +0200
@@ -5,7 +5,6 @@
 #include "imap-match.h"
 #include "mailbox-list-private.h"
 
-#define MAILBOX_LIST_NAME_NONE "none"
 #define GLOBAL_TEMP_PREFIX ".temp."
 
 struct noop_list_iterate_context {
diff -r f64a91637f9b -r a725b63608fb src/lib-storage/mailbox-list-private.h
--- a/src/lib-storage/mailbox-list-private.h	Mon Nov 26 23:19:04 2012 +0200
+++ b/src/lib-storage/mailbox-list-private.h	Mon Nov 26 23:20:59 2012 +0200
@@ -11,6 +11,8 @@
 #define MAILBOX_LIST_NAME_MAILDIRPLUSPLUS "maildir++"
 #define MAILBOX_LIST_NAME_IMAPDIR "imapdir"
 #define MAILBOX_LIST_NAME_FS "fs"
+#define MAILBOX_LIST_NAME_INDEX "index"
+#define MAILBOX_LIST_NAME_NONE "none"
 
 #define MAILBOX_LOG_FILE_NAME "dovecot.mailbox.log"
 


More information about the dovecot-cvs mailing list