dovecot-2.0: dox: When checking dbox header in sync, make sure w...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jun 4 20:08:28 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/99a97c5c9912
changeset: 9444:99a97c5c9912
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jun 04 13:07:11 2009 -0400
description:
dox: When checking dbox header in sync, make sure we're using the latest index.

diffstat:

1 file changed, 24 insertions(+), 14 deletions(-)
src/lib-storage/index/dbox/dbox-sync.c |   38 ++++++++++++++++++++------------

diffs (73 lines):

diff -r 0bf92fe23dea -r 99a97c5c9912 src/lib-storage/index/dbox/dbox-sync.c
--- a/src/lib-storage/index/dbox/dbox-sync.c	Thu Jun 04 12:52:14 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-sync.c	Thu Jun 04 13:07:11 2009 -0400
@@ -199,29 +199,39 @@ static int dbox_sync_index(struct dbox_s
 	return ret;
 }
 
-static int dbox_refresh_header(struct dbox_mailbox *mbox)
-{
+static int dbox_refresh_header(struct dbox_mailbox *mbox, bool retry)
+{
+	struct mail_index_view *view;
 	const struct dbox_index_header *hdr;
 	const void *data;
 	size_t data_size;
-
-	mail_index_get_header_ext(mbox->ibox.view, mbox->dbox_hdr_ext_id,
+	int ret;
+
+	view = mail_index_view_open(mbox->ibox.index);
+	mail_index_get_header_ext(view, mbox->dbox_hdr_ext_id,
 				  &data, &data_size);
 	if (data_size != sizeof(*hdr)) {
+		if (retry) {
+			mail_index_view_close(&view);
+			(void)mail_index_refresh(mbox->ibox.index);
+			return dbox_refresh_header(mbox, FALSE);
+		}
+
 		/* data_size=0 means it's never been synced as dbox.
 		   data_size=4 is for backwards compatibility */
 		if (data_size != 0 && data_size != 4) {
 			i_warning("dbox %s: Invalid dbox header size",
 				  mbox->path);
 		}
-		return -1;
-	}
-	hdr = data;
-
-	mbox->highest_maildir_uid = hdr->highest_maildir_uid;
-	if (mbox->storage->sync_rebuild)
-		return -1;
-	return 0;
+		ret = -1;
+	} else {
+		hdr = data;
+
+		mbox->highest_maildir_uid = hdr->highest_maildir_uid;
+		ret = mbox->storage->sync_rebuild ? -1 : 0;
+	}
+	mail_index_view_close(&view);
+	return ret;
 }
 
 int dbox_sync_begin(struct dbox_mailbox *mbox, enum dbox_sync_flags flags,
@@ -234,7 +244,7 @@ int dbox_sync_begin(struct dbox_mailbox 
 	int ret;
 	bool rebuild, storage_rebuilt = FALSE;
 
-	rebuild = dbox_refresh_header(mbox) < 0 ||
+	rebuild = dbox_refresh_header(mbox, TRUE) < 0 ||
 		(flags & DBOX_SYNC_FLAG_FORCE_REBUILD) != 0;
 	if (rebuild) {
 		if (dbox_storage_rebuild(mbox->storage) < 0)
@@ -269,7 +279,7 @@ int dbox_sync_begin(struct dbox_mailbox 
 		}
 
 		/* now that we're locked, check again if we want to rebuild */
-		if (dbox_refresh_header(mbox) < 0)
+		if (dbox_refresh_header(mbox, FALSE) < 0)
 			ret = 0;
 		else {
 			if ((ret = dbox_sync_index(ctx)) > 0)


More information about the dovecot-cvs mailing list