dovecot-1.1: mbox: If we detect corrupted cached offsets/sizes, ...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Aug 30 14:56:49 EEST 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/50df211455d7
changeset: 7847:50df211455d7
user: Timo Sirainen <tss at iki.fi>
date: Sat Aug 30 14:56:27 2008 +0300
description:
mbox: If we detect corrupted cached offsets/sizes, make sure the mbox gets resynced.
diffstat:
4 files changed, 31 insertions(+), 4 deletions(-)
src/lib-storage/index/mbox/istream-raw-mbox.c | 8 ++++++++
src/lib-storage/index/mbox/istream-raw-mbox.h | 2 ++
src/lib-storage/index/mbox/mbox-mail.c | 8 +++++++-
src/lib-storage/index/mbox/mbox-storage.c | 17 ++++++++++++++---
diffs (100 lines):
diff -r cb9b476e67f1 -r 50df211455d7 src/lib-storage/index/mbox/istream-raw-mbox.c
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Aug 30 14:39:30 2008 +0300
+++ b/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Aug 30 14:56:27 2008 +0300
@@ -646,3 +646,11 @@ bool istream_raw_mbox_is_eof(struct istr
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;
+}
diff -r cb9b476e67f1 -r 50df211455d7 src/lib-storage/index/mbox/istream-raw-mbox.h
--- a/src/lib-storage/index/mbox/istream-raw-mbox.h Sat Aug 30 14:39:30 2008 +0300
+++ b/src/lib-storage/index/mbox/istream-raw-mbox.h Sat Aug 30 14:56:27 2008 +0300
@@ -42,5 +42,7 @@ void istream_raw_mbox_set_next_offset(st
/* 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
diff -r cb9b476e67f1 -r 50df211455d7 src/lib-storage/index/mbox/mbox-mail.c
--- a/src/lib-storage/index/mbox/mbox-mail.c Sat Aug 30 14:39:30 2008 +0300
+++ b/src/lib-storage/index/mbox/mbox-mail.c Sat Aug 30 14:56:27 2008 +0300
@@ -42,6 +42,12 @@ static int mbox_mail_seek(struct index_m
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 @@ static int mbox_mail_seek(struct index_m
} 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 @@ static int mbox_mail_seek(struct index_m
}
/* we'll need to re-sync it completely */
- mbox_prepare_resync(mail);
sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC;
}
if (ret == 0) {
diff -r cb9b476e67f1 -r 50df211455d7 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c Sat Aug 30 14:39:30 2008 +0300
+++ b/src/lib-storage/index/mbox/mbox-storage.c Sat Aug 30 14:56:27 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"
@@ -755,7 +756,14 @@ static int mbox_storage_mailbox_close(st
{
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);
@@ -763,9 +771,12 @@ static int mbox_storage_mailbox_close(st
!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)
More information about the dovecot-cvs
mailing list