1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-225: Replace with dummy events an event that is not understood by a slave to which it should be sent

Add function to replace arbitrary event with dummy event.

Add code which uses this to fix the bug that enabling row_annotate events
on the master breaks slaves which do not request such events.

Add that slaves set a variable @mariadb_slave_capability to inform the
master in a robust way about which events it can, and cannot, handle.

Add tests.
This commit is contained in:
unknown
2012-06-22 11:40:40 +02:00
parent c562c74478
commit 9fe317ffd6
8 changed files with 459 additions and 6 deletions

View File

@@ -0,0 +1,104 @@
--source include/master-slave.inc
--source include/have_debug.inc
--source include/have_binlog_format_row.inc
connection master;
set @old_master_binlog_checksum= @@global.binlog_checksum;
set @old_slave_dbug= @@global.debug_dbug;
CREATE TABLE t1 (a INT PRIMARY KEY);
INSERT INTO t1 VALUES (0);
sync_slave_with_master;
connection slave;
--echo # Test slave with no capability gets dummy event, which is ignored.
--source include/stop_slave.inc
SET @@global.debug_dbug='+d,simulate_slave_capability_none';
--source include/start_slave.inc
connection master;
# Add a dummy event just to have something to sync_slave_with_master on.
# Otherwise we occasionally get different $relaylog_start, depending on
# whether Format_description_log_event was written to relay log or not
# at the time of SHOW SLAVE STATUS.
ALTER TABLE t1 ORDER BY a;
sync_slave_with_master;
connection slave;
let $relaylog_start= query_get_value(SHOW SLAVE STATUS, Relay_Log_Pos, 1);
connection master;
SET SESSION binlog_annotate_row_events = ON;
let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
# A short event, to test when we need to use user_var_event for dummy event.
DELETE FROM t1;
INSERT INTO t1 /* A comment just to make the annotate event sufficiently long that the dummy event will need to get padded with spaces so that we can test that this works */ VALUES(1);
let $binlog_limit= 0, 10;
--source include/show_binlog_events.inc
sync_slave_with_master;
connection slave;
SELECT * FROM t1;
let $binlog_file= query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 1);
let $binlog_start= $relaylog_start;
let $binlog_limit=0,10;
--source include/show_relaylog_events.inc
set @@global.debug_dbug= @old_slave_dbug;
--echo # Test dummy event is checksummed correctly.
connection master;
set @@global.binlog_checksum = CRC32;
TRUNCATE t1;
let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
INSERT INTO t1 VALUES(2);
let $binlog_limit= 0, 5;
--source include/show_binlog_events.inc
sync_slave_with_master;
connection slave;
SELECT * FROM t1;
let $binlog_file= query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 1);
let $binlog_start= 0;
let $binlog_limit=3,5;
--source include/show_relaylog_events.inc
--echo # Test that slave which cannot tolerate holes in binlog stream but
--echo # knows the event does not get dummy event
--source include/stop_slave.inc
SET @@global.debug_dbug='+d,simulate_slave_capability_old_53';
--source include/start_slave.inc
connection master;
ALTER TABLE t1 ORDER BY a;
sync_slave_with_master;
connection slave;
let $relaylog_start= query_get_value(SHOW SLAVE STATUS, Relay_Log_Pos, 1);
connection master;
let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
UPDATE t1 SET a = 3;
let $binlog_limit= 0, 5;
--source include/show_binlog_events.inc
sync_slave_with_master;
connection slave;
SELECT * FROM t1;
let $binlog_file= query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 1);
let $binlog_start= $relaylog_start;
let $binlog_limit=0,5;
--source include/show_relaylog_events.inc
select @@global.log_slave_updates;
select @@global.replicate_annotate_row_events;
set @@global.debug_dbug= @old_slave_dbug;
--echo Clean up.
connection master;
set @@global.binlog_checksum = @old_master_binlog_checksum;
DROP TABLE t1;
sync_slave_with_master;
--source include/rpl_end.inc