dovecot-2.2: mailbox_list_index: Delay allocating the index so m...

dovecot at dovecot.org dovecot at dovecot.org
Wed Feb 20 16:49:25 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/f703e1fd7c21
changeset: 15864:f703e1fd7c21
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Feb 20 16:49:14 2013 +0200
description:
mailbox_list_index: Delay allocating the index so mbox can override the index path.

diffstat:

 src/lib-storage/list/mailbox-list-index-status.c |   2 +-
 src/lib-storage/list/mailbox-list-index.c        |  39 +++++++++++++++++++----
 src/lib-storage/list/mailbox-list-index.h        |   3 +-
 3 files changed, 34 insertions(+), 10 deletions(-)

diffs (112 lines):

diff -r 808a64899e8a -r f703e1fd7c21 src/lib-storage/list/mailbox-list-index-status.c
--- a/src/lib-storage/list/mailbox-list-index-status.c	Wed Feb 20 16:03:53 2013 +0200
+++ b/src/lib-storage/list/mailbox-list-index-status.c	Wed Feb 20 16:49:14 2013 +0200
@@ -529,7 +529,7 @@
 	box->v.transaction_commit = index_list_transaction_commit;
 }
 
-void mailbox_list_index_status_init_list(struct mailbox_list *list)
+void mailbox_list_index_status_init_finish(struct mailbox_list *list)
 {
 	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
 
diff -r 808a64899e8a -r f703e1fd7c21 src/lib-storage/list/mailbox-list-index.c
--- a/src/lib-storage/list/mailbox-list-index.c	Wed Feb 20 16:03:53 2013 +0200
+++ b/src/lib-storage/list/mailbox-list-index.c	Wed Feb 20 16:49:14 2013 +0200
@@ -528,7 +528,6 @@
 static void mailbox_list_index_created(struct mailbox_list *list)
 {
 	struct mailbox_list_index *ilist;
-	const char *dir;
 	bool has_backing_store;
 
 	/* layout=index doesn't have any backing store */
@@ -543,16 +542,11 @@
 		MODULE_CONTEXT_SET(list, mailbox_list_index_module, ilist);
 		return;
 	}
-	if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX,
-					&dir)) {
-		/* in-memory indexes */
-		dir = NULL;
-	}
-	i_assert(has_backing_store || dir != NULL);
 
 	ilist = p_new(list->pool, struct mailbox_list_index, 1);
 	ilist->module_ctx.super = list->v;
 	ilist->has_backing_store = has_backing_store;
+	ilist->pending_init = TRUE;
 
 	list->v.deinit = mailbox_list_index_deinit;
 	list->v.iter_init = mailbox_list_index_iter_init;
@@ -570,6 +564,25 @@
 	list->v.notify_wait = mailbox_list_index_notify_wait;
 
 	MODULE_CONTEXT_SET(list, mailbox_list_index_module, ilist);
+}
+
+static void mailbox_list_index_init_finish(struct mailbox_list *list)
+{
+	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
+	const char *dir;
+
+	if (!ilist->pending_init)
+		return;
+	ilist->pending_init = FALSE;
+
+	/* we've delayed this part of the initialization so that mbox format
+	   can override the index root directory path */
+	if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX,
+					&dir)) {
+		/* in-memory indexes */
+		dir = NULL;
+	}
+	i_assert(ilist->has_backing_store || dir != NULL);
 
 	ilist->path = dir == NULL ? "(in-memory mailbox list index)" :
 		p_strdup_printf(list->pool, "%s/"MAILBOX_LIST_INDEX_PREFIX, dir);
@@ -587,7 +600,16 @@
 	hash_table_create_direct(&ilist->mailbox_names, ilist->mailbox_pool, 0);
 	hash_table_create_direct(&ilist->mailbox_hash, ilist->mailbox_pool, 0);
 
-	mailbox_list_index_status_init_list(list);
+	mailbox_list_index_status_init_finish(list);
+}
+
+static void
+mailbox_list_index_namespaces_created(struct mail_namespace *namespaces)
+{
+	struct mail_namespace *ns;
+
+	for (ns = namespaces; ns != NULL; ns = ns->next)
+		mailbox_list_index_init_finish(ns->list);
 }
 
 static void mailbox_list_index_mailbox_allocated(struct mailbox *box)
@@ -612,6 +634,7 @@
 
 static struct mail_storage_hooks mailbox_list_index_hooks = {
 	.mailbox_list_created = mailbox_list_index_created,
+	.mail_namespaces_created = mailbox_list_index_namespaces_created,
 	.mailbox_allocated = mailbox_list_index_mailbox_allocated
 };
 
diff -r 808a64899e8a -r f703e1fd7c21 src/lib-storage/list/mailbox-list-index.h
--- a/src/lib-storage/list/mailbox-list-index.h	Wed Feb 20 16:03:53 2013 +0200
+++ b/src/lib-storage/list/mailbox-list-index.h	Wed Feb 20 16:49:14 2013 +0200
@@ -105,6 +105,7 @@
 	HASH_TABLE(void *, struct mailbox_list_index_node *) mailbox_hash;
 	struct mailbox_list_index_node *mailbox_tree;
 
+	unsigned int pending_init:1;
 	unsigned int opened:1;
 	unsigned int syncing:1;
 	unsigned int updating_status:1;
@@ -181,6 +182,6 @@
 
 void mailbox_list_index_status_init_mailbox(struct mailbox *box);
 void mailbox_list_index_backend_init_mailbox(struct mailbox *box);
-void mailbox_list_index_status_init_list(struct mailbox_list *list);
+void mailbox_list_index_status_init_finish(struct mailbox_list *list);
 
 #endif


More information about the dovecot-cvs mailing list