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