dovecot-1.1: Fixes to handling recent flags with UIDVALIDITY cha...

dovecot at dovecot.org dovecot at dovecot.org
Fri Apr 25 02:10:39 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/4dc5542f58aa
changeset: 7464:4dc5542f58aa
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Apr 25 02:10:36 2008 +0300
description:
Fixes to handling recent flags with UIDVALIDITY changing.

diffstat:

2 files changed, 11 insertions(+), 2 deletions(-)
src/lib-storage/index/index-sync.c                 |    3 ++-
src/lib-storage/index/maildir/maildir-sync-index.c |   10 +++++++++-

diffs (55 lines):

diff -r d1bd08d468d0 -r 4dc5542f58aa src/lib-storage/index/index-sync.c
--- a/src/lib-storage/index/index-sync.c	Fri Apr 25 01:49:39 2008 +0300
+++ b/src/lib-storage/index/index-sync.c	Fri Apr 25 02:10:36 2008 +0300
@@ -66,7 +66,8 @@ void index_mailbox_reset_uidvalidity(str
 void index_mailbox_reset_uidvalidity(struct index_mailbox *ibox)
 {
 	/* can't trust the currently cached recent flags anymore */
-	array_clear(&ibox->recent_flags);
+	if (array_is_created(&ibox->recent_flags))
+		array_clear(&ibox->recent_flags);
 	ibox->recent_flags_count = 0;
 	ibox->recent_flags_prev_uid = 0;
 }
diff -r d1bd08d468d0 -r 4dc5542f58aa src/lib-storage/index/maildir/maildir-sync-index.c
--- a/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Apr 25 01:49:39 2008 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Apr 25 02:10:36 2008 +0300
@@ -272,6 +272,7 @@ int maildir_sync_index(struct maildir_in
 	const char *filename;
 	ARRAY_TYPE(keyword_indexes) idx_keywords;
 	uint32_t uid_validity, next_uid, hdr_next_uid, first_recent_uid;
+	uint32_t first_uid;
 	unsigned int changes = 0;
 	int ret = 0;
 	bool expunged, full_rescan = FALSE;
@@ -279,6 +280,7 @@ int maildir_sync_index(struct maildir_in
 	i_assert(!mbox->syncing_commit);
 	i_assert(maildir_uidlist_is_locked(mbox->uidlist));
 
+	first_uid = 1;
 	hdr = mail_index_get_header(view);
 	uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist);
 	if (uid_validity != hdr->uid_validity &&
@@ -292,6 +294,7 @@ int maildir_sync_index(struct maildir_in
 		index_mailbox_reset_uidvalidity(&mbox->ibox);
 		maildir_uidlist_set_next_uid(mbox->uidlist, 1, TRUE);
 
+		first_uid = hdr->messages_count + 1;
 		memset(&empty_hdr, 0, sizeof(empty_hdr));
 		empty_hdr.next_uid = 1;
 		hdr = &empty_hdr;
@@ -439,8 +442,13 @@ int maildir_sync_index(struct maildir_in
 	   appended messages. */
 	view2 = mail_index_transaction_open_updated_view(trans);
 	if (mail_index_lookup_seq_range(view2, first_recent_uid, (uint32_t)-1,
-					&seq, &seq2))
+					&seq, &seq2) && seq2 >= first_uid) {
+		if (seq < first_uid) {
+			/* UIDVALIDITY changed, skip over the old messages */
+			seq = first_uid;
+		}
 		index_mailbox_set_recent_seq(&mbox->ibox, view2, seq, seq2);
+	}
 	mail_index_view_close(&view2);
 
 	if (ctx->uidlist_sync_ctx != NULL) {


More information about the dovecot-cvs mailing list