diff --git a/maxscale-system-test/CMakeLists.txt b/maxscale-system-test/CMakeLists.txt index 8a18cde7c..c3ec92b56 100644 --- a/maxscale-system-test/CMakeLists.txt +++ b/maxscale-system-test/CMakeLists.txt @@ -341,6 +341,9 @@ add_test_executable(mxs2456_trx_replay_cap.cpp mxs2456_trx_replay_cap mxs2456_tr # MXS-2512: Enable transaction replay for additional rollback errors. add_test_executable(mxs2512_trx_replay_rollback.cpp mxs2512_trx_replay_rollback mxs2512_trx_replay_rollback LABELS readwritesplit REPL_BACKEND) +# MXS-2785: Binlogfilter database rewrite test +add_test_executable(mxs2785_binlogfilter_rewrite.cpp mxs2785_binlogfilter_rewrite mxs2785_binlogfilter_rewrite LABELS binlogfilter REPL_BACKEND) + ############################################ # END: Tests that require GTID # ############################################ diff --git a/maxscale-system-test/cnf/maxscale.cnf.template.mxs2785_binlogfilter_rewrite b/maxscale-system-test/cnf/maxscale.cnf.template.mxs2785_binlogfilter_rewrite new file mode 100644 index 000000000..b134671d2 --- /dev/null +++ b/maxscale-system-test/cnf/maxscale.cnf.template.mxs2785_binlogfilter_rewrite @@ -0,0 +1,34 @@ +[maxscale] +threads=###threads### +log_info=1 + +###server### + +[MySQL-Monitor] +type=monitor +module=mysqlmon +servers=###server_line### +user=maxskysql +password=skysql +monitor_interval=2000 + +[blf] +type=filter +module=binlogfilter +rewrite_src=test_[a-z0-9]* +rewrite_dest=$0_rewritten + +[Read-Connection-Router] +type=service +router=readconnroute +router_options=master +servers=###server_line### +user=maxskysql +password=skysql +filters=blf + +[Read-Connection-Listener] +type=listener +service=Read-Connection-Router +protocol=MySQLClient +port=4008 diff --git a/maxscale-system-test/mxs2785_binlogfilter_rewrite.cpp b/maxscale-system-test/mxs2785_binlogfilter_rewrite.cpp new file mode 100644 index 000000000..823d7f35a --- /dev/null +++ b/maxscale-system-test/mxs2785_binlogfilter_rewrite.cpp @@ -0,0 +1,59 @@ +#include "testconnections.h" +#include + +int main(int argc, char** argv) +{ + TestConnections test(argc, argv); + + auto slave = test.repl->get_connection(1); + slave.connect(); + slave.query("STOP SLAVE"); + std::ostringstream ss; + ss << "CHANGE MASTER TO MASTER_HOST='" << test.maxscales->ip(0) << "', MASTER_PORT=4008, MASTER_USE_GTID=slave_pos"; + slave.query(ss.str()); + + auto master = test.repl->get_connection(0); + master.connect(); + + // Since the servers are configured to use ROW based replication, we only + // use DDL statement to test. This makes sure they result in query events. + master.query("CREATE DATABASE test_db1"); + master.query("CREATE TABLE test_db1.t1(id int)"); + master.query("USE test_db1"); + master.query("CREATE TABLE t2(id int)"); + + master.query("CREATE DATABASE test_db2"); + master.query("CREATE TABLE test_db2.t1(id int)"); + master.query("USE test_db2"); + master.query("CREATE TABLE t2(id int)"); + + master.query("CREATE DATABASE some_db"); + master.query("CREATE TABLE some_db.t1(id int)"); + master.query("USE some_db"); + master.query("CREATE TABLE t2(id int)"); + + slave.query("START SLAVE"); + slave.query("SELECT MASTER_GTID_WAIT('" + master.field("SELECT @@last_gtid") + "', 120)"); + + // The filter does s/test_[a-z0-9_]*/$1_rewritten/g + test.expect(slave.query("SELECT * FROM test_db1_rewritten.t1 LIMIT 1"), + "Query to test_db1_rewritten.t1 should work: %s", slave.error()); + test.expect(slave.query("SELECT * FROM test_db1_rewritten.t2 LIMIT 1"), + "Query to test_db1_rewritten.t2 should work: %s", slave.error()); + test.expect(slave.query("SELECT * FROM test_db2_rewritten.t1 LIMIT 1"), + "Query to test_db2_rewritten.t1 should work: %s", slave.error()); + test.expect(slave.query("SELECT * FROM test_db2_rewritten.t2 LIMIT 1"), + "Query to test_db2_rewritten.t2 should work: %s", slave.error()); + test.expect(slave.query("SELECT * FROM some_db.t1 LIMIT 1"), + "Query to some_db.t1 should work: %s", slave.error()); + test.expect(slave.query("SELECT * FROM some_db.t2 LIMIT 1"), + "Query to some_db.t2 should work: %s", slave.error()); + + master.query("DROP DATABASE test_db1"); + master.query("DROP DATABASE test_db2"); + master.query("DROP DATABASE some_db"); + + slave.query("SELECT MASTER_GTID_WAIT('" + master.field("SELECT @@last_gtid") + "', 120)"); + + return test.global_result; +}