From: Timo Sirainen Date: Wed, 25 Feb 2009 17:30:36 +0000 (-0500) Subject: dbox: Fixes to saving messages. X-Git-Tag: 2.0.alpha1~1038^2~73 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9e0d0e498b869bfc8713803bc9652e934bda5612;p=thirdparty%2Fdovecot%2Fcore.git dbox: Fixes to saving messages. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/dbox/dbox-map.c b/src/lib-storage/index/dbox/dbox-map.c index 1f2d36af05..2d7ef763cb 100644 --- a/src/lib-storage/index/dbox/dbox-map.c +++ b/src/lib-storage/index/dbox/dbox-map.c @@ -222,9 +222,8 @@ dbox_map_file_try_append(struct dbox_map_append_context *ctx, struct dbox_storage *storage = map->storage; const struct mail_index_header *hdr; struct dbox_file *file; - struct stat st; uint32_t seq, tmp_file_id; - uoff_t tmp_offset, tmp_size; + uoff_t tmp_offset, tmp_size, new_size; bool deleted, file_too_old = FALSE; int ret; @@ -237,14 +236,9 @@ dbox_map_file_try_append(struct dbox_map_append_context *ctx, if (deleted) return TRUE; - if (fstat(file->fd, &st) < 0) { - mail_storage_set_critical(&storage->storage, - "fstat(%s) failed: %m", file->current_path); - } else if (file->create_time < stamp) + if (file->create_time < stamp) file_too_old = TRUE; - else if (st.st_size + mail_size > storage->rotate_size) { - /* file too large */ - } else if ((ret = dbox_file_try_lock(file)) <= 0) { + else if ((ret = dbox_file_try_lock(file)) <= 0) { /* locking failed */ *retry_later_r = ret == 0; } else if (dbox_map_refresh(map) == 0) { @@ -263,8 +257,9 @@ dbox_map_file_try_append(struct dbox_map_append_context *ctx, } } + new_size = last_msg_offset + last_msg_size + mail_size; if (seq > hdr->messages_count && - last_msg_offset + last_msg_size > storage->rotate_size && + new_size <= storage->rotate_size && dbox_file_get_append_stream(file, last_msg_offset, last_msg_size, output_r) > 0) { /* success */ @@ -444,7 +439,7 @@ int dbox_map_append_next(struct dbox_map_append_context *ctx, uoff_t mail_size, return 0; } -void dbox_map_append_finish_mail(struct dbox_map_append_context *ctx) +void dbox_map_append_finish_multi_mail(struct dbox_map_append_context *ctx) { struct dbox_map_append *appends; unsigned int count; diff --git a/src/lib-storage/index/dbox/dbox-map.h b/src/lib-storage/index/dbox/dbox-map.h index 751f69fa33..233bb3d205 100644 --- a/src/lib-storage/index/dbox/dbox-map.h +++ b/src/lib-storage/index/dbox/dbox-map.h @@ -19,7 +19,7 @@ dbox_map_append_begin(struct dbox_mailbox *mbox); int dbox_map_append_next(struct dbox_map_append_context *ctx, uoff_t mail_size, struct dbox_file **file_r, struct ostream **output_r); /* Finished saving the last mail. Saves the message size. */ -void dbox_map_append_finish_mail(struct dbox_map_append_context *ctx); +void dbox_map_append_finish_multi_mail(struct dbox_map_append_context *ctx); /* Assign map UIDs to all appended msgs to multi-files. */ int dbox_map_append_assign_map_uids(struct dbox_map_append_context *ctx, uint32_t *first_map_uid_r, diff --git a/src/lib-storage/index/dbox/dbox-save.c b/src/lib-storage/index/dbox/dbox-save.c index 952f39b246..41680a2744 100644 --- a/src/lib-storage/index/dbox/dbox-save.c +++ b/src/lib-storage/index/dbox/dbox-save.c @@ -272,10 +272,11 @@ static int dbox_save_finish_write(struct mail_save_context *_ctx) return -1; } - dbox_map_append_finish_mail(ctx->append_ctx); if (save_mail->file->single_mbox != NULL) { dbox_file_close(save_mail->file); ctx->single_count++; + } else { + dbox_map_append_finish_multi_mail(ctx->append_ctx); } return 0; }