changeset 9444:99a97c5c9912 HEAD

dox: When checking dbox header in sync, make sure we're using the latest index.
author Timo Sirainen <tss@iki.fi>
date Thu, 04 Jun 2009 13:07:11 -0400
parents 0bf92fe23dea
children 3396bab1feb6
files src/lib-storage/index/dbox/dbox-sync.c
diffstat 1 files changed, 21 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	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;
+	int ret;
 
-	mail_index_get_header_ext(mbox->ibox.view, mbox->dbox_hdr_ext_id,
+	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;
+		ret = -1;
+	} else {
+		hdr = data;
 
-	mbox->highest_maildir_uid = hdr->highest_maildir_uid;
-	if (mbox->storage->sync_rebuild)
-		return -1;
-	return 0;
+		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 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 @@
 		}
 
 		/* 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)