mail_index_unmap(view->index, view->map);
view->map = ctx->sync_map;
+ view->map_protected = FALSE;
mail_transaction_log_view_unset(view->log_view);
is updated? shouldn't really happen.. */
mail_storage_set_critical(ibox->box.storage,
"Maildir sync: UID < next_uid "
- "(%u < %u)", uid, hdr->next_uid);
+ "(%u < %u, file = %s)",
+ uid, hdr->next_uid, filename);
mail_index_mark_corrupted(ibox->index);
ret = -1;
break;
}
/* finish uidlist syncing, but keep it still locked */
- maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx);
- if (maildir_sync_index(ctx) < 0)
- return -1;
+ if (maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx)) {
+ if (maildir_sync_index(ctx) < 0)
+ return -1;
+ }
ret = maildir_uidlist_sync_deinit(ctx->uidlist_sync_ctx);
ctx->uidlist_sync_ctx = NULL;
rec = p_new(uidlist->record_pool, struct maildir_uidlist_rec, 1);
rec->uid = uid;
- rec->flags = flags;
+ rec->flags = flags | MAILDIR_UIDLIST_REC_FLAG_NONSYNCED;
rec->filename = p_strdup(uidlist->record_pool, line);
hash_insert(uidlist->files, rec->filename, rec);
buffer_append(uidlist->record_buf, &rec, sizeof(rec));
}
}
-void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx)
+int maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx)
{
if (!ctx->partial) {
if (!ctx->failed && !ctx->locked)
maildir_uidlist_assign_uids(ctx->uidlist,
ctx->first_new_pos);
}
- maildir_uidlist_mark_all(ctx->uidlist, FALSE);
}
ctx->finished = TRUE;
+ return !ctx->locked;
}
int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx *ctx)
if (ctx->new_files_count != 0 && !ctx->failed && !ctx->locked)
ret = maildir_uidlist_rewrite(ctx->uidlist);
+ if (ctx->partial)
+ maildir_uidlist_mark_all(ctx->uidlist, FALSE);
+
if (UIDLIST_IS_LOCKED(ctx->uidlist))
maildir_uidlist_unlock(ctx->uidlist);
int maildir_uidlist_sync_next(struct maildir_uidlist_sync_ctx *ctx,
const char *filename,
enum maildir_uidlist_rec_flag flags);
-void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx);
+/* Returns 1 = ok, 0 = uidlist is locked, don't try syncing any further */
+int maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx);
int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx *ctx);
/* List all maildir files. */