Commit d4dfe766 authored by unknown's avatar unknown
Browse files

BUG#26551 (Aborted query for non-transactional table breaks replication):

Added error code ER_QUERY_INTERRUPTED to the list of special errors
that prevent the slave from starting to execute a query.


sql/slave.cc:
  Added ER_QUERY_INTERRUPTED to special error code that prevents statement
  from being executed on slave.
mysql-test/r/rpl_critical_errors.result.txt:
  New BitKeeper file ``mysql-test/r/rpl_critical_errors.result.txt''
mysql-test/t/rpl_critical_errors.test:
  New BitKeeper file ``mysql-test/t/rpl_critical_errors.test''
parent 0c6731fd
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
set autocommit=1;
reset master;
create table bug16206 (a int);
insert into bug16206 values(1);
start transaction;
insert into bug16206 values(2);
commit;
show binlog events;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
f	n	Format_desc	1	n	Server ver: VERSION, Binlog ver: 4
f	n	Query	1	n	use `test`; create table bug16206 (a int)
f	n	Query	1	n	use `test`; insert into bug16206 values(1)
f	n	Query	1	n	use `test`; insert into bug16206 values(2)
drop table bug16206;
reset master;
create table bug16206 (a int) engine=         bdb;
insert into bug16206 values(0);
insert into bug16206 values(1);
start transaction;
insert into bug16206 values(2);
commit;
insert into bug16206 values(3);
show binlog events;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
f	n	Format_desc	1	n	Server ver: VERSION, Binlog ver: 4
f	n	Query	1	n	use `test`; create table bug16206 (a int) engine=         bdb
f	n	Query	1	n	use `test`; insert into bug16206 values(0)
f	n	Query	1	n	use `test`; insert into bug16206 values(1)
f	n	Query	1	n	use `test`; BEGIN
f	n	Query	1	n	use `test`; insert into bug16206 values(2)
f	n	Query	1	n	use `test`; COMMIT
f	n	Query	1	n	use `test`; insert into bug16206 values(3)
drop table bug16206;
set autocommit=0;
End of 5.0 tests
+56 −0
Original line number Diff line number Diff line
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
CREATE TABLE t1 (data LONGBLOB) ENGINE=MYISAM;
CREATE TABLE t2 (data LONGBLOB) ENGINE=MYISAM;
INSERT INTO t1 (data) VALUES (repeat('a',1024*1024));
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t2 SELECT * FROM t1;
KILL QUERY 2;
SELECT COUNT(*) FROM t2;
COUNT(*)
0
SHOW SLAVE STATUS;
Slave_IO_State	#
Master_Host	127.0.0.1
Master_User	root
Master_Port	MASTER_PORT
Connect_Retry	1
Master_Log_File	master-bin.000001
Read_Master_Log_Pos	#
Relay_Log_File	#
Relay_Log_Pos	#
Relay_Master_Log_File	master-bin.000001
Slave_IO_Running	Yes
Slave_SQL_Running	No
Replicate_Do_DB	
Replicate_Ignore_DB	
Replicate_Do_Table	
Replicate_Ignore_Table	
Replicate_Wild_Do_Table	
Replicate_Wild_Ignore_Table	
Last_Errno	1317
Last_Error	#
Skip_Counter	0
Exec_Master_Log_Pos	#
Relay_Log_Space	#
Until_Condition	None
Until_Log_File	
Until_Log_Pos	0
Master_SSL_Allowed	No
Master_SSL_CA_File	
Master_SSL_CA_Path	
Master_SSL_Cert	
Master_SSL_Cipher	
Master_SSL_Key	
Seconds_Behind_Master	#
+38 −0
Original line number Diff line number Diff line
-- source include/not_embedded.inc
-- source include/have_bdb.inc

#
# Bug #16206: Superfluous COMMIT event in binlog when updating BDB in autocommit mode
#
set autocommit=1;

let $VERSION=`select version()`;

reset master;
create table bug16206 (a int);
insert into bug16206 values(1);
start transaction;
insert into bug16206 values(2);
commit;
--replace_result $VERSION VERSION
--replace_column 1 f 2 n 5 n
show binlog events;
drop table bug16206;

reset master;
create table bug16206 (a int) engine=         bdb;
insert into bug16206 values(0);
insert into bug16206 values(1);
start transaction;
insert into bug16206 values(2);
commit;
insert into bug16206 values(3);
--replace_result $VERSION VERSION
--replace_column 1 f 2 n 5 n
show binlog events;
drop table bug16206;

set autocommit=0;


--echo End of 5.0 tests
+66 −0
Original line number Diff line number Diff line
# Test for BUG#26551
#

# This test is unfortunately very fragile and very dependent on the
# load of the computer. The test is therefore disabled normally. It is
# entered here to demonstrate how to check that the bug is actually
# solved.

--echo Turn on parsing to run this test

disable_parsing;

source include/master-slave.inc;

connection master;
CREATE TABLE t1 (data LONGBLOB) ENGINE=MYISAM;
CREATE TABLE t2 (data LONGBLOB) ENGINE=MYISAM;

INSERT INTO t1 (data) VALUES (repeat('a',1024*1024));
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
sync_slave_with_master;

connection master;
send INSERT INTO t2 SELECT * FROM t1;

connection master1;

# This sleep is picked so that the query above has started to insert
# some rows into t2. If it hasn't the slave will not stop below.
sleep 4;

# SHOW PROCESSLIST;

# Code for the 5.1 server to get the thread id of the thread executing
# the query above.
#
#SET @id = 0;
#SELECT id INTO @id
#  FROM information_schema.processlist
# WHERE info LIKE 'INSERT INTO t2%';

# This is the connection that is executing the INSERT INTO t2...
KILL QUERY 2;

connection slave;

# Here the slave will only stop if the query above actually started
# inserting some rows into t2. Otherwise, it will hang forever.
wait_for_slave_to_stop;

# The following should be 0
SELECT COUNT(*) FROM t2;

# ... and there the error code should be 1317 (ER_QUERY_INTERRUPTED)
--replace_result $MASTER_MYPORT MASTER_PORT
--replace_column 1 # 7 # 8 # 9 # 20 # 22 # 23 # 33 #
query_vertical SHOW SLAVE STATUS;

enable_parsing;
+1 −0
Original line number Diff line number Diff line
@@ -3099,6 +3099,7 @@ int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int expected_error)
  switch (expected_error) {
  case ER_NET_READ_ERROR:
  case ER_NET_ERROR_ON_WRITE:  
  case ER_QUERY_INTERRUPTED:
  case ER_SERVER_SHUTDOWN:  
  case ER_NEW_ABORTING_CONNECTION:
    return 1;