2008-10-02 21:13:15 +02:00
|
|
|
# Check replication of one statement assuming that the engine on the
|
|
|
|
# slave is a blackhole engine.
|
|
|
|
|
|
|
|
# Input:
|
|
|
|
# $statement Statement to evaluate, it is assumed to change t1
|
|
|
|
|
|
|
|
# 1. Evaluate statement on master, it is assumed to change t1
|
|
|
|
# 2. Wait for statement to be processed on slave
|
|
|
|
# 3. SELECT from table t1 to see what was written
|
|
|
|
# 4. Compare position on slave before executing statement and after
|
|
|
|
# executing statement. If difference is >0, then something was
|
|
|
|
# written to the binary log on the slave.
|
|
|
|
|
Bug #38360: BLACKHOLE replication with RBR is broken
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).
2008-10-02 11:02:38 +02:00
|
|
|
connection slave;
|
|
|
|
let $before = query_get_value("SHOW MASTER STATUS", Position, 1);
|
|
|
|
|
|
|
|
--echo [on master]
|
|
|
|
connection master;
|
|
|
|
eval $statement;
|
|
|
|
|
|
|
|
--echo [on slave]
|
|
|
|
sync_slave_with_master;
|
|
|
|
--echo # Expect 0
|
|
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
let $after = query_get_value("SHOW MASTER STATUS", Position, 1);
|
|
|
|
let $something_written = `select $after - $before != 0`;
|
|
|
|
if ($something_written) {
|
|
|
|
--echo >>> Something was written to binary log <<<
|
|
|
|
}
|
|
|
|
if (!$something_written) {
|
|
|
|
--echo >>> Nothing was written to binary log <<<
|
|
|
|
}
|