mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
d57a0e52ac
- Fixed problem, only detect comment if the # is on start of line AND starting line of the current command. - Wrote tests for most of the mysqltest commands, added stricter checking of correct syntax. client/mysqltest.c: Updated mysql test to do stricter checking of syntax. For example when the number of arguments to a command is known, everything else is "junk" => die. Better checking of argument types. Added better debug printouts. Added improved printouts when wrong syntax is detected. Fix two bugs where mysqltest could not detect end of comamnd properly, as described in bug#11316 Fix segfault when performing too many source commands. Fix segfault when doing too many while loop levels. Add printout of line number in die Remove lineno and \n in all strings passed to die function. Decrese BLOCK_STACK_DEPTH from 32 to 16, does any test use more than 1 level? mysql-test/mysql-test-run.pl: export MYSQL_TEST environment variable, used from msyqltest.test mysql-test/mysql-test-run.sh: export MYSQL_TEST environment variable, used from msyqltest.test mysql-test/r/mysqltest.result: Updated test results mysql-test/r/rpl_flush_log_loop.result: Updated test result. Approved by lars mysql-test/t/innodb-deadlock.test: Correct wrong syntax Superfluos ; mysql-test/t/innodb-lock.test: Correct wrong syntax Superfluos ; mysql-test/t/mysqltest.test: Add several new tests for mysqltest. Foxus on detecting wrong syntax in test files. Use exec with expected error to execute test scripts that will kill mysqltest Change some negative test that were previously commented out to use the above method. mysql-test/t/ndb_autodiscover2.test: Correct wrong syntax Superfluos ; mysql-test/t/rpl_change_master.test: Correct wrong syntax Superfluos ; mysql-test/t/rpl_deadlock.test: Correct wrong syntax Superfluos ; mysql-test/t/rpl_drop_temp.test: Correct wrong syntax Superfluos ; mysql-test/t/rpl_flush_log_loop.test: Fix after detecting wrong syntax, missing ; Discussed with lars. mysql-test/t/rpl_insert_id.test: Missing ; mysql-test/t/rpl_rotate_logs.test: Correct wrong syntax Superfluos ; mysql-test/t/rpl_until.test: Missing delimiter mysql-test/include/mysqltest_while.inc: New file to test too many while levels
111 lines
2.9 KiB
Text
111 lines
2.9 KiB
Text
# 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.
|
|
# We don't 'show status like 'slave_retried_transactions'' because this
|
|
# is not repeatable (depends on sleeps).
|
|
|
|
source include/have_innodb.inc;
|
|
source include/master-slave.inc;
|
|
|
|
connection master;
|
|
create table t1 (a int not null, key(a)) engine=innodb;
|
|
create table t2 (a int not null, key(a)) engine=innodb;
|
|
create table t3 (a int) engine=innodb;
|
|
create table t4 (a int) engine=innodb;
|
|
show variables like 'slave_transaction_retries';
|
|
sync_slave_with_master;
|
|
|
|
show create table t1;
|
|
show create table t2;
|
|
show variables like 'slave_transaction_retries';
|
|
stop slave;
|
|
|
|
# 1) Test deadlock
|
|
|
|
connection master;
|
|
begin;
|
|
# Let's keep BEGIN and the locked statement in two different relay logs.
|
|
let $1=200;
|
|
disable_query_log;
|
|
while ($1)
|
|
{
|
|
eval insert into t3 values( $1 );
|
|
dec $1;
|
|
}
|
|
enable_query_log;
|
|
insert into t3 select * from t2 for update;
|
|
insert into t1 values(1);
|
|
commit;
|
|
save_master_pos;
|
|
|
|
connection slave;
|
|
begin;
|
|
# Let's make our transaction large so that it's slave who is chosen as
|
|
# victim
|
|
let $1=1000;
|
|
disable_query_log;
|
|
while ($1)
|
|
{
|
|
eval insert into t4 values( $1 );
|
|
dec $1;
|
|
}
|
|
enable_query_log;
|
|
select * from t1 for update;
|
|
start slave;
|
|
--sleep 3 # hope that slave is blocked now
|
|
insert into t2 values(22); # provoke deadlock, slave should be victim
|
|
commit;
|
|
sync_with_master;
|
|
select * from t1; # check that slave succeeded finally
|
|
select * from t2;
|
|
# check that no error is reported
|
|
--replace_column 1 # 8 # 9 # 23 # 33 #
|
|
--replace_result $MASTER_MYPORT MASTER_MYPORT
|
|
show slave status;
|
|
|
|
# 2) Test lock wait timeout
|
|
|
|
stop slave;
|
|
change master to master_log_pos=401; # the BEGIN log event
|
|
begin;
|
|
select * from t2 for update; # hold lock
|
|
start slave;
|
|
--sleep 10 # slave should have blocked, and be retrying
|
|
commit;
|
|
sync_with_master;
|
|
select * from t1; # check that slave succeeded finally
|
|
select * from t2;
|
|
# check that no error is reported
|
|
--replace_column 1 # 8 # 9 # 23 # 33 #
|
|
--replace_result $MASTER_MYPORT MASTER_MYPORT
|
|
show slave status;
|
|
|
|
# Now we repeat 2), but with BEGIN in the same relay log as
|
|
# COMMIT (to see if seeking into hot log is ok).
|
|
|
|
set global max_relay_log_size=0;
|
|
|
|
# This is really copy-paste of 2) of above
|
|
stop slave;
|
|
change master to master_log_pos=401;
|
|
begin;
|
|
select * from t2 for update;
|
|
start slave;
|
|
--sleep 10
|
|
commit;
|
|
sync_with_master;
|
|
select * from t1;
|
|
select * from t2;
|
|
--replace_column 1 # 8 # 9 # 23 # 33 #
|
|
--replace_result $MASTER_MYPORT MASTER_MYPORT
|
|
show slave status;
|
|
|
|
connection master;
|
|
drop table t1,t2;
|
|
sync_slave_with_master;
|