maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #13048
Re: 9ea85a70a75: MDEV-24654 GTID event falsely marked transactional
Hi, Andrei!
On Jan 10, Andrei Elkin wrote:
> revision-id: 9ea85a70a75 (mariadb-10.2.40-4-g9ea85a70a75)
> parent(s): 160d97a4aaa
> author: Andrei Elkin
> committer: Andrei Elkin
> timestamp: 2021-08-08 14:20:57 +0300
> message:
>
> MDEV-24654 GTID event falsely marked transactional
>
> GTID event can be falsely marked transactional in few cases including
> binary-logging on the slave side upon execution.
> In some execution branches bin-logging of non-transactional
> events can be done through transactional cache. E.g see comments
> in THD::binlog_write_table_map().
I saw that and still couldn't understand why bin-logging of
non-transactional events can be done through transactional cache.
> In order to not create the false 'trans' tag the fact of Xid event
> logging is checked to compute correct argument to Gtid_log_event
> ctor.
This is wrong. Transactions only end with a Xid event if all
participating engines support XA. Try to create an InnoDB+FederatedX
transaction (I just did) and it'll end with Query_log_event("COMMIT")
> diff --git a/sql/log.cc b/sql/log.cc
> index 1d9b4645421..7fef2e0d739 100644
> --- a/sql/log.cc
> +++ b/sql/log.cc
> @@ -8118,9 +8118,11 @@ MYSQL_BIN_LOG::write_transaction_or_stmt(group_commit_entry *entry,
> uint64 commit_id)
> {
> binlog_cache_mngr *mngr= entry->cache_mngr;
> + bool has_xid= entry->end_event->get_type_code() == XID_EVENT;
> DBUG_ENTER("MYSQL_BIN_LOG::write_transaction_or_stmt");
>
> - if (write_gtid_event(entry->thd, false, entry->using_trx_cache, commit_id))
> + if (write_gtid_event(entry->thd, false,
> + entry->using_trx_cache && has_xid, commit_id))
> DBUG_RETURN(ER_ERROR_ON_WRITE);
>
> if (entry->using_stmt_cache && !mngr->stmt_cache.empty() &&
>
Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx