From: Timo Sirainen Date: Sun, 20 Jun 2004 12:23:27 +0000 (+0300) Subject: Index syncing fixes. X-Git-Tag: 1.1.alpha1~3897 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ea546eaab672d441e180b7619d4750be813c08d8;p=thirdparty%2Fdovecot%2Fcore.git Index syncing fixes. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-sync-update.c b/src/lib-index/mail-index-sync-update.c index 48fabe351a..84792bc02a 100644 --- a/src/lib-index/mail-index-sync-update.c +++ b/src/lib-index/mail-index-sync-update.c @@ -250,6 +250,7 @@ sync_extra_rec_update(const struct mail_transaction_extra_rec_header *hdr, static int mail_index_grow(struct mail_index *index, struct mail_index_map *map, unsigned int count) { + struct mail_index_header hdr; size_t size; if (MAIL_INDEX_MAP_IS_IN_MEMORY(map)) @@ -274,9 +275,17 @@ static int mail_index_grow(struct mail_index *index, struct mail_index_map *map, if (file_set_size(index->fd, (off_t)size) < 0) return mail_index_set_syscall_error(index, "file_set_size()"); + /* we only wish to grow the file, but mail_index_map() updates the + headers as well and may break our modified hdr_copy. so, take + a backup of it and put it back afterwards */ + hdr = map->hdr_copy; + if (mail_index_map(index, TRUE) <= 0) return -1; + map->hdr_copy = hdr; + map->hdr = &map->hdr_copy; + i_assert(map->mmap_size >= size); return 0; } @@ -288,12 +297,12 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx) struct mail_index_map *map; const struct mail_transaction_header *hdr; const void *data; - unsigned int lock_id, count; + unsigned int count; uint32_t seq, i; uoff_t offset; int ret, had_dirty, skipped; - if (mail_index_lock_exclusive(index, &lock_id) < 0) + if (mail_index_lock_exclusive(index, &view->lock_id) < 0) return -1; /* NOTE: locking may change index->map so make sure assignment @@ -349,6 +358,9 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx) if (ret < 0) return -1; + i_assert(map->records_count == map->hdr->messages_count); + i_assert(view->messages_count == map->hdr->messages_count); + mail_transaction_log_get_head(index->log, &seq, &offset); map->hdr_copy.log_file_seq = seq; @@ -381,7 +393,7 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx) map->hdr = map->mmap_base; } - mail_index_unlock(index, lock_id); + mail_index_view_unlock(view); return ret; } diff --git a/src/lib-index/mail-index-view.c b/src/lib-index/mail-index-view.c index 9d1fdd441d..3d8fc5d924 100644 --- a/src/lib-index/mail-index-view.c +++ b/src/lib-index/mail-index-view.c @@ -51,6 +51,9 @@ int mail_index_view_lock_head(struct mail_index_view *view, int update_index) { unsigned int lock_id; + if (MAIL_INDEX_MAP_IS_IN_MEMORY(view->index->map)) + return 0; + if (!mail_index_is_locked(view->index, view->lock_id)) { if (mail_index_lock_shared(view->index, update_index, &view->lock_id) < 0) diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index ff0cb25d9e..3093020df7 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -412,7 +412,6 @@ int mail_index_map(struct mail_index *index, int force) struct mail_index_map * mail_index_map_to_memory(struct mail_index *index, struct mail_index_map *map) { - const struct mail_index_header *hdr; struct mail_index_map *mem_map; size_t size; @@ -431,9 +430,7 @@ mail_index_map_to_memory(struct mail_index *index, struct mail_index_map *map) mem_map->records = buffer_get_modifyable_data(mem_map->buffer, NULL); mem_map->records_count = map->records_count; - hdr = map->mmap_base; - memcpy(&mem_map->hdr_copy, map->mmap_base, - I_MIN(hdr->base_header_size, sizeof(mem_map->hdr_copy))); + mem_map->hdr_copy = *map->hdr; mem_map->hdr = &mem_map->hdr_copy; return mem_map; }