From: Timo Sirainen Date: Tue, 1 Oct 2019 15:58:05 +0000 (+0300) Subject: lib-index: Change mail_index.need_recreate into a string X-Git-Tag: 2.3.11.2~518 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=691ad2881ba7dace5a6b83b2a0342ac0eaad70ec;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Change mail_index.need_recreate into a string The string specifies the reason why the recreation is wanted. --- diff --git a/src/lib-index/mail-index-map-hdr.c b/src/lib-index/mail-index-map-hdr.c index 3daa870b98..845ff5dc78 100644 --- a/src/lib-index/mail-index-map-hdr.c +++ b/src/lib-index/mail-index-map-hdr.c @@ -282,7 +282,8 @@ int mail_index_map_check_header(struct mail_index_map *map, map->hdr.unused_old_recent_messages_count = 0; if (hdr->first_recent_uid == 0) map->hdr.first_recent_uid = 1; - index->need_recreate = TRUE; + if (index->need_recreate == NULL) + index->need_recreate = i_strdup("Upgrading from index version 1.0"); /* fall through */ case 1: /* pre-v1.1.rc6: make sure the \Recent flags are gone */ diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index f7ac82c47a..dfe29297a0 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -174,6 +174,7 @@ struct mail_index { int fd; struct mail_index_map *map; + char *need_recreate; time_t last_mmap_error_time; @@ -218,7 +219,6 @@ struct mail_index { bool readonly:1; bool mapping:1; bool syncing:1; - bool need_recreate:1; bool index_min_write:1; bool modseqs_enabled:1; bool initial_create:1; diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index 55d56ca355..a8237bd27f 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -273,7 +273,7 @@ mail_index_need_sync(struct mail_index *index, enum mail_index_sync_flags flags, hdr->log_file_seq < log_file_seq) return TRUE; - if (index->need_recreate) + if (index->need_recreate != NULL) return TRUE; /* already synced */ @@ -366,7 +366,7 @@ mail_index_sync_begin_init(struct mail_index *index, } if (!mail_index_need_sync(index, flags, log_file_seq, log_file_offset) && - !index->index_deleted && !index->need_recreate) { + !index->index_deleted && index->need_recreate == NULL) { if (locked) mail_transaction_log_sync_unlock(index->log, "syncing determined unnecessary"); return 0; @@ -849,7 +849,7 @@ static bool mail_index_sync_want_index_write(struct mail_index *index) log_diff > index->optimization_set.index.rewrite_min_log_bytes)) return TRUE; - if (index->need_recreate) + if (index->need_recreate != NULL) return TRUE; return FALSE; } @@ -959,7 +959,7 @@ int mail_index_sync_commit(struct mail_index_sync_ctx **_ctx) mail_transaction_log_want_rotate(index->log); if (ret == 0 && (want_rotate || mail_index_sync_want_index_write(index))) { - index->need_recreate = FALSE; + i_free(index->need_recreate); index->index_min_write = FALSE; mail_index_write(index, want_rotate); } @@ -1019,11 +1019,19 @@ void mail_index_sync_set_corrupted(struct mail_index_sync_map_ctx *ctx, va_list va; uint32_t seq; uoff_t offset; + char *reason, *reason_free = NULL; + + va_start(va, fmt); + reason = reason_free = i_strdup_vprintf(fmt, va); + va_end(va); ctx->errors = TRUE; /* make sure we don't get to this same error again by updating the dovecot.index */ - ctx->view->index->need_recreate = TRUE; + if (ctx->view->index->need_recreate == NULL) { + ctx->view->index->need_recreate = reason; + reason_free = NULL; + } mail_transaction_log_view_get_prev_pos(ctx->view->log_view, &seq, &offset); @@ -1032,16 +1040,12 @@ void mail_index_sync_set_corrupted(struct mail_index_sync_map_ctx *ctx, (seq == ctx->view->index->fsck_log_head_file_seq && offset < ctx->view->index->fsck_log_head_file_offset)) { /* be silent */ - return; - } - - va_start(va, fmt); - T_BEGIN { + } else { mail_index_set_error(ctx->view->index, "Log synchronization error at " "seq=%u,offset=%"PRIuUOFF_T" for %s: %s", seq, offset, ctx->view->index->filepath, - t_strdup_vprintf(fmt, va)); - } T_END; - va_end(va); + reason); + } + i_free(reason_free); } diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index a8772c042a..e76206dcbe 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -116,6 +116,7 @@ void mail_index_free(struct mail_index **_index) i_free(index->error); i_free(index->dir); i_free(index->prefix); + i_free(index->need_recreate); i_free(index); } diff --git a/src/lib-index/mail-transaction-log-file.c b/src/lib-index/mail-transaction-log-file.c index bf841a192b..42c20b7566 100644 --- a/src/lib-index/mail-transaction-log-file.c +++ b/src/lib-index/mail-transaction-log-file.c @@ -1351,7 +1351,10 @@ int mail_transaction_log_file_get_modseq_next_offset( return -1; i_assert(ret != 0); /* get it fixed on the next sync */ - file->log->index->need_recreate = TRUE; + if (file->log->index->need_recreate == NULL) { + file->log->index->need_recreate = + i_strdup("modseq tracking is corrupted"); + } if (file->need_rotate == NULL) { file->need_rotate = i_strdup("modseq tracking is corrupted");