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. */
}
}
-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);
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,