dovecot-2.1: mailbox_list_index=yes: Delay opening/creating the ...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Mar 14 15:34:24 EET 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/0274c4132052
changeset: 14306: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