changeset 2565:e14c2a36a0a2 HEAD

"UIDs not ordered in file" errors could have occured sometimes wrongly.
author Timo Sirainen <tss@iki.fi>
date Sun, 05 Sep 2004 23:02:00 +0300
parents 15be925bd1c8
children db11e7936888
files src/lib-storage/index/maildir/maildir-uidlist.c
diffstat 1 files changed, 13 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Sep 05 21:37:17 2004 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Sep 05 23:02:00 2004 +0300
@@ -40,7 +40,7 @@
 	struct hash_table *files;
 
 	unsigned int version;
-	unsigned int uid_validity, next_uid, last_read_uid;
+	unsigned int uid_validity, next_uid, prev_read_uid, last_seen_uid;
 	uint32_t first_recent_uid;
 
 	unsigned int initial_read:1;
@@ -164,7 +164,7 @@
 }
 
 static int maildir_uidlist_next(struct maildir_uidlist *uidlist,
-				const char *line, uint32_t last_uid)
+				const char *line)
 {
         struct maildir_uidlist_rec *rec;
 	uint32_t uid, flags;
@@ -175,24 +175,25 @@
 		line++;
 	}
 
-	if (uid <= last_uid) {
-		/* we already have this */
-		return 1;
-	}
-
 	if (uid == 0 || *line != ' ') {
 		/* invalid file */
                 mail_storage_set_critical(uidlist->ibox->box.storage,
 			"Invalid data in file %s", uidlist->fname);
 		return 0;
 	}
-	if (uid <= uidlist->last_read_uid) {
+	if (uid <= uidlist->prev_read_uid) {
                 mail_storage_set_critical(uidlist->ibox->box.storage,
 			"UIDs not ordered in file %s (%u > %u)",
-			uidlist->fname, uid, uidlist->last_read_uid);
+			uidlist->fname, uid, uidlist->prev_read_uid);
 		return 0;
 	}
-	uidlist->last_read_uid = uid;
+	uidlist->prev_read_uid = uid;
+
+	if (uid <= uidlist->last_seen_uid) {
+		/* we already have this */
+		return 1;
+	}
+        uidlist->last_seen_uid = uid;
 
 	if (uid >= uidlist->next_uid) {
                 mail_storage_set_critical(uidlist->ibox->box.storage,
@@ -228,13 +229,10 @@
 int maildir_uidlist_update(struct maildir_uidlist *uidlist)
 {
 	struct mail_storage *storage = uidlist->ibox->box.storage;
-	const struct maildir_uidlist_rec *const *rec_p;
 	const char *line;
 	unsigned int uid_validity, next_uid;
 	struct istream *input;
 	struct stat st;
-	uint32_t last_uid;
-	size_t size;
 	int fd, ret;
 
 	if (uidlist->last_mtime != 0) {
@@ -277,9 +275,6 @@
 							    st.st_size/8));
 	}
 
-	rec_p = buffer_get_data(uidlist->record_buf, &size);
-	last_uid = size == 0 ? 0 : rec_p[(size / sizeof(*rec_p))-1]->uid;
-
 	uidlist->version = 0;
 
 	input = i_stream_create_file(fd, default_pool, 4096, TRUE);
@@ -303,10 +298,11 @@
 	} else {
 		uidlist->uid_validity = uid_validity;
 		uidlist->next_uid = next_uid;
+		uidlist->prev_read_uid = 0;
 
 		ret = 1;
 		while ((line = i_stream_read_next_line(input)) != NULL) {
-			if (!maildir_uidlist_next(uidlist, line, last_uid)) {
+			if (!maildir_uidlist_next(uidlist, line)) {
 				ret = 0;
 				break;
 			}