mirror of
https://github.com/MariaDB/server.git
synced 2025-05-07 04:01:59 +03:00
Keep track of how many pending XIDs (transactions that are prepared in storage engine and written into binlog, but not yet durably committed on disk in the engine) there are in each binlog. When the count of one binlog drops to zero, write a new binlog checkpoint event, telling which is the oldest binlog with pending XIDs. When doing XA recovery after a crash, check the last binlog checkpoint event, and scan all binlog files from that point onwards for XIDs that must be committed if found in prepared state inside engine. Remove the code in binlog rotation that waits for all prepared XIDs to be committed before writing a new binlog file (this is no longer necessary when recovery can scan multiple binlog files).
135 lines
4.0 KiB
Plaintext
135 lines
4.0 KiB
Plaintext
# See if slave restarts the transaction after failing on an InnoDB deadlock error.
|
|
|
|
# Note: testing what happens when too many retries is possible, but
|
|
# needs large waits when running with --debug, so we don't do it.
|
|
# The same way, this test may not test what is expected when run
|
|
# under Valgrind, timings are too short then (with --valgrind I
|
|
# (Guilhem) have seen the test manage to provoke lock wait timeout
|
|
# error but not deadlock error; that is ok as code deals with the two
|
|
# errors in exactly the same way.
|
|
|
|
--source include/master-slave.inc
|
|
|
|
# 0) Prepare tables and data
|
|
--echo *** Prepare tables and data ***
|
|
|
|
connection master;
|
|
eval CREATE TABLE t1 (a INT NOT NULL, KEY(a)) ENGINE=$engine_type;
|
|
eval CREATE TABLE t2 (a INT) ENGINE=$engine_type;
|
|
eval CREATE TABLE t3 (a INT NOT NULL, KEY(a)) ENGINE=$engine_type;
|
|
sync_slave_with_master;
|
|
|
|
SHOW CREATE TABLE t1;
|
|
SHOW CREATE TABLE t2;
|
|
SHOW CREATE TABLE t3;
|
|
SHOW VARIABLES LIKE 'slave_transaction_retries';
|
|
--source include/stop_slave.inc
|
|
|
|
connection master;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (1);
|
|
# We make a long transaction here
|
|
INSERT INTO t2 VALUES (2), (2), (2), (2), (2), (2), (2), (2), (2), (2);
|
|
INSERT INTO t3 VALUES (3);
|
|
COMMIT;
|
|
save_master_pos;
|
|
# Save BEGIN event into variable
|
|
let $master_pos_begin= query_get_value(SHOW BINLOG EVENTS, Pos, 6);
|
|
--echo
|
|
|
|
# 1) Test deadlock
|
|
# Block slave SQL thread, wait retries of transaction, unlock slave before lock timeout
|
|
--echo *** Test deadlock ***
|
|
|
|
connection slave;
|
|
BEGIN;
|
|
SELECT * FROM t1 FOR UPDATE;
|
|
# Save variable 'Slave_retried_transactions' before deadlock
|
|
let $slave_retried_transactions= query_get_value(SHOW GLOBAL STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
|
START SLAVE;
|
|
# Wait until SQL thread blocked: variable 'Slave_retried_transactions' will incremented
|
|
let $status_var= Slave_retried_transactions;
|
|
let $status_var_value= $slave_retried_transactions;
|
|
let $status_type= GLOBAL;
|
|
let $status_var_comparsion= >;
|
|
--source include/wait_for_status_var.inc
|
|
SELECT COUNT(*) FROM t2;
|
|
COMMIT;
|
|
sync_with_master;
|
|
|
|
# Check the data
|
|
SELECT * FROM t1;
|
|
SELECT * FROM t3;
|
|
# Check that no error is reported
|
|
source include/check_slave_is_running.inc;
|
|
--echo
|
|
|
|
# 2) Test lock wait timeout
|
|
# Block slave and wait lock timeout error
|
|
--echo *** Test lock wait timeout ***
|
|
|
|
connection slave;
|
|
--source include/stop_slave.inc
|
|
DELETE FROM t2;
|
|
# Set slave position to the BEGIN log event
|
|
--replace_result $master_pos_begin <master_pos_begin>
|
|
eval CHANGE MASTER TO MASTER_LOG_POS=$master_pos_begin;
|
|
BEGIN;
|
|
# Hold lock
|
|
SELECT * FROM t1 FOR UPDATE;
|
|
# Wait until slave stopped with error 'Lock wait timeout exceeded'
|
|
START SLAVE;
|
|
let $slave_sql_errno= 1205;
|
|
--source include/wait_for_slave_sql_error.inc
|
|
SELECT COUNT(*) FROM t2;
|
|
COMMIT;
|
|
--source include/start_slave.inc
|
|
sync_with_master;
|
|
# Check data from tables
|
|
SELECT * FROM t1;
|
|
SELECT * FROM t3;
|
|
# Check that no error is reported
|
|
source include/check_slave_is_running.inc;
|
|
--echo
|
|
|
|
# 3) Test lock wait timeout and purged relay log
|
|
# Set max_relay_log_size=0, block slave and wait lock timeout error.
|
|
# Restart slave and check that no erros appear
|
|
--echo *** Test lock wait timeout and purged relay logs ***
|
|
|
|
connection slave;
|
|
SET @my_max_relay_log_size= @@global.max_relay_log_size;
|
|
SET global max_relay_log_size=0;
|
|
--source include/stop_slave.inc
|
|
DELETE FROM t2;
|
|
# Set slave position to the BEGIN log event
|
|
--replace_result $master_pos_begin <master_pos_begin>
|
|
eval CHANGE MASTER TO MASTER_LOG_POS=$master_pos_begin;
|
|
BEGIN;
|
|
# Hold lock
|
|
SELECT * FROM t1 FOR UPDATE;
|
|
# Wait until slave stopped with error 'Lock wait timeout exceeded'
|
|
START SLAVE;
|
|
let $slave_sql_errno= 1205;
|
|
--source include/wait_for_slave_sql_error.inc
|
|
SELECT COUNT(*) FROM t2;
|
|
COMMIT;
|
|
--source include/start_slave.inc
|
|
sync_with_master;
|
|
# Check data from tables
|
|
SELECT * FROM t1;
|
|
SELECT * FROM t3;
|
|
# Check that no error is reported
|
|
source include/check_slave_is_running.inc;
|
|
--echo
|
|
|
|
# Clean up
|
|
--echo *** Clean up ***
|
|
connection master;
|
|
DROP TABLE t1,t2,t3;
|
|
sync_slave_with_master;
|
|
SET global max_relay_log_size= @my_max_relay_log_size;
|
|
|
|
--echo End of 5.1 tests
|
|
--source include/rpl_end.inc
|