]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Use separate read block sizes when reading only message header vs. full message.
authorTimo Sirainen <tss@iki.fi>
Thu, 13 Aug 2009 16:46:28 +0000 (12:46 -0400)
committerTimo Sirainen <tss@iki.fi>
Thu, 13 Aug 2009 16:46:28 +0000 (12:46 -0400)
--HG--
branch : HEAD

src/lib-storage/index/cydir/cydir-mail.c
src/lib-storage/index/dbox/dbox-file.c
src/lib-storage/index/index-mail.c
src/lib-storage/index/index-mail.h
src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/index/mbox/mbox-file.c
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/mail-storage-private.h

index 06d2071d2fc62057bff2e0ba44d67dbec99743e6..cc8e7254f71a4cb61262327f0b447b17f6834d41 100644 (file)
@@ -112,10 +112,8 @@ cydir_mail_get_stream(struct mail *_mail, struct message_size *hdr_size,
                        }
                        return -1;
                }
-               mail->data.stream =
-                       i_stream_create_fd(fd, MAIL_READ_BLOCK_SIZE, TRUE);
-               i_stream_set_init_buffer_size(mail->data.stream,
-                                             MAIL_READ_BLOCK_SIZE);
+               mail->data.stream = i_stream_create_fd(fd, 0, TRUE);
+               index_mail_set_read_buffer_size(_mail, mail->data.stream);
        }
 
        return index_mail_init_stream(mail, hdr_size, body_size, stream_r);
index ae2a5f246ae333c8d126f76124cfa1da5f2a3941..5d83df990012b75c59da3df73df4494d6a7ed7af 100644 (file)
@@ -23,6 +23,8 @@
 #include <ctype.h>
 #include <fcntl.h>
 
+#define DBOX_READ_BLOCK_SIZE 4096
+
 char *dbox_generate_tmp_filename(void)
 {
        static unsigned int create_count = 0;
@@ -427,8 +429,8 @@ int dbox_file_open(struct dbox_file *file, bool *deleted_r)
                }
        }
 
-       file->input = i_stream_create_fd(file->fd, MAIL_READ_BLOCK_SIZE, FALSE);
-       i_stream_set_init_buffer_size(file->input, MAIL_READ_BLOCK_SIZE);
+       file->input = i_stream_create_fd(file->fd, 0, FALSE);
+       i_stream_set_init_buffer_size(file->input, DBOX_READ_BLOCK_SIZE);
        return file->maildir_file ? 1 :
                dbox_file_read_header(file);
 }
index d3083beb36598204f8a24a0cfe2e22d8be519031..7588bbae2f4e79f5bec12a7f0d0b435e8c96341b 100644 (file)
@@ -802,6 +802,17 @@ static void index_mail_stream_destroy_callback(struct index_mail *mail)
        mail->data.destroying_stream = FALSE;
 }
 
+void index_mail_set_read_buffer_size(struct mail *_mail, struct istream *input)
+{
+       struct index_mail *mail = (struct index_mail *)_mail;
+       unsigned int block_size;
+
+       i_stream_set_max_buffer_size(input, MAIL_READ_FULL_BLOCK_SIZE);
+       block_size = (mail->data.access_part & READ_BODY) != 0 ?
+               MAIL_READ_FULL_BLOCK_SIZE : MAIL_READ_HDR_BLOCK_SIZE;
+       i_stream_set_init_buffer_size(input, block_size);
+}
+
 int index_mail_init_stream(struct index_mail *mail,
                           struct message_size *hdr_size,
                           struct message_size *body_size,
index d0df9e2a08f7e71a40cdcc3c1d0669888f1c6bef..5ebe8b866ba3cb08068cca329f1ce17e36eb2ffe 100644 (file)
@@ -174,6 +174,7 @@ int index_mail_get_headers(struct mail *_mail, const char *field,
 int index_mail_get_header_stream(struct mail *_mail,
                                 struct mailbox_header_lookup_ctx *headers,
                                 struct istream **stream_r);
+void index_mail_set_read_buffer_size(struct mail *mail, struct istream *input);
 
 enum mail_flags index_mail_get_flags(struct mail *_mail);
 uint64_t index_mail_get_modseq(struct mail *_mail);
index 8ca6d075dd59e7579789c09bac3f3d2b47f23a25..d96c6cbb2c5c1bd8891fc59cbfcaf9b1acfa0b3f 100644 (file)
@@ -66,8 +66,8 @@ maildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail,
                return NULL;
        }
 
-       input = i_stream_create_fd(fd, MAIL_READ_BLOCK_SIZE, TRUE);
-       i_stream_set_init_buffer_size(input, MAIL_READ_BLOCK_SIZE);
+       input = i_stream_create_fd(fd, 0, TRUE);
+       index_mail_set_read_buffer_size(mail, input);
        return input;
 }
 
index 4eb05bac2ce60ecfdeb93b60691d39277379eb5f..cae619446381377a410fb51d9cec0d7bae9cad52 100644 (file)
@@ -10,6 +10,8 @@
 #include <sys/stat.h>
 #include <utime.h>
 
+#define MBOX_READ_BLOCK_SIZE (1024*4)
+
 int mbox_file_open(struct mbox_mailbox *mbox)
 {
        struct stat st;
@@ -79,9 +81,10 @@ int mbox_file_open_stream(struct mbox_mailbox *mbox)
                } else {
                        mbox->mbox_file_stream =
                                i_stream_create_fd(mbox->mbox_fd,
-                                                  MAIL_READ_BLOCK_SIZE, FALSE);
+                                                  MBOX_READ_BLOCK_SIZE,
+                                                  FALSE);
                        i_stream_set_init_buffer_size(mbox->mbox_file_stream,
-                                                     MAIL_READ_BLOCK_SIZE);
+                                                     MBOX_READ_BLOCK_SIZE);
                }
        }
 
index 69a41a3ee6bebc18ca6aa6ce140f31f9b7d2fa55..1db23731096762dfc24faf898d9386fec4b12769 100644 (file)
@@ -85,8 +85,8 @@ static int raw_mailbox_open(struct mailbox *box)
                }
                return -1;
        }
-       box->input = i_stream_create_fd(fd, MAIL_READ_BLOCK_SIZE, TRUE);
-       i_stream_set_init_buffer_size(box->input, MAIL_READ_BLOCK_SIZE);
+       box->input = i_stream_create_fd(fd, MAIL_READ_FULL_BLOCK_SIZE, TRUE);
+       i_stream_set_init_buffer_size(box->input, MAIL_READ_FULL_BLOCK_SIZE);
        return index_storage_mailbox_open(box);
 }
 
index 95b2819d45ecf708988005def6828dec2442a7ca..b49e3cfb2f74bfe7eaf4527ef4e5fd3a43b00167 100644 (file)
@@ -7,8 +7,10 @@
 #include "mail-storage-settings.h"
 #include "mail-index-private.h"
 
-/* Block size when read()ing message. */
-#define MAIL_READ_BLOCK_SIZE (1024*8)
+/* Block size when read()ing message header. */
+#define MAIL_READ_HDR_BLOCK_SIZE (1024*4)
+/* Block size when read()ing message (header and) body. */
+#define MAIL_READ_FULL_BLOCK_SIZE (1024*8)
 
 /* Called after mail storage has been created */
 extern void (*hook_mail_storage_created)(struct mail_storage *storage);