Mercurial > dovecot > core-2.2
changeset 10975:52d9b2d8c1e8 HEAD
mdbox: Do delayed storage rebuild when closing mailbox.
Doing it on storage destroy causes problems.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 23 Mar 2010 20:11:07 +0200 |
parents | 841bfacb7ec3 |
children | f6c2c0866aff |
files | src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c src/lib-storage/index/dbox-multi/mdbox-storage.c src/lib-storage/index/dbox-multi/mdbox-storage.h |
diffstat | 3 files changed, 21 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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,
--- 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 {