From: Timo Sirainen Date: Tue, 9 Feb 2010 02:52:29 +0000 (+0200) Subject: lib-index: Don't close index files if they're still being used by another mailbox. X-Git-Tag: 2.0.beta3~121 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9f32b9444d2a6db8f556d2c49ffceab1a59791ff;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Don't close index files if they're still being used by another mailbox. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index 5f742e62f1..a03c14393c 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -170,6 +170,7 @@ struct mail_index { struct mail_cache *cache; struct mail_transaction_log *log; + unsigned int open_count; enum mail_index_open_flags flags; enum mail_index_sync_type fsync_mask; mode_t mode; @@ -225,7 +226,6 @@ struct mail_index { unsigned int nodiskspace:1; unsigned int index_lock_timeout:1; - unsigned int opened:1; unsigned int index_delete_requested:1; /* next sync sets it deleted */ unsigned int index_deleted:1; /* no changes allowed anymore */ unsigned int log_locked:1; diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 97b6118c82..0054abf991 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -63,7 +63,8 @@ void mail_index_free(struct mail_index **_index) struct mail_index *index = *_index; *_index = NULL; - mail_index_close(index); + + i_assert(index->open_count == 0); mail_transaction_log_free(&index->log); hash_table_destroy(&index->keywords_hash); @@ -484,16 +485,10 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags, { int ret; - if (index->opened) { - if (index->map != NULL && - (index->map->hdr.flags & - MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) { - /* corrupted, reopen files */ - mail_index_close(index); - } else { - i_assert(index->map != NULL); - return 1; - } + if (index->open_count > 0) { + i_assert(index->map != NULL); + index->open_count++; + return 1; } index->filepath = MAIL_INDEX_IS_IN_MEMORY(index) ? @@ -520,6 +515,7 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags, (flags & MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE) == 0) i_fatal("nfs flush requires mmap_disable=yes"); + index->open_count++; if ((ret = mail_index_open_files(index, flags)) <= 0) { /* doesn't exist and create flag not used */ mail_index_close(index); @@ -527,7 +523,6 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags, } i_assert(index->map != NULL); - index->opened = TRUE; mail_index_alloc_cache_index_opened(index); return 1; } @@ -563,6 +558,10 @@ void mail_index_close_file(struct mail_index *index) void mail_index_close(struct mail_index *index) { + i_assert(index->open_count > 0); + if (--index->open_count > 0) + return; + if (index->map != NULL) mail_index_unmap(&index->map); @@ -574,7 +573,6 @@ void mail_index_close(struct mail_index *index) i_free_and_null(index->filepath); index->indexid = 0; - index->opened = FALSE; } int mail_index_unlink(struct mail_index *index) diff --git a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c index 7848956719..fa7fb9ca13 100644 --- a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c +++ b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c @@ -125,6 +125,7 @@ void dbox_sync_index_rebuild_deinit(struct dbox_sync_rebuild_context **_ctx) *_ctx = NULL; if (ctx->backup_index != NULL) { mail_index_view_close(&ctx->backup_view); + mail_index_close(ctx->backup_index); mail_index_free(&ctx->backup_index); } i_free(ctx); diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.c b/src/lib-storage/index/dbox-multi/mdbox-map.c index cb521bc34d..6f5226baa0 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.c +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c @@ -78,8 +78,10 @@ void dbox_map_deinit(struct dbox_map **_map) *_map = NULL; - if (map->view != NULL) + if (map->view != NULL) { mail_index_view_close(&map->view); + mail_index_close(map->index); + } mail_index_free(&map->index); i_free(map->path); i_free(map); diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 7ef313577a..ac0777dd9f 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -221,6 +221,7 @@ int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory) ret = mail_index_open(box->index, index_flags, lock_method); if (ret <= 0 || move_to_memory) { if ((index_flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0) { + i_assert(ret <= 0); mail_storage_set_index_error(box); return -1; }