]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Cache offsets were sometimes written pointing to an older cache file.
authorTimo Sirainen <tss@iki.fi>
Wed, 6 Oct 2010 17:18:30 +0000 (18:18 +0100)
committerTimo Sirainen <tss@iki.fi>
Wed, 6 Oct 2010 17:18:30 +0000 (18:18 +0100)
src/lib-index/mail-cache-transaction.c
src/lib-index/mail-index-transaction-private.h
src/lib-index/mail-index-transaction-update.c

index 149724504afb01101a2fd1a08ce0c5b85cadef2c..d560e3d092eb3f62c444791d3c6cb9734e7bde31 100644 (file)
@@ -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. */
index 1e54ba6199257bc10dd0832dbed846692ebc38e8..c8a89e5583a3e010661cae46fc43fe1526de94de 100644 (file)
@@ -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
index 02afedff6dc67dd1d3c641d48418c75b32f178e4..98b5f2615ffbe84d37f579aa622f97695b9173a0 100644 (file)
@@ -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,