]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mdbox: If one save fails, but others succeed, don't assert-crash at commit.
authorTimo Sirainen <tss@iki.fi>
Thu, 1 Jul 2010 19:40:55 +0000 (20:40 +0100)
committerTimo Sirainen <tss@iki.fi>
Thu, 1 Jul 2010 19:40:55 +0000 (20:40 +0100)
--HG--
branch : HEAD

src/lib-storage/index/dbox-multi/mdbox-map.c
src/lib-storage/index/dbox-multi/mdbox-map.h
src/lib-storage/index/dbox-multi/mdbox-save.c

index 3141b60de7799d8fbb68a1bf84e274baf1061f95..9e262f527433750d07c3a1bb3f2f5398b49298db 100644 (file)
@@ -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)
 {
index b285dec3551cd50fcd8ef5e6df6e47a970467427..c5500c7d7dcd5c4a0187c22e162030eab97b2f38 100644 (file)
@@ -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,
index 93802c069beb59ee4a91fd643a09257c5631b892..abaf0298f2c2ba727dceb7da8ae220d9fea561e1 100644 (file)
@@ -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;
        }