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