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