mirror of
https://github.com/MariaDB/server.git
synced 2025-08-18 17:42:20 +03:00
InnoDB could return the same list again and again if the buffer passed to trx_recover_for_mysql() is smaller than the number of transactions that InnoDB recovered in XA PREPARE state. We introduce the transaction state TRX_PREPARED_RECOVERED, which is like TRX_PREPARED, but will be set during trx_recover_for_mysql() so that each transaction will only be returned once. Because init_server_components() is invoking ha_recover() twice, we must reset the state of the transactions back to TRX_PREPARED after returning the complete list, so that repeated traversals will see the complete list again, instead of seeing an empty list. Without this tweak, the test main.tc_heuristic_recover would hang in MariaDB 10.1.
46 lines
1.0 KiB
Plaintext
46 lines
1.0 KiB
Plaintext
-- source include/have_innodb.inc
|
|
-- source include/have_debug.inc
|
|
-- source include/not_embedded.inc
|
|
|
|
call mtr.add_suppression("Found 50 prepared XA transactions");
|
|
create table t1 (a int) engine=innodb;
|
|
insert into t1 values(1);
|
|
|
|
let $trial = 50;
|
|
while ($trial)
|
|
{
|
|
--connect (con$trial, localhost, root,,)
|
|
let $st_pre = `select concat('test', $trial)`;
|
|
eval xa start '$st_pre';
|
|
insert into t1 values(1);
|
|
eval xa end '$st_pre';
|
|
eval xa prepare '$st_pre';
|
|
dec $trial;
|
|
}
|
|
|
|
connection default;
|
|
# Kill and restart the server.
|
|
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
-- shutdown_server 0
|
|
-- source include/wait_until_disconnected.inc
|
|
|
|
-- exec echo "restart:--debug_dbug=+d,min_xa_len" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
-- enable_reconnect
|
|
-- source include/wait_until_connected_again.inc
|
|
-- disable_reconnect
|
|
--sorted_result
|
|
xa recover;
|
|
--sorted_result
|
|
xa recover;
|
|
--disable_query_log
|
|
let $trial = 50;
|
|
while ($trial)
|
|
{
|
|
let $st_pre = `select concat('test', $trial)`;
|
|
eval xa commit '$st_pre';
|
|
dec $trial;
|
|
}
|
|
--enable_query_log
|
|
xa recover;
|
|
drop table t1;
|