From 836e57b1e7817d008f8ae05cd4b506f420fed80d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 1 Jul 2010 20:40:55 +0100 Subject: [PATCH] mdbox: If one save fails, but others succeed, don't assert-crash at commit. --HG-- branch : HEAD --- src/lib-storage/index/dbox-multi/mdbox-map.c | 10 ++++++++++ src/lib-storage/index/dbox-multi/mdbox-map.h | 2 ++ src/lib-storage/index/dbox-multi/mdbox-save.c | 1 + 3 files changed, 13 insertions(+) diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.c b/src/lib-storage/index/dbox-multi/mdbox-map.c index 3141b60de7..9e262f5274 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.c +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c @@ -1070,6 +1070,16 @@ void mdbox_map_append_finish(struct mdbox_map_append_context *ctx) appends[count-1].size = cur_offset - appends[count-1].offset; } +void mdbox_map_append_abort(struct mdbox_map_append_context *ctx) +{ + struct mdbox_map_append *appends; + unsigned int count; + + appends = array_get_modifiable(&ctx->appends, &count); + i_assert(count > 0 && appends[count-1].size == (uint32_t)-1); + array_delete(&ctx->appends, count-1, 1); +} + static int mdbox_map_assign_file_ids(struct mdbox_map_append_context *ctx, bool separate_transaction) { diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.h b/src/lib-storage/index/dbox-multi/mdbox-map.h index b285dec355..c5500c7d7d 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.h +++ b/src/lib-storage/index/dbox-multi/mdbox-map.h @@ -101,6 +101,8 @@ int mdbox_map_append_next(struct mdbox_map_append_context *ctx, uoff_t mail_size struct ostream **output_r); /* Finished saving the last mail. Saves the message size. */ void mdbox_map_append_finish(struct mdbox_map_append_context *ctx); +/* Abort saving the last mail. */ +void mdbox_map_append_abort(struct mdbox_map_append_context *ctx); /* Assign map UIDs to all appended msgs to multi-files. */ int mdbox_map_append_assign_map_uids(struct mdbox_map_append_context *ctx, uint32_t *first_map_uid_r, diff --git a/src/lib-storage/index/dbox-multi/mdbox-save.c b/src/lib-storage/index/dbox-multi/mdbox-save.c index 93802c069b..abaf0298f2 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-save.c +++ b/src/lib-storage/index/dbox-multi/mdbox-save.c @@ -218,6 +218,7 @@ static int mdbox_save_finish_write(struct mail_save_context *_ctx) i_stream_unref(&ctx->ctx.input); if (ctx->ctx.failed) { + mdbox_map_append_abort(ctx->append_ctx); array_delete(&ctx->mails, array_count(&ctx->mails) - 1, 1); return -1; } -- 2.47.3