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