dovecot-2.0: lib-index: If transaction log file is small enough,...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Sep 29 20:09:33 EEST 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/062da0b83c01
changeset: 12204:062da0b83c01
user: Timo Sirainen <tss at iki.fi>
date: Wed Sep 29 18:09:28 2010 +0100
description:
lib-index: If transaction log file is small enough, just read all of it to memory immediately.
diffstat:
src/lib-index/mail-transaction-log-file.c | 38 +++++++++++++++----
1 files changed, 30 insertions(+), 8 deletions(-)
diffs (62 lines):
diff -r 49bd77c018bd -r 062da0b83c01 src/lib-index/mail-transaction-log-file.c
--- a/src/lib-index/mail-transaction-log-file.c Wed Sep 29 17:15:12 2010 +0100
+++ b/src/lib-index/mail-transaction-log-file.c Wed Sep 29 18:09:28 2010 +0100
@@ -390,21 +390,42 @@
static ssize_t
mail_transaction_log_file_read_header(struct mail_transaction_log_file *file)
{
- ssize_t pos, ret;
+ void *dest;
+ size_t pos, dest_size;
+ ssize_t ret;
+
+ i_assert(file->buffer == NULL && file->mmap_base == NULL);
memset(&file->hdr, 0, sizeof(file->hdr));
+ if (file->last_size < mmap_get_page_size() && file->last_size > 0) {
+ /* just read the entire transaction log to memory */
+ file->buffer = buffer_create_dynamic(default_pool, 4096);
+ file->buffer_offset = 0;
+ dest_size = file->last_size;
+ dest = buffer_append_space_unsafe(file->buffer, dest_size);
+ } else {
+ /* read only the header */
+ dest = &file->hdr;
+ dest_size = sizeof(file->hdr);
+ }
- /* try to read the whole header, but it's not necessarily an error to
- read less since the older versions of the log format could be
- smaller. */
+ /* it's not necessarily an error to read less than wanted header size,
+ since older versions of the log format used smaller headers. */
pos = 0;
do {
- ret = pread(file->fd, PTR_OFFSET(&file->hdr, pos),
- sizeof(file->hdr) - pos, pos);
+ ret = pread(file->fd, PTR_OFFSET(dest, pos),
+ dest_size - pos, pos);
if (ret > 0)
pos += ret;
- } while (ret > 0 && pos < (ssize_t)sizeof(file->hdr));
- return ret < 0 ? -1 : pos;
+ } while (ret > 0 && pos < dest_size);
+
+ if (file->buffer != NULL) {
+ buffer_set_used_size(file->buffer, pos);
+ memcpy(&file->hdr, file->buffer->data,
+ I_MIN(pos, sizeof(file->hdr)));
+ }
+
+ return ret < 0 ? -1 : (ssize_t)pos;
}
static int
@@ -598,6 +619,7 @@
}
} else {
file->fd = fd;
+ file->last_size = 0;
if (mail_transaction_log_file_read_hdr(file,
FALSE) > 0 &&
mail_transaction_log_file_stat(file, FALSE) == 0) {
More information about the dovecot-cvs
mailing list