]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: Fixes to saving messages.
authorTimo Sirainen <tss@iki.fi>
Wed, 25 Feb 2009 17:30:36 +0000 (12:30 -0500)
committerTimo Sirainen <tss@iki.fi>
Wed, 25 Feb 2009 17:30:36 +0000 (12:30 -0500)
--HG--
branch : HEAD

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

index 1f2d36af053716b3c76802974dc7dd027fd2fa8e..2d7ef763cb8dea11a039dd5547c0e3a147181143 100644 (file)
@@ -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;
index 751f69fa3320051a431465180ab6e1804440b310..233bb3d2054a250c0b155f9e872d16bac5612d2f 100644 (file)
@@ -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,
index 952f39b2468147373bf5748f621684fd6abc9289..41680a27442d886cc9b238386dee99dd3ed6556c 100644 (file)
@@ -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;
 }