dovecot-2.0-sslstream: lib-index: Don't close index files if the...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Feb 13 03:00:58 EET 2010
details: http://hg.dovecot.org/dovecot-2.0-sslstream/rev/93fe3aa23bdb
changeset: 10678:93fe3aa23bdb
user: Timo Sirainen <tss at iki.fi>
date: Tue Feb 09 04:52:29 2010 +0200
description:
lib-index: Don't close index files if they're still being used by another mailbox.
diffstat:
5 files changed, 17 insertions(+), 15 deletions(-)
src/lib-index/mail-index-private.h | 2 -
src/lib-index/mail-index.c | 24 +++++++----------
src/lib-storage/index/dbox-common/dbox-sync-rebuild.c | 1
src/lib-storage/index/dbox-multi/mdbox-map.c | 4 ++
src/lib-storage/index/index-storage.c | 1
diffs (125 lines):
diff -r 1fd7833c16ca -r 93fe3aa23bdb src/lib-index/mail-index-private.h
--- a/src/lib-index/mail-index-private.h Tue Feb 09 04:11:53 2010 +0200
+++ b/src/lib-index/mail-index-private.h Tue Feb 09 04:52:29 2010 +0200
@@ -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 -r 1fd7833c16ca -r 93fe3aa23bdb src/lib-index/mail-index.c
--- a/src/lib-index/mail-index.c Tue Feb 09 04:11:53 2010 +0200
+++ b/src/lib-index/mail-index.c Tue Feb 09 04:52:29 2010 +0200
@@ -63,7 +63,8 @@ void mail_index_free(struct mail_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 *i
{
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 *i
(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 *i
}
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_i
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
i_free_and_null(index->filepath);
index->indexid = 0;
- index->opened = FALSE;
}
int mail_index_unlink(struct mail_index *index)
diff -r 1fd7833c16ca -r 93fe3aa23bdb src/lib-storage/index/dbox-common/dbox-sync-rebuild.c
--- a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c Tue Feb 09 04:11:53 2010 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c Tue Feb 09 04:52:29 2010 +0200
@@ -125,6 +125,7 @@ void dbox_sync_index_rebuild_deinit(stru
*_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 -r 1fd7833c16ca -r 93fe3aa23bdb src/lib-storage/index/dbox-multi/mdbox-map.c
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c Tue Feb 09 04:11:53 2010 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c Tue Feb 09 04:52:29 2010 +0200
@@ -78,8 +78,10 @@ void dbox_map_deinit(struct dbox_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 -r 1fd7833c16ca -r 93fe3aa23bdb src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c Tue Feb 09 04:11:53 2010 +0200
+++ b/src/lib-storage/index/index-storage.c Tue Feb 09 04:52:29 2010 +0200
@@ -221,6 +221,7 @@ int index_storage_mailbox_open(struct ma
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;
}
More information about the dovecot-cvs
mailing list