]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Make sure we never go to infinite loop if fsck can't fix syncing problem.
authorTimo Sirainen <tss@iki.fi>
Wed, 23 Nov 2011 17:10:34 +0000 (19:10 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 23 Nov 2011 17:10:34 +0000 (19:10 +0200)
src/lib-index/mail-index-sync.c

index 5eadc917bd0653780f9521760308e554e1d8d96a..77f1747315ecb0fcdb10d9b67f46c3286acdec89 100644 (file)
@@ -421,12 +421,13 @@ mail_index_sync_begin_init(struct mail_index *index,
        return 1;
 }
 
-int mail_index_sync_begin_to(struct mail_index *index,
-                            struct mail_index_sync_ctx **ctx_r,
-                            struct mail_index_view **view_r,
-                            struct mail_index_transaction **trans_r,
-                            uint32_t log_file_seq, uoff_t log_file_offset,
-                            enum mail_index_sync_flags flags)
+static int
+mail_index_sync_begin_to2(struct mail_index *index,
+                         struct mail_index_sync_ctx **ctx_r,
+                         struct mail_index_view **view_r,
+                         struct mail_index_transaction **trans_r,
+                         uint32_t log_file_seq, uoff_t log_file_offset,
+                         enum mail_index_sync_flags flags, bool *retry_r)
 {
        const struct mail_index_header *hdr;
        struct mail_index_sync_ctx *ctx;
@@ -436,6 +437,8 @@ int mail_index_sync_begin_to(struct mail_index *index,
 
        i_assert(!index->syncing);
 
+       *retry_r = FALSE;
+
        if (index->map != NULL &&
            (index->map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
                /* index is corrupted and need to be reopened */
@@ -481,9 +484,8 @@ int mail_index_sync_begin_to(struct mail_index *index,
                   to skip over it. fix the problem with fsck and try again. */
                mail_index_fsck_locked(index);
                mail_index_sync_rollback(&ctx);
-               return mail_index_sync_begin_to(index, ctx_r, view_r, trans_r,
-                                               log_file_seq, log_file_offset,
-                                               flags);
+               *retry_r = TRUE;
+               return 0;
        }
 
        /* we need to have all the transactions sorted to optimize
@@ -513,6 +515,27 @@ int mail_index_sync_begin_to(struct mail_index *index,
        return 1;
 }
 
+int mail_index_sync_begin_to(struct mail_index *index,
+                            struct mail_index_sync_ctx **ctx_r,
+                            struct mail_index_view **view_r,
+                            struct mail_index_transaction **trans_r,
+                            uint32_t log_file_seq, uoff_t log_file_offset,
+                            enum mail_index_sync_flags flags)
+{
+       bool retry;
+       int ret;
+
+       ret = mail_index_sync_begin_to2(index, ctx_r, view_r, trans_r,
+                                       log_file_seq, log_file_offset,
+                                       flags, &retry);
+       if (retry) {
+               ret = mail_index_sync_begin_to2(index, ctx_r, view_r, trans_r,
+                                               log_file_seq, log_file_offset,
+                                               flags, &retry);
+       }
+       return ret;
+}
+
 bool mail_index_sync_has_expunges(struct mail_index_sync_ctx *ctx)
 {
        return array_is_created(&ctx->sync_trans->expunges) &&