So you're in this context
1 innobase_commit_by_xid(
18 thd_binlog_pos(thd, &trx->mysql_log_file_name, 19 &trx->mysql_log_offset); 20 if (trx->mysql_log_offset > 0) 21 trx->flush_log_later = true;
and actually considering `trx->mysql_log_offset` as the return value?
Could you please expand on?
My point was just, that what we want to do here is for the (internal) transaction coordinator to tell the storage engine that the engine does not need to fsync() for the commit to be durable, another fsync was already done to ensure this. This is what we in the normal commit path do by calling commit_ordered(), as documented sql/handler.h.
The thd_binlog_pos() is completely unrelated, it's a way for the storage...
I see your point. My patch's block of if (trx_t* trx = trx_get_trx_by_xid(xid)) { + THD *thd = current_thd; + if (thd) + thd_binlog_pos(thd, &trx->mysql_log_file_name, + &trx->mysql_log_offset); + if (trx->mysql_log_offset > 0) + trx->flush_log_later = true; + /* use cases are: disconnected xa, slave xa, recovery */ innobase_commit_low(trx); + trx->mysql_log_file_name = NULL; should not indeed rely on anything that thd_binlog_pos() computes. I think I wanted to spare --skip-log-bin setups from the flush_log_later policy. I see now that alternatively thd_binlog_format(thd) could be used which will always return BINLOG_FORMAT_UNSPEC when that's the case (or @@skip_log_bin=1). You think it's better to covert the block to use that?