dovecot-2.0: mdbox: Do delayed storage rebuild when closing mail...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Mar 23 20:11:11 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/52d9b2d8c1e8
changeset: 10975:52d9b2d8c1e8
user: Timo Sirainen <tss at iki.fi>
date: Tue Mar 23 20:11:07 2010 +0200
description:
mdbox: Do delayed storage rebuild when closing mailbox.
Doing it on storage destroy causes problems.
diffstat:
src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c | 7 +++++++
src/lib-storage/index/dbox-multi/mdbox-storage.c | 18 ++++++++++++------
src/lib-storage/index/dbox-multi/mdbox-storage.h | 2 ++
3 files changed, 21 insertions(+), 6 deletions(-)
diffs (83 lines):
diff -r 841bfacb7ec3 -r 52d9b2d8c1e8 src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c
--- a/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c Tue Mar 23 19:36:22 2010 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c Tue Mar 23 20:11:07 2010 +0200
@@ -81,18 +81,25 @@
{
struct mdbox_storage_rebuild_context *ctx;
+ i_assert(!storage->rebuilding_storage);
+
ctx = i_new(struct mdbox_storage_rebuild_context, 1);
ctx->storage = storage;
ctx->pool = pool_alloconly_create("dbox map rebuild", 1024*256);
ctx->guid_hash = hash_table_create(default_pool, ctx->pool, 0,
guid_hash, guid_cmp);
i_array_init(&ctx->msgs, 512);
+
+ ctx->storage->rebuilding_storage = TRUE;
return ctx;
}
static void
mdbox_storage_rebuild_deinit(struct mdbox_storage_rebuild_context *ctx)
{
+ i_assert(ctx->storage->rebuilding_storage);
+
+ ctx->storage->rebuilding_storage = FALSE;
if (ctx->sync_ctx != NULL)
mail_index_sync_rollback(&ctx->sync_ctx);
diff -r 841bfacb7ec3 -r 52d9b2d8c1e8 src/lib-storage/index/dbox-multi/mdbox-storage.c
--- a/src/lib-storage/index/dbox-multi/mdbox-storage.c Tue Mar 23 19:36:22 2010 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c Tue Mar 23 20:11:07 2010 +0200
@@ -65,11 +65,6 @@
{
struct mdbox_storage *storage = (struct mdbox_storage *)_storage;
- if (storage->storage.files_corrupted) {
- if (mdbox_storage_rebuild(storage) < 0)
- return;
- }
-
mdbox_files_free(storage);
dbox_map_deinit(&storage->map);
if (storage->to_close_unused_files != NULL)
@@ -122,6 +117,17 @@
return &mbox->box;
}
+static void mdbox_mailbox_close(struct mailbox *box)
+{
+ struct mdbox_storage *mstorage = (struct mdbox_storage *)box->storage;
+
+ if (mstorage->storage.files_corrupted &&
+ !mstorage->rebuilding_storage)
+ (void)mdbox_storage_rebuild(mstorage);
+
+ index_storage_mailbox_close(box);
+}
+
int mdbox_read_header(struct mdbox_mailbox *mbox,
struct mdbox_index_header *hdr)
{
@@ -333,7 +339,7 @@
index_storage_allow_new_keywords,
index_storage_mailbox_enable,
dbox_mailbox_open,
- index_storage_mailbox_close,
+ mdbox_mailbox_close,
index_storage_mailbox_free,
dbox_mailbox_create,
mdbox_mailbox_update,
diff -r 841bfacb7ec3 -r 52d9b2d8c1e8 src/lib-storage/index/dbox-multi/mdbox-storage.h
--- a/src/lib-storage/index/dbox-multi/mdbox-storage.h Tue Mar 23 19:36:22 2010 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage.h Tue Mar 23 20:11:07 2010 +0200
@@ -31,6 +31,8 @@
ARRAY_DEFINE(open_files, struct mdbox_file *);
struct timeout *to_close_unused_files;
+
+ unsigned int rebuilding_storage:1;
};
struct mdbox_mail_index_record {
More information about the dovecot-cvs
mailing list