]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: mail_index_sync_map() - Move corruption handling to caller
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 10 Aug 2020 14:53:08 +0000 (17:53 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Mon, 23 Nov 2020 13:19:55 +0000 (13:19 +0000)
src/lib-index/mail-index-map-read.c
src/lib-index/mail-index-sync-private.h
src/lib-index/mail-index-sync-update.c

index 17fa2fdc3c0e68d51c1ab0fc49c419608c87d646..1fcd6699eed51ecd3c9beac92372c464ede84555 100644 (file)
@@ -410,6 +410,7 @@ mail_index_map_latest_sync(struct mail_index *index,
                           enum mail_index_sync_handler_type type,
                           const char *reason)
 {
+       const char *map_reason;
        int ret;
 
        if (index->log->head == NULL || index->indexid == 0) {
@@ -419,15 +420,23 @@ mail_index_map_latest_sync(struct mail_index *index,
        }
 
        /* and update the map with the latest changes from transaction log */
-       ret = mail_index_sync_map(&index->map, type, TRUE, reason);
+       ret = mail_index_sync_map(&index->map, type, &map_reason);
        if (ret != 0)
                return ret;
 
-       /* we fsck'd the index. try opening again. */
+       /* fsck the index and try to reopen */
+       mail_index_set_error(index, "Index %s: %s: %s - fscking",
+                            index->filepath, reason, map_reason);
+       if (mail_index_fsck(index) < 0)
+               return -1;
+
        ret = mail_index_map_latest_file(index, &reason);
        if (ret > 0 && index->indexid != 0) {
-               ret = mail_index_sync_map(&index->map,
-                                         type, TRUE, reason);
+               ret = mail_index_sync_map(&index->map, type, &map_reason);
+               if (ret == 0) {
+                       mail_index_set_error(index, "Index %s: %s: %s",
+                               index->filepath, reason, map_reason);
+               }
        }
        return ret;
 }
@@ -455,7 +464,13 @@ int mail_index_map(struct mail_index *index,
                ret = 0;
        } else {
                /* sync the map from the transaction log. */
-               ret = mail_index_sync_map(&index->map, type, FALSE, "initial mapping");
+               ret = mail_index_sync_map(&index->map, type, &reason);
+               if (ret == 0) {
+                       e_debug(index->event,
+                               "Couldn't sync map from transaction log: %s - "
+                               "reopening index instead",
+                               reason);
+               }
        }
 
        if (ret == 0) {
index f5061c2ec622cd083bef246cd63d7640d1ea6942..db57f0b12d83d86128ccfe226b2cde10ca033bad 100644 (file)
@@ -54,9 +54,9 @@ void mail_index_sync_map_init(struct mail_index_sync_map_ctx *sync_map_ctx,
 void mail_index_sync_map_deinit(struct mail_index_sync_map_ctx *sync_map_ctx);
 bool mail_index_sync_map_want_index_reopen(struct mail_index_map *map,
                                           enum mail_index_sync_handler_type type);
-int mail_index_sync_map(struct mail_index_map **map,
-                       enum mail_index_sync_handler_type type, bool force,
-                       const char *sync_reason);
+int mail_index_sync_map(struct mail_index_map **_map,
+                       enum mail_index_sync_handler_type type,
+                       const char **reason_r);
 
 int mail_index_sync_record(struct mail_index_sync_map_ctx *ctx,
                           const struct mail_transaction_header *hdr,
index 751481abf17ea0da18acb0f9e6055973e223eb82..653d8a9346760d60ad0c8e3d7dce2f76f015c0c6 100644 (file)
@@ -930,8 +930,8 @@ bool mail_index_sync_map_want_index_reopen(struct mail_index_map *map,
 }
 
 int mail_index_sync_map(struct mail_index_map **_map,
-                       enum mail_index_sync_handler_type type, bool force,
-                       const char *sync_reason)
+                       enum mail_index_sync_handler_type type,
+                       const char **reason_r)
 {
        struct mail_index_map *map = *_map;
        struct mail_index *index = map->index;
@@ -947,7 +947,6 @@ int mail_index_sync_map(struct mail_index_map **_map,
 
        i_assert(index->log->head != NULL);
        i_assert(index->map == map || type == MAIL_INDEX_SYNC_HANDLER_VIEW);
-       i_assert(!force || index->log->head != NULL);
 
        start_offset = type == MAIL_INDEX_SYNC_HANDLER_FILE ?
                map->hdr.log_file_tail_offset : map->hdr.log_file_head_offset;
@@ -963,16 +962,12 @@ int mail_index_sync_map(struct mail_index_map **_map,
                        /* I/O failure */
                        return -1;
                }
-               if (force) {
-                       /* the seq/offset is probably broken */
-                       mail_index_set_error(index, "Index %s: Lost log for "
-                               "seq=%u offset=%"PRIuUOFF_T": %s "
-                               "(initial_mapped=%d, reason=%s)", index->filepath,
-                               map->hdr.log_file_seq, start_offset, reason,
-                               index->initial_mapped ? 1 : 0, sync_reason);
-                       (void)mail_index_fsck(index);
-               }
-               /* can't use it. sync by re-reading index. */
+               /* the seq/offset is probably broken */
+               *reason_r = t_strdup_printf(
+                       "Lost log for seq=%u offset=%"PRIuUOFF_T": %s "
+                       "(initial_mapped=%d)",
+                       map->hdr.log_file_seq, start_offset, reason,
+                       index->initial_mapped ? 1 : 0);
                return 0;
        }