[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-sync.c, 1.52, 1.53

cras at dovecot.org cras at dovecot.org
Sat Apr 23 18:18:24 EEST 2005


Update of /var/lib/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv28538/lib-storage/index/maildir

Modified Files:
	maildir-sync.c 
Log Message:
If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
existing messages and update uidvalidity/nextuid fields. Now we don't have
to re-login when this happens.



Index: maildir-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- maildir-sync.c	8 Apr 2005 14:32:51 -0000	1.52
+++ maildir-sync.c	23 Apr 2005 15:18:22 -0000	1.53
@@ -603,6 +603,7 @@
 	struct maildir_uidlist_iter_ctx *iter;
 	struct mail_index_transaction *trans;
 	const struct mail_index_header *hdr;
+	struct mail_index_header tmp_hdr;
 	const struct mail_index_record *rec;
 	pool_t keyword_pool;
 	uint32_t seq, uid;
@@ -613,22 +614,33 @@
 	uint32_t uid_validity, next_uid;
 	int ret;
 
+	trans = mail_index_transaction_begin(view, FALSE, TRUE);
+	sync_ctx->trans = trans;
+
 	hdr = mail_index_get_header(view);
 	uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist);
 	if (uid_validity != hdr->uid_validity &&
 	    uid_validity != 0 && hdr->uid_validity != 0) {
 		/* uidvalidity changed and mailbox isn't being initialized,
-		   index must be rebuilt */
+		   reset mailbox so we can add all messages as new */
 		mail_storage_set_critical(STORAGE(mbox->storage),
 			"Maildir %s sync: UIDVALIDITY changed (%u -> %u)",
 			mbox->path, hdr->uid_validity, uid_validity);
-		mail_index_mark_corrupted(mbox->ibox.index);
-                maildir_sync_index_abort(sync_ctx);
-		return -1;
-	}
 
-	trans = mail_index_transaction_begin(view, FALSE, TRUE);
-	sync_ctx->trans = trans;
+		for (seq = 1; seq < hdr->messages_count; seq++)
+			mail_index_expunge(trans, seq);
+
+		/* Reset uidvalidity and next_uid. */
+		memcpy(&tmp_hdr, hdr, sizeof(tmp_hdr));
+		tmp_hdr.uid_validity = 0;
+		tmp_hdr.next_uid = 0;
+
+		/* next_uid must be reset before message syncing begins,
+		   or we get errors about UIDs larger than next_uid. */
+		mail_index_update_header(trans,
+			offsetof(struct mail_index_header, next_uid),
+			&hdr->next_uid, sizeof(hdr->next_uid), TRUE);
+	}
 
 	keyword_pool = pool_alloconly_create("maildir keywords", 128);
 
@@ -801,7 +813,7 @@
 
 		mail_index_update_header(trans,
 			offsetof(struct mail_index_header, sync_stamp),
-			&sync_stamp, sizeof(sync_stamp));
+			&sync_stamp, sizeof(sync_stamp), TRUE);
 	}
 
 	if (hdr->uid_validity == 0) {
@@ -822,14 +834,14 @@
 	if (uid_validity != hdr->uid_validity && uid_validity != 0) {
 		mail_index_update_header(trans,
 			offsetof(struct mail_index_header, uid_validity),
-			&uid_validity, sizeof(uid_validity));
+			&uid_validity, sizeof(uid_validity), TRUE);
 	}
 
 	next_uid = maildir_uidlist_get_next_uid(mbox->uidlist);
 	if (next_uid != 0 && hdr->next_uid != next_uid) {
 		mail_index_update_header(trans,
 			offsetof(struct mail_index_header, next_uid),
-			&next_uid, sizeof(next_uid));
+			&next_uid, sizeof(next_uid), FALSE);
 	}
 
 	if (ret < 0) {



More information about the dovecot-cvs mailing list