| Bug #49186 | Concurrent insert/select causes slave abort if select is under read committed | ||
|---|---|---|---|
| Submitted: | 29 Nov 2009 13:52 | Modified: | 14 Dec 2009 20:46 |
| Reporter: | Elena Stepanova | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server: Replication | Severity: | S3 (Non-critical) |
| Version: | 5.1.41, 5.5.0 | OS: | Any |
| Assigned to: | Alfranio Tavares Correia Junior | CPU Architecture: | Any |
[29 Nov 2009 13:52]
Elena Stepanova
[29 Nov 2009 14:49]
Valeriy Kravchuk
Verified just as described with recent mysql-trunk from bzr on Mac OS X:
77-52-12-228:mysql-test openxs$ ./mysql-test-run.pl --mysqld=--innodb --mysqld=--binlog_format=mixed --suite=rpl bug_49186
Logging: ./mysql-test-run.pl --mysqld=--innodb --mysqld=--binlog_format=mixed --suite=rpl bug_49186
091129 16:47:01 [Warning] Setting lower_case_table_names=2 because file system for /var/folders/dX/dXCzvuSlHX4Op1g-o1jIWk+++TI/-Tmp-/oIhE61J6nv/ is case insensitive
091129 16:47:01 [Note] Plugin 'FEDERATED' is disabled.
091129 16:47:01 [Note] Plugin 'ndbcluster' is disabled.
MySQL Version 5.5.0
Using binlog format 'mixed'
Checking supported features...
- using ndbcluster when necessary, mysqld supports it
- SSL connections supported
- binaries are debug compiled
Collecting tests...
- adding combinations for rpl
vardir: /Users/openxs/dbs/trunk/mysql-test/var
Checking leftover processes...
Removing old var directory...
Creating var directory '/Users/openxs/dbs/trunk/mysql-test/var'...
Installing system database...
Using server port 54665
==============================================================================
TEST RESULT TIME (ms)
------------------------------------------------------------
worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009
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
( i int not null auto_increment primary key, f int )
engine = InnoDB;
create table t2
( i int not null auto_increment primary key, f int )
engine = MyISAM;
insert into t1 (f) values (1);
set session transaction isolation level read committed;
insert into t2 (f)
select f from t1
where i = 2+sleep(1);
set session transaction isolation level repeatable read;
insert into t1 (f) values (2);
insert into t2 (f) values (2);
rpl.bug_49186 'row' [ pass ] 3062
MTR's internal check of the test case 'rpl.bug_49186' failed.
This means that the test case does not preserve the state that existed
before the test case was executed. Most likely the test case did not
do a proper clean-up.
This is the diff of the states of the servers before and after the
test case was executed:
mysqltest: Logging to '/Users/openxs/dbs/trunk/mysql-test/var/tmp/check-mysqld_2.log'.
mysqltest: Results saved in '/Users/openxs/dbs/trunk/mysql-test/var/tmp/check-mysqld_2.result'.
mysqltest: Connecting to server localhost:13001 (socket /Users/openxs/dbs/trunk/mysql-test/var/tmp/mysqld.2.sock) as 'root', connection 'default', attempt 0 ...
mysqltest: ... Connected.
mysqltest: Start processing test commands from './include/check-testcase.test' ...
mysqltest: ... Done processing test commands.
--- /Users/openxs/dbs/trunk/mysql-test/var/tmp/check-mysqld_2.result 2009-11-29 17:47:06.000000000 +0300
+++ /Users/openxs/dbs/trunk/mysql-test/var/tmp/check-mysqld_2.reject 2009-11-29 17:47:10.000000000 +0300
@@ -309,6 +309,8 @@
def mysql latin1 latin1_swedish_ci NULL
def test latin1 latin1_swedish_ci NULL
tables_in_test
+t1
+t2
tables_in_mysql
mysql.columns_priv
mysql.db
mysqltest: Result content mismatch
not ok
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
( i int not null auto_increment primary key, f int )
engine = InnoDB;
create table t2
( i int not null auto_increment primary key, f int )
engine = MyISAM;
insert into t1 (f) values (1);
set session transaction isolation level read committed;
insert into t2 (f)
select f from t1
where i = 2+sleep(1);
set session transaction isolation level repeatable read;
insert into t1 (f) values (2);
insert into t2 (f) values (2);
rpl.bug_49186 'stmt' [ fail ]
Test ended at 2009-11-29 16:47:21
CURRENT_TEST: rpl.bug_49186
=== SHOW MASTER STATUS ===
---- 1. ----
File slave-bin.000001
Position 966
Binlog_Do_DB
Binlog_Ignore_DB
==========================
=== SHOW SLAVE STATUS ===
---- 1. ----
Slave_IO_State Waiting for master to send event
Master_Host 127.0.0.1
Master_User root
Master_Port 13000
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 1076
Relay_Log_File slave-relay-bin.000003
Relay_Log_Pos 1103
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 1062
Last_Error Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t2 (f) values (2)'
Skip_Counter 0
Exec_Master_Log_Pos 956
Relay_Log_Space 1379
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
Master_SSL_Verify_Server_Cert No
Last_IO_Errno 0
Last_IO_Error
Last_SQL_Errno 1062
Last_SQL_Error Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t2 (f) values (2)'
Replicate_Ignore_Server_Ids
Master_Server_Id 1
...
[29 Nov 2009 14:56]
Valeriy Kravchuk
Same with 5.1.42 from bzr:
...
rpl.bug_49186 'mix' [ fail ]
Test ended at 2009-11-29 16:53:34
CURRENT_TEST: rpl.bug_49186
=== SHOW MASTER STATUS ===
---- 1. ----
File slave-bin.000001
Position 965
Binlog_Do_DB
Binlog_Ignore_DB
==========================
=== SHOW SLAVE STATUS ===
---- 1. ----
Slave_IO_State Waiting for master to send event
Master_Host 127.0.0.1
Master_User root
Master_Port 13000
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 1075
Relay_Log_File slave-relay-bin.000003
Relay_Log_Pos 1101
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 1062
Last_Error Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t2 (f) values (2)'
Skip_Counter 0
Exec_Master_Log_Pos 955
Relay_Log_Space 1376
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
Master_SSL_Verify_Server_Cert No
Last_IO_Errno 0
Last_IO_Error
Last_SQL_Errno 1062
Last_SQL_Error Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t2 (f) values (2)'
=========================
=== SHOW PROCESSLIST ===
---- 1. ----
Id 2
User root
Host localhost:54754
db test
Command Query
Time 0
State
Info SHOW PROCESSLIST
---- 2. ----
Id 3
User root
Host localhost:54755
db test
Command Sleep
Time 5
State
Info
---- 3. ----
Id 4
User system user
Host
db
Command Connect
Time 4
State Waiting for master to send event
Info
========================
analyze: sync_with_master
mysqltest: At line 31: sync_slave_with_master failed: 'select master_pos_wait('master-bin.000001', 1075, 300)' returned NULL indicating slave SQL thread failure
...
[2 Dec 2009 17:45]
Andrei Elkin
This particular problem of reverse to execution binlogging was solved by alfranio.correia@sun.com-20091103190256-637o8qxlveikrt3i et all in mysql-5.1-rep+3. The symptom of description " The transaction from 'master1' is written into binlog before the transaction from 'master' " can still be true *but* INSERT-N..SELECT-T query (trans master) is binlogged in the ROW-format and that makes difference. Namely, in the regression test case two binlog orders master1-trans rows-events-of-master rows-events-of-master master1-trans are equivalent, i.e the slave data would be the same. Could you please re-verify this case against rep+3 tree. And very nice test, thanks!
[2 Dec 2009 19:17]
Andrei Elkin
At verifying on mysql-5.1-rep+3 make sure to check two versions of rows-events-of-master master1-trans sequence. One with rows-events-of-master is empty (that the test would generate [instead of effectless query in 5.1]) and 2nd with rows-events-of-master is something. You would have slightly modify the test for it.
[2 Dec 2009 19:31]
Elena Stepanova
Already did, both scenarios seem to be working all right on mysql-5.1-rep+3. I'll also run a short stress test with the initial flow just in case it reveals any variations of the scenario which are still affected. The probability of this race condition during the standard stress test is not very high though.
