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;
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 */
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
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) &&