dovecot-1.1: Index opening: If there's broken index and no .log,...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Aug 4 01:41:50 EEST 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/1c010fadc9c9
changeset: 7802:1c010fadc9c9
user: Timo Sirainen <tss at iki.fi>
date: Mon Aug 04 01:41:39 2008 +0300
description:
Index opening: If there's broken index and no .log, don't crash.
diffstat:
1 file changed, 30 insertions(+), 14 deletions(-)
src/lib-index/mail-index-fsck.c | 44 ++++++++++++++++++++++++++-------------
diffs (85 lines):
diff -r 1425b6e25819 -r 1c010fadc9c9 src/lib-index/mail-index-fsck.c
--- a/src/lib-index/mail-index-fsck.c Thu Jul 24 22:18:29 2008 +0300
+++ b/src/lib-index/mail-index-fsck.c Mon Aug 04 01:41:39 2008 +0300
@@ -4,7 +4,7 @@
#include "ioloop.h"
#include "array.h"
#include "mail-index-private.h"
-#include "mail-transaction-log.h"
+#include "mail-transaction-log-private.h"
static void mail_index_fsck_error(struct mail_index *index,
const char *fmt, ...) ATTR_FORMAT(2, 3);
@@ -26,16 +26,11 @@ static void mail_index_fsck_error(struct
}
static void
-mail_index_fsck_header(struct mail_index *index, struct mail_index_map *map,
- struct mail_index_header *hdr)
+mail_index_fsck_log_pos(struct mail_index *index, struct mail_index_map *map,
+ struct mail_index_header *hdr)
{
uint32_t file_seq;
uoff_t file_offset;
-
- /* mail_index_map_check_header() has already checked that the index
- isn't completely broken. */
- if (hdr->uid_validity == 0 && hdr->next_uid != 1)
- hdr->uid_validity = ioloop_time;
mail_transaction_log_get_head(index->log, &file_seq, &file_offset);
if (hdr->log_file_seq < file_seq) {
@@ -55,6 +50,19 @@ mail_index_fsck_header(struct mail_index
CHECK(log_file_head_offset, !=);
CHECK(log_file_tail_offset, !=);
}
+}
+
+static void
+mail_index_fsck_header(struct mail_index *index, struct mail_index_map *map,
+ struct mail_index_header *hdr)
+{
+ /* mail_index_map_check_header() has already checked that the index
+ isn't completely broken. */
+ if (hdr->uid_validity == 0 && hdr->next_uid != 1)
+ hdr->uid_validity = ioloop_time;
+
+ if (index->log->head != NULL)
+ mail_index_fsck_log_pos(index, map, hdr);
}
static bool
@@ -396,12 +404,13 @@ mail_index_fsck_map(struct mail_index *i
{
struct mail_index_header hdr;
- /* Remember the log head position. If we go back in the index's head
- offset, ignore errors in the log up to this offset. */
- mail_transaction_log_get_head(index->log,
- &index->fsck_log_head_file_seq,
- &index->fsck_log_head_file_offset);
-
+ if (index->log->head != NULL) {
+ /* Remember the log head position. If we go back in the index's
+ head offset, ignore errors in the log up to this offset. */
+ mail_transaction_log_get_head(index->log,
+ &index->fsck_log_head_file_seq,
+ &index->fsck_log_head_file_offset);
+ }
hdr = map->hdr;
mail_index_fsck_header(index, map, &hdr);
@@ -420,6 +429,13 @@ int mail_index_fsck(struct mail_index *i
i_warning("fscking index file %s", index->filepath);
+ if (index->log->head == NULL) {
+ /* we're trying to open the index files, but there wasn't
+ any .log file. this should be rare, so just fsck it without
+ locking. */
+ orig_locked = TRUE;
+ }
+
if (!orig_locked) {
if (mail_transaction_log_sync_lock(index->log, &file_seq,
&file_offset) < 0)
More information about the dovecot-cvs
mailing list