diff --git a/mysql-test/suite/innodb/r/group_commit_crash.result b/mysql-test/suite/innodb/r/group_commit_crash.result index 005049df281..777e0c0d6ab 100644 --- a/mysql-test/suite/innodb/r/group_commit_crash.result +++ b/mysql-test/suite/innodb/r/group_commit_crash.result @@ -5,14 +5,15 @@ d CHAR(255), id INT, PRIMARY KEY(id)) ENGINE=InnoDB; create table t2 like t1; -create procedure setcrash(IN i INT) +create function getcrash(i INT) +returns VARCHAR(255) begin CASE i -WHEN 1 THEN SET SESSION debug_dbug="d,crash_commit_after_prepare"; -WHEN 2 THEN SET SESSION debug_dbug="d,crash_commit_after_log"; -WHEN 3 THEN SET SESSION debug_dbug="d,crash_commit_before_unlog"; -WHEN 4 THEN SET SESSION debug_dbug="d,crash_commit_after"; -WHEN 5 THEN SET SESSION debug_dbug="d,crash_commit_before"; +WHEN 1 THEN RETURN "crash_commit_after_prepare"; +WHEN 2 THEN RETURN "crash_commit_after_log"; +WHEN 3 THEN RETURN "crash_commit_before_unlog"; +WHEN 4 THEN RETURN "crash_commit_after"; +WHEN 5 THEN RETURN "crash_commit_before"; ELSE BEGIN END; END CASE; end // @@ -31,9 +32,12 @@ SET binlog_format= mixed; RESET MASTER; START TRANSACTION; insert into t1 select * from t2; -call setcrash(5); +SET @crash= getcrash(5); +SET SESSION debug_dbug=concat("d,", @crash); COMMIT; Got one of the listed errors +CRASH_POINT +crash_commit_before SELECT * FROM t1 ORDER BY id; a b c d id SHOW BINLOG EVENTS LIMIT 4,1; @@ -43,9 +47,12 @@ SET binlog_format= mixed; RESET MASTER; START TRANSACTION; insert into t1 select * from t2; -call setcrash(4); +SET @crash= getcrash(4); +SET SESSION debug_dbug=concat("d,", @crash); COMMIT; Got one of the listed errors +CRASH_POINT +crash_commit_after SELECT * FROM t1 ORDER BY id; a b c d id a b c d 1 @@ -66,9 +73,12 @@ SET binlog_format= mixed; RESET MASTER; START TRANSACTION; insert into t1 select * from t2; -call setcrash(3); +SET @crash= getcrash(3); +SET SESSION debug_dbug=concat("d,", @crash); COMMIT; Got one of the listed errors +CRASH_POINT +crash_commit_before_unlog SELECT * FROM t1 ORDER BY id; a b c d id a b c d 1 @@ -89,9 +99,12 @@ SET binlog_format= mixed; RESET MASTER; START TRANSACTION; insert into t1 select * from t2; -call setcrash(2); +SET @crash= getcrash(2); +SET SESSION debug_dbug=concat("d,", @crash); COMMIT; Got one of the listed errors +CRASH_POINT +crash_commit_after_log SELECT * FROM t1 ORDER BY id; a b c d id a b c d 1 @@ -112,9 +125,12 @@ SET binlog_format= mixed; RESET MASTER; START TRANSACTION; insert into t1 select * from t2; -call setcrash(1); +SET @crash= getcrash(1); +SET SESSION debug_dbug=concat("d,", @crash); COMMIT; Got one of the listed errors +CRASH_POINT +crash_commit_after_prepare SELECT * FROM t1 ORDER BY id; a b c d id SHOW BINLOG EVENTS LIMIT 4,1; @@ -122,4 +138,4 @@ Log_name Pos Event_type Server_id End_log_pos Info delete from t1; DROP TABLE t1; DROP TABLE t2; -DROP PROCEDURE setcrash; +DROP FUNCTION getcrash; diff --git a/mysql-test/suite/innodb/t/group_commit_crash.test b/mysql-test/suite/innodb/t/group_commit_crash.test index 12f7ba202e3..dcaa5d67191 100644 --- a/mysql-test/suite/innodb/t/group_commit_crash.test +++ b/mysql-test/suite/innodb/t/group_commit_crash.test @@ -17,14 +17,15 @@ CREATE TABLE t1(a CHAR(255), PRIMARY KEY(id)) ENGINE=InnoDB; create table t2 like t1; delimiter //; -create procedure setcrash(IN i INT) +create function getcrash(i INT) +returns VARCHAR(255) begin CASE i - WHEN 1 THEN SET SESSION debug_dbug="d,crash_commit_after_prepare"; - WHEN 2 THEN SET SESSION debug_dbug="d,crash_commit_after_log"; - WHEN 3 THEN SET SESSION debug_dbug="d,crash_commit_before_unlog"; - WHEN 4 THEN SET SESSION debug_dbug="d,crash_commit_after"; - WHEN 5 THEN SET SESSION debug_dbug="d,crash_commit_before"; + WHEN 1 THEN RETURN "crash_commit_after_prepare"; + WHEN 2 THEN RETURN "crash_commit_after_log"; + WHEN 3 THEN RETURN "crash_commit_before_unlog"; + WHEN 4 THEN RETURN "crash_commit_after"; + WHEN 5 THEN RETURN "crash_commit_before"; ELSE BEGIN END; END CASE; end // @@ -53,8 +54,8 @@ while ($numtests) # Write file to make mysql-test-run.pl expect crash --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect - eval call setcrash($numtests); - + eval SET @crash= getcrash($numtests); + SET SESSION debug_dbug=concat("d,", @crash); # Run the crashing query --error 2006,2013 COMMIT; @@ -62,6 +63,10 @@ while ($numtests) # Poll the server waiting for it to be back online again. --source include/wait_until_connected_again.inc + --disable_query_log + eval SET @crash= getcrash($numtests); + SELECT @crash as CRASH_POINT; + --enable_query_log # table and binlog should be in sync. SELECT * FROM t1 ORDER BY id; --replace_column 2 # 5 # @@ -75,4 +80,4 @@ while ($numtests) # final cleanup DROP TABLE t1; DROP TABLE t2; -DROP PROCEDURE setcrash; +DROP FUNCTION getcrash; diff --git a/sql/handler.cc b/sql/handler.cc index 9921b3a5837..bc2e1f57b50 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1428,7 +1428,7 @@ int ha_commit_trans(THD *thd, bool all) if (trt.update()) goto err; if (all) - trans_commit_stmt(thd); + commit_one_phase_2(thd, false, &thd->transaction.stmt, false); break; } }