changeset 22424:b3241e996368

lib-index: Update per-flag modseq value a bit more correctly. This changes the code to be similar to the per-mail modseq updating in mail_index_modseq_update(). It probably wasn't exactly wrong previously either, but this change is required for the following commits.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sat, 05 Aug 2017 14:29:12 +0900
parents 59468efbfc43
children 8da4a17e2b26
files src/lib-index/mail-index-modseq.c
diffstat 1 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-modseq.c	Sat Aug 05 14:16:31 2017 +0900
+++ b/src/lib-index/mail-index-modseq.c	Sat Aug 05 14:29:12 2017 +0900
@@ -581,8 +581,13 @@
 modseqs_update(ARRAY_TYPE(modseqs) *array, uint32_t seq1, uint32_t seq2,
 	       uint64_t value)
 {
-	for (; seq1 <= seq2; seq1++)
-		array_idx_set(array, seq1-1, &value);
+	uint64_t *modseqp;
+
+	for (; seq1 <= seq2; seq1++) {
+		modseqp = array_idx_modifiable(array, seq1-1);
+		if (*modseqp < value)
+			*modseqp = value;
+	}
 }
 
 static void
@@ -590,6 +595,7 @@
 		   uint32_t seq1, uint32_t seq2)
 {
 	struct metadata_modseqs *metadata;
+	uint64_t modseq;
 
 	if (!ctx->view->index->modseqs_enabled) {
 		/* we want to keep permanent modseqs updated, but don't bother
@@ -597,10 +603,11 @@
 		return;
 	}
 
+	modseq = mail_transaction_log_view_get_prev_modseq(ctx->log_view);
 	metadata = array_idx_modifiable(&ctx->mmap->metadata_modseqs, idx);
 	if (!array_is_created(&metadata->modseqs))
 		i_array_init(&metadata->modseqs, seq2 + 16);
-	modseqs_update(&metadata->modseqs, seq1, seq2, ctx->highest_modseq);
+	modseqs_update(&metadata->modseqs, seq1, seq2, modseq);
 }
 
 void mail_index_modseq_update_flags(struct mail_index_modseq_sync *ctx,