From: Timo Sirainen Date: Thu, 13 Aug 2009 16:46:28 +0000 (-0400) Subject: Use separate read block sizes when reading only message header vs. full message. X-Git-Tag: 2.0.alpha1~273 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=573f0491a5733fe21fa062a455acb4790b4e0499;p=thirdparty%2Fdovecot%2Fcore.git Use separate read block sizes when reading only message header vs. full message. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index 06d2071d2f..cc8e7254f7 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -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); diff --git a/src/lib-storage/index/dbox/dbox-file.c b/src/lib-storage/index/dbox/dbox-file.c index ae2a5f246a..5d83df9900 100644 --- a/src/lib-storage/index/dbox/dbox-file.c +++ b/src/lib-storage/index/dbox/dbox-file.c @@ -23,6 +23,8 @@ #include #include +#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); } diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index d3083beb36..7588bbae2f 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -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, diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index d0df9e2a08..5ebe8b866b 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -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); diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 8ca6d075dd..d96c6cbb2c 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -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; } diff --git a/src/lib-storage/index/mbox/mbox-file.c b/src/lib-storage/index/mbox/mbox-file.c index 4eb05bac2c..cae6194463 100644 --- a/src/lib-storage/index/mbox/mbox-file.c +++ b/src/lib-storage/index/mbox/mbox-file.c @@ -10,6 +10,8 @@ #include #include +#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); } } diff --git a/src/lib-storage/index/raw/raw-storage.c b/src/lib-storage/index/raw/raw-storage.c index 69a41a3ee6..1db2373109 100644 --- a/src/lib-storage/index/raw/raw-storage.c +++ b/src/lib-storage/index/raw/raw-storage.c @@ -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); } diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 95b2819d45..b49e3cfb2f 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -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);