dovecot-2.2: mailbox_list_index=yes: Delay opening/creating the ...

dovecot at dovecot.org dovecot at dovecot.org
Sun May 20 03:26:27 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/0274c4132052
changeset: 14342:0274c4132052
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Mar 14 15:34:14 2012 +0200
description:
mailbox_list_index=yes: Delay opening/creating the index until it's needed.
This also fixes an error when trying to create the index before the parent
director is created.

diffstat:

 src/lib-storage/list/mailbox-list-index.c |  61 +++++++++++++++---------------
 src/lib-storage/list/mailbox-list-index.h |   2 +
 2 files changed, 33 insertions(+), 30 deletions(-)

diffs (111 lines):

diff -r 90738a7c7535 -r 0274c4132052 src/lib-storage/list/mailbox-list-index.c
--- a/src/lib-storage/list/mailbox-list-index.c	Wed Mar 14 14:59:24 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-index.c	Wed Mar 14 15:34:14 2012 +0200
@@ -30,6 +30,34 @@
 	ilist->sync_log_file_offset = 0;
 }
 
+static void 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;
+	enum mail_index_open_flags index_flags;
+	unsigned int lock_timeout;
+
+	if (ilist->opened)
+		return;
+	ilist->opened = TRUE;
+
+	index_flags = mail_storage_settings_to_index_flags(set);
+	lock_timeout = set->mail_max_lock_timeout == 0 ? -1U :
+		set->mail_max_lock_timeout;
+
+	mail_index_set_lock_method(ilist->index, set->parsed_lock_method,
+				   lock_timeout);
+	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. */
+			if (mail_index_open_or_create(ilist->index,
+						      index_flags) < 0)
+				i_panic("in-memory index creation failed");
+		}
+	}
+}
+
 struct mailbox_list_index_node *
 mailbox_list_index_node_find_sibling(struct mailbox_list_index_node *node,
 				     const char *name)
@@ -220,6 +248,7 @@
 		return 0;
 	}
 
+	mailbox_list_index_index_open(list);
 	if (mail_index_refresh(ilist->index) < 0) {
 		mailbox_list_index_set_index_error(list);
 		return -1;
@@ -244,6 +273,8 @@
 	struct mail_index_view *view;
 	struct mail_index_transaction *trans;
 
+	mailbox_list_index_index_open(list);
+
 	view = mail_index_view_open(ilist->index);
 	if (!mailbox_list_index_need_refresh(ilist, view)) {
 		new_hdr.refresh_flag = 1;
@@ -272,31 +303,6 @@
 	ilist->module_ctx.super.deinit(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;
-	enum mail_index_open_flags index_flags;
-	unsigned int lock_timeout;
-
-	index_flags = mail_storage_settings_to_index_flags(set);
-	lock_timeout = set->mail_max_lock_timeout == 0 ? -1U :
-		set->mail_max_lock_timeout;
-
-	mail_index_set_lock_method(ilist->index, set->parsed_lock_method,
-				   lock_timeout);
-	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. */
-			if (mail_index_open_or_create(ilist->index,
-						      index_flags) < 0)
-				i_panic("in-memory index creation failed");
-		}
-	}
-	return 0;
-}
-
 static int
 mailbox_list_index_create_mailbox_dir(struct mailbox_list *list,
 				      const char *name,
@@ -398,11 +404,6 @@
 		hash_table_create(default_pool, ilist->mailbox_pool,
 				  0, NULL, NULL);
 
-	if (mailbox_list_index_index_open(list) < 0) {
-		list->v = ilist->module_ctx.super;
-		mail_index_free(&ilist->index);
-		MODULE_CONTEXT_UNSET(list, mailbox_list_index_module);
-	}
 	mailbox_list_index_status_init_list(list);
 }
 
diff -r 90738a7c7535 -r 0274c4132052 src/lib-storage/list/mailbox-list-index.h
--- a/src/lib-storage/list/mailbox-list-index.h	Wed Mar 14 14:59:24 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-index.h	Wed Mar 14 15:34:14 2012 +0200
@@ -102,6 +102,8 @@
 	/* uint32_t uid => struct mailbox_list_index_node* */
 	struct hash_table *mailbox_hash;
 	struct mailbox_list_index_node *mailbox_tree;
+
+	unsigned int opened:1;
 };
 
 struct mailbox_list_index_iterate_context {


More information about the dovecot-cvs mailing list