dovecot: Delay writing to output file when saving messages until...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 2 17:35:08 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/fe1e6e895d8f
changeset: 6160:fe1e6e895d8f
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 02 17:35:04 2007 +0300
description:
Delay writing to output file when saving messages until output buffer is full.

diffstat:

2 files changed, 18 insertions(+), 3 deletions(-)
src/lib-storage/index/cydir/cydir-save.c     |   13 ++++++++++---
src/lib-storage/index/maildir/maildir-save.c |    8 ++++++++

diffs (62 lines):

diff -r 078d9dde99c8 -r fe1e6e895d8f src/lib-storage/index/cydir/cydir-save.c
--- a/src/lib-storage/index/cydir/cydir-save.c	Thu Aug 02 17:05:26 2007 +0300
+++ b/src/lib-storage/index/cydir/cydir-save.c	Thu Aug 02 17:35:04 2007 +0300
@@ -37,9 +37,9 @@ struct cydir_save_context {
 
 static char *cydir_generate_tmp_filename(void)
 {
-	static unsigned int create_count;
-
-	return i_strdup_printf("%s.P%sQ%uM%s.%s",
+	static unsigned int create_count = 0;
+
+	return i_strdup_printf("temp.%s.P%sQ%uM%s.%s",
 			       dec2str(ioloop_timeval.tv_sec), my_pid,
 			       create_count++,
 			       dec2str(ioloop_timeval.tv_usec), my_hostname);
@@ -88,6 +88,7 @@ int cydir_save_init(struct mailbox_trans
 		output = o_stream_create_file(ctx->fd, 0, FALSE);
 		ctx->output = o_stream_create_crlf(output);
 		o_stream_unref(&output);
+		o_stream_cork(ctx->output);
 
 		if (received_date != (time_t)-1) {
 			struct utimbuf ut;
@@ -169,6 +170,12 @@ int cydir_save_finish(struct mail_save_c
 
 	ctx->finished = TRUE;
 
+	if (o_stream_flush(ctx->output) < 0) {
+		mail_storage_set_critical(storage,
+			"o_stream_flush(%s) failed: %m", path);
+		ctx->failed = TRUE;
+	}
+
 	if (!ctx->mbox->ibox.fsync_disable) {
 		if (fsync(ctx->fd) < 0) {
 			mail_storage_set_critical(storage,
diff -r 078d9dde99c8 -r fe1e6e895d8f src/lib-storage/index/maildir/maildir-save.c
--- a/src/lib-storage/index/maildir/maildir-save.c	Thu Aug 02 17:05:26 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-save.c	Thu Aug 02 17:35:04 2007 +0300
@@ -382,6 +382,7 @@ int maildir_save_init(struct mailbox_tra
 		       MAIL_STORAGE_FLAG_SAVE_CRLF) != 0 ?
 		o_stream_create_crlf(output) : o_stream_create_lf(output);
 	o_stream_unref(&output);
+	o_stream_cork(ctx->output);
 
 	flags &= ~MAIL_RECENT;
 	if (mbox->ibox.keep_recent)
@@ -430,6 +431,13 @@ int maildir_save_finish(struct mail_save
 	const char *path;
 	int output_errno;
 
+	if (o_stream_flush(ctx->output) < 0) {
+		mail_storage_set_critical(&ctx->mbox->storage->storage,
+			"o_stream_flush(%s/%s) failed: %m",
+			ctx->tmpdir, ctx->file_last->basename);
+		ctx->failed = TRUE;
+	}
+
 	if (ctx->cur_dest_mail != NULL) {
 		index_mail_cache_parse_deinit(ctx->cur_dest_mail);
 		i_stream_unref(&ctx->input);


More information about the dovecot-cvs mailing list