]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added FSYNC flag for transactions.
authorTimo Sirainen <tss@iki.fi>
Fri, 20 Mar 2009 18:05:50 +0000 (14:05 -0400)
committerTimo Sirainen <tss@iki.fi>
Fri, 20 Mar 2009 18:05:50 +0000 (14:05 -0400)
--HG--
branch : HEAD

src/lib-index/mail-index-sync.c
src/lib-index/mail-index.h
src/lib-index/mail-transaction-log-append.c

index 17df3aadd5fac7adf16cc7242aa9515403ff1946..ab36b945835de23f45c773f5a77a0e42a4e9a1f8 100644 (file)
@@ -460,6 +460,8 @@ int mail_index_sync_begin_to(struct mail_index *index,
        trans_flags = MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL;
        if ((ctx->flags & MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES) != 0)
                trans_flags |= MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES;
+       if ((ctx->flags & MAIL_INDEX_SYNC_FLAG_FSYNC) != 0)
+               trans_flags |= MAIL_INDEX_TRANSACTION_FLAG_FSYNC;
        ctx->ext_trans = mail_index_transaction_begin(ctx->view, trans_flags);
        ctx->ext_trans->sync_transaction = TRUE;
 
index dbdfbc5bb1515c2f191ffc4015f4ba271bc0f40d..3bc2007d29b493868c82dc2ae66f6e434dd9cab6 100644 (file)
@@ -114,7 +114,9 @@ enum mail_index_transaction_flags {
        /* Don't add flag updates unless they actually change something.
           This is reliable only when syncing, otherwise someone else might
           have already committed a transaction that had changed the flags. */
-       MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES  = 0x04
+       MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES  = 0x04,
+       /* fsync() this transaction (unless fsyncs are disabled) */
+       MAIL_INDEX_TRANSACTION_FLAG_FSYNC               = 0x08
 };
 
 enum mail_index_sync_type {
@@ -135,7 +137,9 @@ enum mail_index_sync_flags {
        MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES = 0x04,
        /* If there are no new transactions and nothing else to do,
           return 0 in mail_index_sync_begin() */
-       MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES    = 0x08
+       MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES    = 0x08,
+       /* Create the transaction with FSYNC flag */
+       MAIL_INDEX_SYNC_FLAG_FSYNC              = 0x10
 };
 
 enum mail_index_view_sync_flags {
index 2884f36190d55751edfd1adc945bbde08ac1a0a2..d0d4b304289badce68b15892dd8fede64c2d92e4 100644 (file)
@@ -686,7 +686,8 @@ mail_transaction_log_append_locked(struct mail_index_transaction *t,
                }
        }
 
-       want_fsync = (view->index->fsync_mask & change_mask) != 0;
+       want_fsync = (view->index->fsync_mask & change_mask) != 0 ||
+               (t->flags & MAIL_INDEX_TRANSACTION_FLAG_FSYNC) != 0;
        append_offset = file->sync_offset;
        if (log_buffer_write(&ctx, want_fsync) < 0) {
                buffer_free(&ctx.output);