mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
MDEV-15740: InnoDB does not flush redo log when it shoul
During database recovery, a transaction with wsrep XID is recovered from InnoDB in prepared state. However, when the transaction is looked up with trx_get_trx_by_xid() in innobase_commit_by_xid(), trx->xid gets cleared in trx_get_trx_by_xid_low() and commit time serialization history write does not update the wsrep XID in trx sys header for that recovered trx. As a result the transaction gets committed during recovery but the wsrep position does not get updated appropriately. As a fix, we preserve trx->xid for Galera over transaction commit in recovery phase. Fix authored by: Teemu Ollakka (GaleraCluster) and Marko Mäkelä. modified: mysql-test/suite/galera/disabled.def modified: mysql-test/suite/galera/r/galera_gcache_recover_full_gcache.result modified: mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result modified: mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.test modified: mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test modified: storage/innobase/trx/trx0trx.cc modified: storage/xtradb/trx/trx0trx.cc
This commit is contained in:
parent
7158edcba3
commit
1d56d875fe
7 changed files with 30 additions and 3 deletions
|
|
@ -2300,6 +2300,12 @@ trx_get_trx_by_xid_low(
|
|||
&& memcmp(xid->data, trx->xid.data,
|
||||
xid->gtrid_length + xid->bqual_length) == 0) {
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
/* The commit of a prepared recovered Galera
|
||||
transaction needs a valid trx->xid for
|
||||
invoking trx_sys_update_wsrep_checkpoint(). */
|
||||
if (wsrep_is_wsrep_xid(&trx->xid)) break;
|
||||
#endif
|
||||
/* Invalidate the XID, so that subsequent calls
|
||||
will not find it. */
|
||||
trx->xid.null();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue