mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
8d9cf89e96
The Blackhole engine did not support row-based replication since the delete_row(), update_row(), and the index and range searching functions were not implemented. This patch adds row-based replication support for the Blackhole engine by implementing the two functions mentioned above, and making the engine pretend that it has found the correct row to delete or update when executed from the slave SQL thread by implementing index and range searching functions. It is necessary to only pretend this for the SQL thread, since a SELECT executed on the Blackhole engine will otherwise never return EOF, causing a livelock. mysql-test/extra/binlog_tests/blackhole.test: Blackhole now handles row-based replication. mysql-test/extra/rpl_tests/rpl_blackhole.test: Test helper file for testing that blackhole actually writes something to the binary log on the slave. mysql-test/suite/binlog/t/binlog_multi_engine.test: Replication now handles row-based replcation. mysql-test/suite/rpl/t/rpl_blackhole.test: Test that Blackhole works with primary key, index, or none. sql/log_event.cc: Correcting code to only touch filler bits and leave all other bits alone. It is necessary since there is no guarantee that the engine will be able to fill in the bits correctly (e.g., the blackhole engine). storage/blackhole/ha_blackhole.cc: Adding definitions for update_row() and delete_row() to return OK when executed from the slave SQL thread with thd->query == NULL (indicating that row-based replication events are being processed). Changing rnd_next(), index_read(), index_read_idx(), and index_read_last() to return OK when executed from the slave SQL thread (faking that the row has been found so that processing proceeds to update/delete the row). storage/blackhole/ha_blackhole.h: Enabling row capabilities for engine. Defining write_row(), update_row(), and delete_row(). Making write_row() private (as it should be).
104 lines
2.8 KiB
Text
104 lines
2.8 KiB
Text
# Test to test how logging is done depending on the capabilities of
|
|
# the engines. Unfortunately, we don't have a good row-only logging
|
|
# engine, and NDB does not really cut is since it is also
|
|
# self-logging. I'm using it nevertheless.
|
|
|
|
source include/have_blackhole.inc;
|
|
source include/have_ndb.inc;
|
|
source include/have_log_bin.inc;
|
|
|
|
CREATE TABLE t1m (m INT, n INT) ENGINE=MYISAM;
|
|
CREATE TABLE t1b (b INT, c INT) ENGINE=BLACKHOLE;
|
|
CREATE TABLE t1n (e INT, f INT) ENGINE=NDB;
|
|
|
|
RESET MASTER;
|
|
|
|
SET SESSION BINLOG_FORMAT=STATEMENT;
|
|
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
|
|
|
# Here and below we need to wait when some event appears in binlog
|
|
# to avoid unsrted mixing local events and from NDB
|
|
let $wait_binlog_event= t1m, t1b;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
echo *** Please look in binlog_multi_engine.test if you have a diff here ****;
|
|
START TRANSACTION;
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
|
COMMIT;
|
|
|
|
let $wait_binlog_event= COMMIT;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
TRUNCATE t1m;
|
|
TRUNCATE t1b;
|
|
TRUNCATE t1n;
|
|
|
|
let $wait_binlog_event= t1n;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
source include/show_binlog_events.inc;
|
|
|
|
RESET MASTER;
|
|
|
|
SET SESSION BINLOG_FORMAT=MIXED;
|
|
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
let $wait_binlog_event= t1m;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
let $wait_binlog_event= COMMIT;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
|
error ER_BINLOG_LOGGING_IMPOSSIBLE;
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
|
|
# Not possible to test this since NDB writes its own binlog, which
|
|
# might cause it to be out of sync with the results from MyISAM.
|
|
# This will generate an error once BUG#28722 is fixed.
|
|
|
|
#UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
|
|
TRUNCATE t1m;
|
|
TRUNCATE t1b;
|
|
TRUNCATE t1n;
|
|
|
|
source include/show_binlog_events.inc;
|
|
|
|
RESET MASTER;
|
|
|
|
SET SESSION BINLOG_FORMAT=ROW;
|
|
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
error ER_BINLOG_LOGGING_IMPOSSIBLE;
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
|
|
# Not possible to test this since NDB writes its own binlog, which
|
|
# might cause it to be out of sync with the results from MyISAM.
|
|
# This will generate an error once BUG#28722 is fixed.
|
|
|
|
#UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
|
|
error ER_BINLOG_LOGGING_IMPOSSIBLE;
|
|
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
|
|
|
source include/show_binlog_events.inc;
|
|
|
|
RESET MASTER;
|
|
|
|
DROP TABLE t1m, t1b, t1n;
|
|
|