From: Timo Sirainen Date: Thu, 1 Jul 2010 19:40:55 +0000 (+0100) Subject: mdbox: If one save fails, but others succeed, don't assert-crash at commit. X-Git-Tag: 2.0.rc1~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=836e57b1e7817d008f8ae05cd4b506f420fed80d;p=thirdparty%2Fdovecot%2Fcore.git mdbox: If one save fails, but others succeed, don't assert-crash at commit. --HG-- branch : HEAD --- 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; }