dovecot-2.0: mdbox: If one save fails, but others succeed, don't...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jul 1 22:40:59 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/3bc1cef3ac4c
changeset: 11692:3bc1cef3ac4c
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jul 01 20:40:55 2010 +0100
description:
mdbox: If one save fails, but others succeed, don't assert-crash at commit.

diffstat:

 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(+), 0 deletions(-)

diffs (43 lines):

diff -r 245cd41837ff -r 3bc1cef3ac4c src/lib-storage/index/dbox-multi/mdbox-map.c
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c	Thu Jul 01 20:01:01 2010 +0100
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c	Thu Jul 01 20:40:55 2010 +0100
@@ -1070,6 +1070,16 @@
 	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 -r 245cd41837ff -r 3bc1cef3ac4c src/lib-storage/index/dbox-multi/mdbox-map.h
--- a/src/lib-storage/index/dbox-multi/mdbox-map.h	Thu Jul 01 20:01:01 2010 +0100
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.h	Thu Jul 01 20:40:55 2010 +0100
@@ -101,6 +101,8 @@
 			  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 -r 245cd41837ff -r 3bc1cef3ac4c src/lib-storage/index/dbox-multi/mdbox-save.c
--- a/src/lib-storage/index/dbox-multi/mdbox-save.c	Thu Jul 01 20:01:01 2010 +0100
+++ b/src/lib-storage/index/dbox-multi/mdbox-save.c	Thu Jul 01 20:40:55 2010 +0100
@@ -218,6 +218,7 @@
 	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;
 	}


More information about the dovecot-cvs mailing list