changeset 12250:d0ddc30f0eef

lib-index: Cache offsets were sometimes written pointing to an older cache file.
author Timo Sirainen <tss@iki.fi>
date Wed, 06 Oct 2010 18:18:30 +0100
parents 41e99ee5c1dd
children ab2222fd3f5d
files src/lib-index/mail-cache-transaction.c src/lib-index/mail-index-transaction-private.h src/lib-index/mail-index-transaction-update.c
diffstat 3 files changed, 32 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-cache-transaction.c	Wed Oct 06 17:15:51 2010 +0100
+++ b/src/lib-index/mail-cache-transaction.c	Wed Oct 06 18:18:30 2010 +0100
@@ -619,6 +619,9 @@
 	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. */
--- a/src/lib-index/mail-index-transaction-private.h	Wed Oct 06 17:15:51 2010 +0100
+++ b/src/lib-index/mail-index-transaction-private.h	Wed Oct 06 18:18:30 2010 +0100
@@ -137,4 +137,7 @@
 					   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
--- a/src/lib-index/mail-index-transaction-update.c	Wed Oct 06 17:15:51 2010 +0100
+++ b/src/lib-index/mail-index-transaction-update.c	Wed Oct 06 18:18:30 2010 +0100
@@ -807,8 +807,8 @@
 	}
 }
 
-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 @@
 		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,