1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
--source include/have_innodb.inc
--source include/have_log_bin.inc
--source include/have_binlog_format_mixed_or_statement.inc
--source include/binlog_start_pos.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;
let pos=`select $binlog_start_pos + 238`;
--replace_result $pos <pos>
SHOW MASTER STATUS;
--replace_result $pos <pos>
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;
let pos=`select $binlog_start_pos + 740`;
--replace_result $pos <pos>
SHOW STATUS LIKE 'binlog_snapshot_%';
let pos=`select $binlog_start_pos + 1092`;
--replace_result $pos <pos>
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;
--source include/wait_for_binlog_checkpoint.inc
connection default;
--echo # Connection default
SELECT * FROM t1 ORDER BY a,b;
let pos=`select $binlog_start_pos + 740`;
--replace_result $pos <pos>
SHOW STATUS LIKE 'binlog_snapshot_%';
let pos=`select $binlog_start_pos + 119`;
--replace_result $pos <pos>
SHOW MASTER STATUS;
COMMIT;
--replace_result $pos <pos>
SHOW STATUS LIKE 'binlog_snapshot_%';
--replace_result $pos <pos>
SHOW MASTER STATUS;
source include/show_binlog_events.inc;
--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.
--source include/wait_for_binlog_checkpoint.inc
--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;
|