--source include/have_innodb.inc --source include/have_log_bin.inc --source include/have_binlog_format_mixed_or_statement.inc RESET MASTER; # Test that we get the correct binlog position from START TRANSACTION WITH # CONSISTENT SNAPSHOT even when other transactions are active. connect(con1,localhost,root,,); connect(con2,localhost,root,,); connect(con3,localhost,root,,); connect(con4,localhost,root,,); connection default; --echo # Connection default CREATE TABLE t1 (a INT, b VARCHAR(100), PRIMARY KEY (a,b)) ENGINE=innodb; SHOW MASTER STATUS; SHOW STATUS LIKE 'binlog_snapshot_%'; BEGIN; INSERT INTO t1 VALUES (0, ""); connection con1; --echo # Connection con1 BEGIN; INSERT INTO t1 VALUES (1, ""); connection con2; --echo # Connection con2 CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=myisam; BEGIN; INSERT INTO t1 VALUES (2, "first"); INSERT INTO t2 VALUES (2); INSERT INTO t1 VALUES (2, "second"); connection default; --echo # Connection default COMMIT; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION WITH CONSISTENT SNAPSHOT; connection con3; --echo # Connection con3 BEGIN; INSERT INTO t1 VALUES (3, ""); INSERT INTO t2 VALUES (3); connection con4; --echo # Connection con4 BEGIN; INSERT INTO t1 VALUES (4, ""); COMMIT; connection default; --echo # Connection default SELECT * FROM t1 ORDER BY a,b; SHOW STATUS LIKE 'binlog_snapshot_%'; SHOW MASTER STATUS; SELECT * FROM t2 ORDER BY a; connection con1; --echo # Connection con1 COMMIT; connection con2; --echo # Connection con2 COMMIT; connection con3; --echo # Connection con3 COMMIT; FLUSH LOGS; connection default; --echo # Connection default SELECT * FROM t1 ORDER BY a,b; SHOW STATUS LIKE 'binlog_snapshot_%'; SHOW MASTER STATUS; COMMIT; SHOW STATUS LIKE 'binlog_snapshot_%'; SHOW MASTER STATUS; --replace_regex /\/\* xid=.* \*\//\/* XID *\// /Server ver: .*, Binlog ver: .*/Server ver: #, Binlog ver: #/ /table_id: [0-9]+/table_id: #/ SHOW BINLOG EVENTS; --echo *** MDEV-7310: last_commit_pos_offset set to wrong value after binlog rotate in group commit *** SET @old_size= @@GLOBAL.max_binlog_size; SET GLOBAL max_binlog_size=4096; CREATE TABLE t3 (a INT PRIMARY KEY, b VARBINARY(8192)) ENGINE=MyISAM; INSERT INTO t3 VALUES (10, ''); --let $bigdata= `SELECT REPEAT('a', 5000)` eval INSERT INTO t3 VALUES (11, '$bigdata'); # The bug was that binlog_snapshot_file pointed to the new file after binlog # rotation, but binlog_snapshot_position was the offset in the old file before # binlog rotation. So the position was invalid. # So here, we check that the values are consistent with SHOW MASTER STATUS, # which uses a different code path and did not have the bug. --let $snap_file= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_file', Value, 1) --let $snap_pos= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_position', Value, 1) --let $master_file= query_get_value(SHOW MASTER STATUS, File, 1) --let $master_pos= query_get_value(SHOW MASTER STATUS, Position, 1) --disable_query_log eval SET @errmsg= 'ERROR: ($snap_file, $snap_pos) != ($master_file, $master_pos)'; eval SELECT IF('$snap_file' = '$master_file' AND $snap_pos = $master_pos, 'OK', @errmsg) AS test_result; --enable_query_log SET GLOBAL max_binlog_size=@old_size; DROP TABLE t1,t2, t3;