mariadb/mysql-test/t/rpl_deadlock.test
unknown d57a0e52ac BUG#11316 mysqltest, problems when assigning value with '#' to $variable
- 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
2005-07-15 17:51:43 +02:00

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;