dovecot-2.2: lib-index: Don't update log_file_tail_offset unnece...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jul 7 13:23:34 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/16d4cf2c0d65
changeset: 17609:16d4cf2c0d65
user: Timo Sirainen <tss at iki.fi>
date: Mon Jul 07 16:21:08 2014 +0300
description:
lib-index: Don't update log_file_tail_offset unnecessarily.
Update it only if we're already writing to transaction log anyway or if
we're required to update the offset because mail_index_sync_commit() has
increased it past non-external transactions (this is especially important
with mdbox map index).
diffstat:
src/lib-index/mail-index-sync.c | 7 ++++-
src/lib-index/mail-index-transaction-export.c | 8 +-----
src/lib-index/mail-index-transaction-private.h | 1 +
src/lib-index/mail-index-transaction-update.c | 1 +
src/lib-index/mail-transaction-log-append.c | 27 ++++++++++++++++++-----
src/lib-index/mail-transaction-log-file.c | 16 +------------
src/lib-index/mail-transaction-log.h | 5 +++-
src/lib-index/test-mail-transaction-log-append.c | 2 +-
8 files changed, 37 insertions(+), 30 deletions(-)
diffs (162 lines):
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-index-sync.c Mon Jul 07 16:21:08 2014 +0300
@@ -751,9 +751,12 @@
mail_transaction_log_set_mailbox_sync_pos(ctx->index->log, seq, offset);
/* If tail offset has changed, make sure it gets written to
- transaction log. */
- if (ctx->last_tail_offset != offset)
+ transaction log. do this only if we're required to changes. */
+ if (ctx->last_tail_seq != seq ||
+ ctx->last_tail_offset < offset) {
ctx->ext_trans->log_updates = TRUE;
+ ctx->ext_trans->tail_offset_changed = TRUE;
+ }
}
static bool mail_index_sync_want_index_write(struct mail_index *index)
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-index-transaction-export.c
--- a/src/lib-index/mail-index-transaction-export.c Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-index-transaction-export.c Mon Jul 07 16:21:08 2014 +0300
@@ -476,12 +476,8 @@
&null4, 4);
}
- /* Update the tail offsets only when committing the sync transaction.
- Other transactions may not know the latest tail offset and might
- end up shrinking it. (Alternatively the shrinking tail offsets could
- just be ignored, which would probably work fine too.) */
- append_ctx->append_sync_offset = t->sync_transaction;
-
+ append_ctx->index_sync_transaction = t->sync_transaction;
+ append_ctx->tail_offset_changed = t->tail_offset_changed;
append_ctx->want_fsync =
(t->view->index->fsync_mask & change_mask) != 0 ||
(t->flags & MAIL_INDEX_TRANSACTION_FLAG_FSYNC) != 0;
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-index-transaction-private.h
--- a/src/lib-index/mail-index-transaction-private.h Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-index-transaction-private.h Mon Jul 07 16:21:08 2014 +0300
@@ -93,6 +93,7 @@
unsigned int index_deleted:1;
unsigned int index_undeleted:1;
unsigned int commit_deleted_index:1;
+ unsigned int tail_offset_changed:1;
/* non-extension updates. flag updates don't change this because
they may be added and removed, so be sure to check that the updates
array is non-empty also. */
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-index-transaction-update.c
--- a/src/lib-index/mail-index-transaction-update.c Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-index-transaction-update.c Mon Jul 07 16:21:08 2014 +0300
@@ -101,6 +101,7 @@
t->index_undeleted = FALSE;
t->log_updates = FALSE;
t->log_ext_updates = FALSE;
+ t->tail_offset_changed = FALSE;
}
void mail_index_transaction_set_log_updates(struct mail_index_transaction *t)
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-transaction-log-append.c
--- a/src/lib-index/mail-transaction-log-append.c Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-transaction-log-append.c Mon Jul 07 16:21:08 2014 +0300
@@ -122,9 +122,22 @@
buffer_t buf;
unsigned char update_data[sizeof(*u) + sizeof(offset)];
- if (file->max_tail_offset == file->sync_offset) {
- if (ctx->output->used == 0 &&
- file->saved_tail_offset == file->max_tail_offset) {
+ if (!ctx->index_sync_transaction) {
+ /* this is a non-syncing transaction. update the tail offset
+ only if we're already writing something else to transaction
+ log anyway. */
+ i_assert(!ctx->tail_offset_changed);
+ /* FIXME: For now we never do this update, because it would
+ cause errors about shrinking tail offsets with old Dovecot
+ versions. This is anyway just an optimization, so it doesn't
+ matter all that much if we don't do it here. Finish this
+ in v2.3. */
+ /*if (ctx->output->used == 0)*/
+ return;
+ } else if (file->max_tail_offset == file->sync_offset) {
+ /* we're synced all the way to tail offset, so this sync
+ transaction can also be included in the same tail offset. */
+ if (ctx->output->used == 0 && !ctx->tail_offset_changed) {
/* nothing to write here after all (e.g. all unchanged
flag updates were dropped by export) */
return;
@@ -137,6 +150,10 @@
file->max_tail_offset += ctx->output->used +
sizeof(*hdr) + sizeof(*u) + sizeof(offset);
ctx->sync_includes_this = TRUE;
+ } else {
+ /* This is a syncing transaction. Since we're finishing a sync,
+ we may need to update the tail offset even if we don't have
+ anything else to do. */
}
offset = file->max_tail_offset;
@@ -189,9 +206,7 @@
buffer_delete(ctx->output, 0, boundary_size);
}
- if (ctx->append_sync_offset)
- log_append_sync_offset_if_needed(ctx);
-
+ log_append_sync_offset_if_needed(ctx);
if (log_buffer_write(ctx) < 0)
return -1;
file->sync_highest_modseq = ctx->new_highest_modseq;
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-transaction-log-file.c
--- a/src/lib-index/mail-transaction-log-file.c Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-transaction-log-file.c Mon Jul 07 16:21:08 2014 +0300
@@ -957,20 +957,8 @@
sizeof(tail_offset));
if (tail_offset < file->saved_tail_offset) {
- if (file->sync_offset < file->saved_tail_sync_offset) {
- /* saved_tail_offset was already set in header,
- but we still had to resync the file to find
- modseqs. ignore this record. */
- return 1;
- }
- mail_index_set_error(file->log->index,
- "Transaction log file %s seq %u: "
- "log_file_tail_offset update shrank it "
- "(%u vs %"PRIuUOFF_T" "
- "sync_offset=%"PRIuUOFF_T")",
- file->filepath, file->hdr.file_seq,
- tail_offset, file->saved_tail_offset,
- file->sync_offset);
+ /* ignore shrinking tail offsets */
+ return 1;
} else {
file->saved_tail_offset = tail_offset;
if (tail_offset > file->max_tail_offset)
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/mail-transaction-log.h
--- a/src/lib-index/mail-transaction-log.h Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/mail-transaction-log.h Mon Jul 07 16:21:08 2014 +0300
@@ -176,7 +176,10 @@
uint64_t new_highest_modseq;
unsigned int transaction_count;
- unsigned int append_sync_offset:1;
+ /* same as mail_index_transaction->sync_transaction */
+ unsigned int index_sync_transaction:1;
+ /* same as mail_index_transaction->tail_offset_changed */
+ unsigned int tail_offset_changed:1;
unsigned int sync_includes_this:1;
unsigned int want_fsync:1;
};
diff -r 6b512716b37e -r 16d4cf2c0d65 src/lib-index/test-mail-transaction-log-append.c
--- a/src/lib-index/test-mail-transaction-log-append.c Mon Jul 07 13:24:22 2014 +0300
+++ b/src/lib-index/test-mail-transaction-log-append.c Mon Jul 07 16:21:08 2014 +0300
@@ -97,7 +97,7 @@
test_begin("transaction log append: append_sync_offset only");
test_assert(mail_transaction_log_append_begin(log->index, 0, &ctx) == 0);
- ctx->append_sync_offset = TRUE;
+ ctx->index_sync_transaction = TRUE;
file->max_tail_offset = 123;
test_assert(mail_transaction_log_append_commit(&ctx) == 0);
More information about the dovecot-cvs
mailing list