Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8127:8b0e3e27b551 HEAD
mbox: If we detect corrupted cached offsets/sizes, make sure the mbox gets resynced.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 30 Aug 2008 14:56:41 +0300 |
parents | cf2c4f3c636f |
children | fcf0c5ac5975 |
files | src/lib-storage/index/mbox/istream-raw-mbox.c src/lib-storage/index/mbox/istream-raw-mbox.h src/lib-storage/index/mbox/mbox-mail.c src/lib-storage/index/mbox/mbox-storage.c |
diffstat | 4 files changed, 30 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Aug 30 14:39:53 2008 +0300 +++ b/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Aug 30 14:56:41 2008 +0300 @@ -647,3 +647,11 @@ return rstream->eof; } + +bool istream_raw_mbox_is_corrupted(struct istream *stream) +{ + struct raw_mbox_istream *rstream = + (struct raw_mbox_istream *)stream->real_stream; + + return rstream->corrupted; +}
--- a/src/lib-storage/index/mbox/istream-raw-mbox.h Sat Aug 30 14:39:53 2008 +0300 +++ b/src/lib-storage/index/mbox/istream-raw-mbox.h Sat Aug 30 14:56:41 2008 +0300 @@ -42,5 +42,7 @@ /* Returns TRUE if we've read the whole mbox. */ bool istream_raw_mbox_is_eof(struct istream *stream); +/* Returns TRUE if we've noticed corruption in used offsets/sizes. */ +bool istream_raw_mbox_is_corrupted(struct istream *stream); #endif
--- a/src/lib-storage/index/mbox/mbox-mail.c Sat Aug 30 14:39:53 2008 +0300 +++ b/src/lib-storage/index/mbox/mbox-mail.c Sat Aug 30 14:56:41 2008 +0300 @@ -42,6 +42,12 @@ if (mail->mail.mail.expunged || mbox->syncing) return -1; + if (mbox->mbox_stream != NULL && + istream_raw_mbox_is_corrupted(mbox->mbox_stream)) { + /* clear the corruption by forcing a full resync */ + sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC; + } + for (try = 0; try < 2; try++) { if (mbox->mbox_lock_type == F_UNLCK) { sync_flags |= MBOX_SYNC_LOCK_READING; @@ -60,6 +66,7 @@ } else if ((sync_flags & MBOX_SYNC_FORCE_SYNC) != 0) { /* dirty offsets are broken and mbox is write-locked. sync it to update offsets. */ + mbox_prepare_resync(mail); if (mbox_sync(mbox, sync_flags) < 0) return -1; } @@ -80,7 +87,6 @@ } /* we'll need to re-sync it completely */ - mbox_prepare_resync(mail); sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC; } if (ret == 0) {
--- a/src/lib-storage/index/mbox/mbox-storage.c Sat Aug 30 14:39:53 2008 +0300 +++ b/src/lib-storage/index/mbox/mbox-storage.c Sat Aug 30 14:56:41 2008 +0300 @@ -12,6 +12,7 @@ #include "mbox-lock.h" #include "mbox-file.h" #include "mbox-sync-private.h" +#include "istream-raw-mbox.h" #include "mail-copy.h" #include "index-mail.h" @@ -762,18 +763,28 @@ { struct mbox_mailbox *mbox = (struct mbox_mailbox *)box; const struct mail_index_header *hdr; + enum mbox_sync_flags sync_flags = 0; int ret = 0; + if (mbox->mbox_stream != NULL && + istream_raw_mbox_is_corrupted(mbox->mbox_stream)) { + /* clear the corruption by forcing a full resync */ + sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC; + } + if (mbox->ibox.view != NULL) { hdr = mail_index_get_header(mbox->ibox.view); if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 && !mbox->mbox_readonly) { /* we've done changes to mbox which haven't been written yet. do it now. */ - if (mbox_sync(mbox, MBOX_SYNC_REWRITE) < 0) - ret = -1; + sync_flags |= MBOX_SYNC_REWRITE; } } + if (sync_flags != 0) { + if (mbox_sync(mbox, sync_flags) < 0) + ret = -1; + } if (mbox->mbox_global_lock_id != 0) (void)mbox_unlock(mbox, mbox->mbox_global_lock_id);