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