dovecot-1.2: Maildir: Re-read uidlist from the beginning before ...

dovecot at dovecot.org dovecot at dovecot.org
Sun Oct 19 14:38:13 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/d3b37327936e
changeset: 8303:d3b37327936e
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Oct 19 14:38:09 2008 +0300
description:
Maildir: Re-read uidlist from the beginning before deciding it's corrupted.

diffstat:

1 file changed, 22 insertions(+), 6 deletions(-)
src/lib-storage/index/maildir/maildir-uidlist.c |   28 ++++++++++++++++++-----

diffs (75 lines):

diff -r 0db37acdc59f -r d3b37327936e src/lib-storage/index/maildir/maildir-uidlist.c
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Oct 19 14:00:57 2008 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Oct 19 14:38:09 2008 +0300
@@ -90,6 +90,7 @@ struct maildir_uidlist {
 	unsigned int initial_read:1;
 	unsigned int initial_hdr_read:1;
 	unsigned int initial_sync:1;
+	unsigned int retry_rewind:1;
 };
 
 struct maildir_uidlist_sync_ctx {
@@ -305,9 +306,17 @@ maildir_uidlist_set_corrupted(struct mai
 	va_list args;
 
 	va_start(args, fmt);
-	mail_storage_set_critical(storage, "Broken file %s line %u: %s",
-				  uidlist->path, uidlist->read_line_count,
-				  t_strdup_vprintf(fmt, args));
+	if (uidlist->retry_rewind) {
+		mail_storage_set_critical(storage,
+			"Broken or unexpectedly changed file %s "
+			"line %u: %s - re-reading from beginning",
+			uidlist->path, uidlist->read_line_count,
+			t_strdup_vprintf(fmt, args));
+	} else {
+		mail_storage_set_critical(storage, "Broken file %s line %u: %s",
+			uidlist->path, uidlist->read_line_count,
+			t_strdup_vprintf(fmt, args));
+	}
 	va_end(args);
 }
 
@@ -405,7 +414,7 @@ static bool maildir_uidlist_next(struct 
 	}
 	if (uid <= uidlist->prev_read_uid) {
 		maildir_uidlist_set_corrupted(uidlist, 
-					      "UIDs not ordered (%u > %u)",
+					      "UIDs not ordered (%u >= %u)",
 					      uid, uidlist->prev_read_uid);
 		return FALSE;
 	}
@@ -627,16 +636,23 @@ maildir_uidlist_update_read(struct maild
 		uidlist->prev_read_uid = 0;
 		uidlist->change_counter++;
 		uidlist->read_records_count = 0;
+		uidlist->retry_rewind = last_read_offset != 0 && try_retry;
 
 		ret = 1;
 		while ((line = i_stream_read_next_line(input)) != NULL) {
 			uidlist->read_records_count++;
 			uidlist->read_line_count++;
 			if (!maildir_uidlist_next(uidlist, line)) {
-				ret = 0;
+				if (!uidlist->retry_rewind)
+					ret = 0;
+				else {
+					ret = -1;
+					*retry_r = TRUE;
+				}
 				break;
 			}
                 }
+		uidlist->retry_rewind = FALSE;
 		if (input->stream_errno != 0)
                         ret = -1;
 
@@ -663,7 +679,7 @@ maildir_uidlist_update_read(struct maild
 		uidlist->fd_size = st.st_size;
 		uidlist->last_read_offset = input->v_offset;
 		maildir_uidlist_update_hdr(uidlist, &st);
-        } else {
+        } else if (!*retry_r) {
                 /* I/O error */
                 if (input->stream_errno == ESTALE && try_retry)
 			*retry_r = TRUE;


More information about the dovecot-cvs mailing list