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;
/* 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 {
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 {
}
}
- 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);