From 16c28dd75976f94acc4940d6ba68b6cd4853aac7 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 6 Oct 2010 18:18:30 +0100 Subject: [PATCH] lib-index: Cache offsets were sometimes written pointing to an older cache file. --- src/lib-index/mail-cache-transaction.c | 3 ++ .../mail-index-transaction-private.h | 3 ++ src/lib-index/mail-index-transaction-update.c | 30 ++++++++++++++++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/lib-index/mail-cache-transaction.c b/src/lib-index/mail-cache-transaction.c index 149724504a..d560e3d092 100644 --- a/src/lib-index/mail-cache-transaction.c +++ b/src/lib-index/mail-cache-transaction.c @@ -619,6 +619,9 @@ mail_cache_transaction_update_index(struct mail_cache_transaction_ctx *ctx, struct mail_cache *cache = ctx->cache; uint32_t i, old_offset, orig_write_offset; + mail_index_ext_using_reset_id(ctx->trans, ctx->cache->ext_id, + ctx->cache_file_seq); + /* write the cache_offsets to index file. records' prev_offset is updated to point to old cache record when index is being synced. */ diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index 1e54ba6199..c8a89e5583 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -137,4 +137,7 @@ mail_index_transaction_get_flag_update_pos(struct mail_index_transaction *t, unsigned int right_idx, uint32_t seq); +bool mail_index_ext_using_reset_id(struct mail_index_transaction *t, + uint32_t ext_id, uint32_t reset_id); + #endif diff --git a/src/lib-index/mail-index-transaction-update.c b/src/lib-index/mail-index-transaction-update.c index 02afedff6d..98b5f2615f 100644 --- a/src/lib-index/mail-index-transaction-update.c +++ b/src/lib-index/mail-index-transaction-update.c @@ -807,8 +807,8 @@ mail_index_ext_update_reset(ARRAY_TYPE(seq_array_array) *arr, uint32_t ext_id) } } -void mail_index_ext_set_reset_id(struct mail_index_transaction *t, - uint32_t ext_id, uint32_t reset_id) +static void +mail_index_ext_reset_changes(struct mail_index_transaction *t, uint32_t ext_id) { mail_index_ext_update_reset(&t->ext_rec_updates, ext_id); mail_index_ext_update_reset(&t->ext_rec_atomics, ext_id); @@ -835,11 +835,33 @@ void mail_index_ext_set_reset_id(struct mail_index_transaction *t, array_idx_clear(&t->ext_resizes, ext_id); } + t->log_ext_updates = mail_index_transaction_has_ext_changes(t); +} + +bool mail_index_ext_using_reset_id(struct mail_index_transaction *t, + uint32_t ext_id, uint32_t reset_id) +{ + uint32_t *reset_id_p; + bool changed; + if (!array_is_created(&t->ext_reset_ids)) i_array_init(&t->ext_reset_ids, ext_id + 2); - array_idx_set(&t->ext_reset_ids, ext_id, &reset_id); + reset_id_p = array_idx_modifiable(&t->ext_reset_ids, ext_id); + changed = *reset_id_p != reset_id && *reset_id_p != 0; + *reset_id_p = reset_id; + if (changed) { + /* reset_id changed, clear existing changes */ + mail_index_ext_reset_changes(t, ext_id); + } + return changed; +} - t->log_ext_updates = mail_index_transaction_has_ext_changes(t); +void mail_index_ext_set_reset_id(struct mail_index_transaction *t, + uint32_t ext_id, uint32_t reset_id) +{ + mail_index_ext_using_reset_id(t, ext_id, reset_id); + /* make sure the changes get reset, even if reset_id doesn't change */ + mail_index_ext_reset_changes(t, ext_id); } void mail_index_update_header_ext(struct mail_index_transaction *t, -- 2.47.3