From: Timo Sirainen Date: Wed, 6 Oct 2010 16:15:51 +0000 (+0100) Subject: lib-index: Avoid unnecessary pread()s at end of transaction log file. X-Git-Tag: 2.0.6~87 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=07e80e04c8876b6bf3f95266f48b41e1a681e445;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Avoid unnecessary pread()s at end of transaction log file. If we've already read until EOF while the file has been locked, there's no need to do it again. Previously this worked while index was being synced, but not while committing a transaction. --- diff --git a/src/lib-index/mail-index-fsck.c b/src/lib-index/mail-index-fsck.c index 2ca8ba5b1b..537c58fb20 100644 --- a/src/lib-index/mail-index-fsck.c +++ b/src/lib-index/mail-index-fsck.c @@ -424,7 +424,7 @@ mail_index_fsck_map(struct mail_index *index, struct mail_index_map *map) int mail_index_fsck(struct mail_index *index) { - bool orig_locked = index->log_locked; + bool orig_locked = index->log_sync_locked; struct mail_index_map *map; uint32_t file_seq; uoff_t file_offset; @@ -465,7 +465,7 @@ void mail_index_fsck_locked(struct mail_index *index) { int ret; - i_assert(index->log_locked); + i_assert(index->log_sync_locked); ret = mail_index_fsck(index); i_assert(ret == 0); } diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index 8d6c58535e..2b97966dc0 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -230,7 +230,7 @@ struct mail_index { unsigned int index_delete_requested:1; /* next sync sets it deleted */ unsigned int index_deleted:1; /* no changes allowed anymore */ - unsigned int log_locked:1; + unsigned int log_sync_locked:1; unsigned int readonly:1; unsigned int mapping:1; unsigned int syncing:1; diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index 95b0760b5f..81fe7a7f85 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -109,7 +109,7 @@ mail_transaction_log_file_refresh(struct mail_index_transaction *t, } file = t->view->index->log->head; - if (!t->view->index->log_locked) { + if (!t->view->index->log_sync_locked) { /* update sync_offset */ if (mail_transaction_log_file_map(file, file->sync_offset, (uoff_t)-1) <= 0) diff --git a/src/lib-index/mail-index-write.c b/src/lib-index/mail-index-write.c index 659ee1748c..fde53da249 100644 --- a/src/lib-index/mail-index-write.c +++ b/src/lib-index/mail-index-write.c @@ -185,7 +185,7 @@ void mail_index_write(struct mail_index *index, bool want_rotate) unsigned int lock_id; int ret; - i_assert(index->log_locked); + i_assert(index->log_sync_locked); if (!mail_index_map_has_changed(map) || index->readonly) return; diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 2d0b81237f..6bd3a37e71 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -516,7 +516,7 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags) index->readonly = FALSE; index->nodiskspace = FALSE; index->index_lock_timeout = FALSE; - index->log_locked = FALSE; + index->log_sync_locked = FALSE; index->flags = flags; index->readonly = (flags & MAIL_INDEX_OPEN_FLAG_READONLY) != 0; diff --git a/src/lib-index/mail-transaction-log-append.c b/src/lib-index/mail-transaction-log-append.c index cf099bfb36..bb07bc4d62 100644 --- a/src/lib-index/mail-transaction-log-append.c +++ b/src/lib-index/mail-transaction-log-append.c @@ -206,7 +206,7 @@ int mail_transaction_log_append_begin(struct mail_index *index, bool external, { struct mail_transaction_log_append_ctx *ctx; - if (!index->log_locked) { + if (!index->log_sync_locked) { if (mail_transaction_log_lock_head(index->log) < 0) return -1; } @@ -228,7 +228,7 @@ int mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx ** *_ctx = NULL; ret = mail_transaction_log_append_locked(ctx); - if (!index->log_locked) + if (!index->log_sync_locked) mail_transaction_log_file_unlock(index->log->head); buffer_free(&ctx->output); diff --git a/src/lib-index/mail-transaction-log-file.c b/src/lib-index/mail-transaction-log-file.c index d557640674..3fc61501cd 100644 --- a/src/lib-index/mail-transaction-log-file.c +++ b/src/lib-index/mail-transaction-log-file.c @@ -369,6 +369,7 @@ void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file) return; file->locked = FALSE; + file->locked_sync_offset_updated = FALSE; if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) return; @@ -1552,7 +1553,7 @@ int mail_transaction_log_file_map(struct mail_transaction_log_file *file, i_assert(start_offset >= file->hdr.hdr_size); i_assert(start_offset <= end_offset); - if (index->log_locked && file == file->log->head && + if (file->locked_sync_offset_updated && file == file->log->head && end_offset == (uoff_t)-1) { /* we're not interested of going further than sync_offset */ if (log_file_map_check_offsets(file, start_offset, @@ -1562,6 +1563,9 @@ int mail_transaction_log_file_map(struct mail_transaction_log_file *file, end_offset = file->sync_offset; } + if (file->locked) + file->locked_sync_offset_updated = TRUE; + if (file->buffer != NULL && file->buffer_offset <= start_offset) { /* see if we already have it */ size = buffer_get_used_size(file->buffer); diff --git a/src/lib-index/mail-transaction-log-private.h b/src/lib-index/mail-transaction-log-private.h index e879c3001a..4e36694f5a 100644 --- a/src/lib-index/mail-transaction-log-private.h +++ b/src/lib-index/mail-transaction-log-private.h @@ -76,6 +76,7 @@ struct mail_transaction_log_file { time_t lock_created; unsigned int locked:1; + unsigned int locked_sync_offset_updated:1; unsigned int corrupted:1; }; diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 6a7ec71cef..5fb8080c26 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -466,7 +466,7 @@ int mail_transaction_log_lock_head(struct mail_transaction_log *log) int mail_transaction_log_sync_lock(struct mail_transaction_log *log, uint32_t *file_seq_r, uoff_t *file_offset_r) { - i_assert(!log->index->log_locked); + i_assert(!log->index->log_sync_locked); if (mail_transaction_log_lock_head(log) < 0) return -1; @@ -478,7 +478,7 @@ int mail_transaction_log_sync_lock(struct mail_transaction_log *log, return -1; } - log->index->log_locked = TRUE; + log->index->log_sync_locked = TRUE; *file_seq_r = log->head->hdr.file_seq; *file_offset_r = log->head->sync_offset; return 0; @@ -486,9 +486,9 @@ int mail_transaction_log_sync_lock(struct mail_transaction_log *log, void mail_transaction_log_sync_unlock(struct mail_transaction_log *log) { - i_assert(log->index->log_locked); + i_assert(log->index->log_sync_locked); - log->index->log_locked = FALSE; + log->index->log_sync_locked = FALSE; mail_transaction_log_file_unlock(log->head); } diff --git a/src/lib-index/test-mail-transaction-log-view.c b/src/lib-index/test-mail-transaction-log-view.c index 2bfb45cc4a..1f44a7f2a0 100644 --- a/src/lib-index/test-mail-transaction-log-view.c +++ b/src/lib-index/test-mail-transaction-log-view.c @@ -126,7 +126,7 @@ static void test_mail_transaction_log_view(void) log = i_new(struct mail_transaction_log, 1); log->index = i_new(struct mail_index, 1); log->index->log = log; - log->index->log_locked = TRUE; + log->index->log_sync_locked = TRUE; test_transaction_log_file_add(1); test_transaction_log_file_add(2); test_transaction_log_file_add(3);