]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Change mail_index.need_recreate into a string
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 1 Oct 2019 15:58:05 +0000 (18:58 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Fri, 27 Mar 2020 14:27:53 +0000 (14:27 +0000)
The string specifies the reason why the recreation is wanted.

src/lib-index/mail-index-map-hdr.c
src/lib-index/mail-index-private.h
src/lib-index/mail-index-sync.c
src/lib-index/mail-index.c
src/lib-index/mail-transaction-log-file.c

index 3daa870b98e396ed6e38f99659d89297570bf9f7..845ff5dc78316fbf9ce226161ae8eae607a53723 100644 (file)
@@ -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 */
index f7ac82c47ab20ed01a62342d95a14c0556ffc43d..dfe29297a02052f3e1b3cecd239ef2ea549940a0 100644 (file)
@@ -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;
index 55d56ca355219bcb008f83dd25a119d6fb1f86d2..a8237bd27f6b314a32f6639fd786b1ba1e16ea19 100644 (file)
@@ -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);
 }
index a8772c042aabb165c058e744e2a08eb8a2cbae7b..e76206dcbe1c3750583bdd27235c762b0bc53315 100644 (file)
@@ -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);
 }
 
index bf841a192b653959d2ebdcffd9db1b125daf4e05..42c20b756652cdef321dbfb1d017d606c9aa692c 100644 (file)
@@ -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");