]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Avoid unnecessary pread()s at end of transaction log file.
authorTimo Sirainen <tss@iki.fi>
Wed, 6 Oct 2010 16:15:51 +0000 (17:15 +0100)
committerTimo Sirainen <tss@iki.fi>
Wed, 6 Oct 2010 16:15:51 +0000 (17:15 +0100)
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.

src/lib-index/mail-index-fsck.c
src/lib-index/mail-index-private.h
src/lib-index/mail-index-transaction.c
src/lib-index/mail-index-write.c
src/lib-index/mail-index.c
src/lib-index/mail-transaction-log-append.c
src/lib-index/mail-transaction-log-file.c
src/lib-index/mail-transaction-log-private.h
src/lib-index/mail-transaction-log.c
src/lib-index/test-mail-transaction-log-view.c

index 2ca8ba5b1beb2ad3733a777dbaa59d06612909ac..537c58fb20e4854e0d44f9343f20fedbd5c8ffbf 100644 (file)
@@ -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);
 }
index 8d6c58535e547f3ef868fdf082877cc43d3eecdb..2b97966dc02f7f2d0d30a743b7e1f885523aad16 100644 (file)
@@ -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;
index 95b0760b5fb34d1f74ac25fa42a3c7494ec75ae3..81fe7a7f856dc526a0086b2ddef2c8c93dc6a7c3 100644 (file)
@@ -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)
index 659ee1748cceace685cb4fa1045536dbe6912278..fde53da2497e8b232cc7503780b7363083798689 100644 (file)
@@ -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;
index 2d0b81237f7f54340ccdbfc3355412292483b669..6bd3a37e716cd65ab08107abcde2c4c97c6931ad 100644 (file)
@@ -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;
 
index cf099bfb3665a366cc2b9d27fcfb87ddaac3cc24..bb07bc4d6201d2634830c1acb4323048a9185245 100644 (file)
@@ -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);
index d557640674922c838b184abd52136dcc855eed8e..3fc61501cd851e59a418362f2baf345241270bdf 100644 (file)
@@ -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);
index e879c3001a54632f83bc2d404f72359aa251ffbe..4e36694f5a602a66a4dee9b78eea1c144f638c67 100644 (file)
@@ -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;
 };
 
index 6a7ec71cef3d3eb3c31d4eb5386d8af06feec3ac..5fb8080c26c7b93115ff05e86c42c3e2ad77e002 100644 (file)
@@ -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);
 }
 
index 2bfb45cc4a9b69a3d5d7a560912d3b01ec252376..1f44a7f2a042bb40de424c49826c5dda9e9d52a3 100644 (file)
@@ -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);