Merge branch '2.2' into 2.2-mrm

This commit is contained in:
Markus Mäkelä
2017-10-30 11:06:34 +02:00
49 changed files with 1458 additions and 500 deletions

View File

@ -501,6 +501,10 @@ add_test_executable(mxs1451_skip_auth.cpp mxs1451_skip_auth mxs1451_skip_auth LA
# https://jira.mariadb.org/browse/MXS-1457
add_test_executable(mxs1457_ignore_deleted.cpp mxs1457_ignore_deleted mxs1457_ignore_deleted LABELS REPL_BACKEND)
# MXS-1468: Using dynamic commands to create readwritesplit configs fail after restart
# https://jira.mariadb.org/browse/MXS-1468
add_test_executable(mxs1468.cpp mxs1468 mxs1468 LABELS REPL_BACKEND)
# MXS-1493: Use replication heartbeat in mysqlmon
# https://jira.mariadb.org/browse/MXS-1493
add_test_executable(verify_master_failure.cpp verify_master_failure verify_master_failure LABELS REPL_BACKEND)
@ -567,7 +571,7 @@ add_test_executable(rwsplit_multi_stmt.cpp rwsplit_multi_stmt rwsplit_multi_stmt
add_test_executable(rwsplit_read_only_trx.cpp rwsplit_read_only_trx rwsplit_read_only_trx LABELS readwritesplit REPL_BACKEND)
# Test replication-manager with MaxScale
#add_test_executable(replication_manager.cpp replication_manager replication_manager LABELS maxscale REPL_BACKEND)
add_test_executable_notest(replication_manager.cpp replication_manager replication_manager LABELS maxscale REPL_BACKEND)
#add_test_executable_notest(replication_manager_2nodes.cpp replication_manager_2nodes replication_manager_2nodes LABELS maxscale REPL_BACKEND)
#add_test_executable_notest(replication_manager_3nodes.cpp replication_manager_3nodes replication_manager_3nodes LABELS maxscale REPL_BACKEND)
@ -640,6 +644,9 @@ add_test_executable(temporal_tables.cpp temporal_tables replication LABELS readw
# Test routing hints
add_test_executable(test_hints.cpp test_hints hints2 LABELS hintfilter LIGHT REPL_BACKEND)
# Run MaxCtrl test suite
add_test_executable(test_maxctrl.cpp test_maxctrl maxctrl LABELS REPL_BACKEND)
# Binlogrouter tests, these heavily alter the replication so they are run last
add_test_executable(avro.cpp avro avro LABELS avrorouter binlogrouter LIGHT BREAKS_REPL)
add_test_executable(avro_alter.cpp avro_alter avro LABELS avrorouter binlogrouter LIGHT BREAKS_REPL)

View File

@ -0,0 +1,132 @@
[maxscale]
threads=4
admin_auth=false
log_info=1
admin_host=::
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3,server4
user=maxskysql
password=skysql
monitor_interval=10000
[RW Split Router]
type=service
router=readwritesplit
servers=server1,server2,server3,server4
user=maxskysql
password=skysql
max_slave_connections=100%
[SchemaRouter Router]
type=service
router=schemarouter
servers=server1,server2,server3,server4
user=maxskysql
password=skysql
auth_all_servers=1
[RW Split Hint Router]
type=service
router=readwritesplit
servers=server1,server2,server3,server4
user=maxskysql
password=skysql
max_slave_connections=100%
filters=Hint
[Read Connection Router]
type=service
router=readconnroute
router_options=master
servers=server1
user=maxskysql
password=skysql
filters=QLA
[Hint]
type=filter
module=hintfilter
[recurse3]
type=filter
module=tee
service=RW Split Router
[recurse2]
type=filter
module=tee
service=Read Connection Router
[recurse1]
type=filter
module=tee
service=RW Split Hint Router
[QLA]
type=filter
module=qlafilter
log_type=unified
append=false
flush=true
filebase=/tmp/qla.log
[CLI]
type=service
router=cli
[Read Connection Listener]
type=listener
service=Read Connection Router
protocol=MySQLClient
port=4008
[RW Split Listener]
type=listener
service=RW Split Router
protocol=MySQLClient
port=4006
[SchemaRouter Listener]
type=listener
service=SchemaRouter Router
protocol=MySQLClient
port=4010
[RW Split Hint Listener]
type=listener
service=RW Split Hint Router
protocol=MySQLClient
port=4009
[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
socket=default
[server1]
type=server
address=###node_server_IP_1###
port=###node_server_port_1###
protocol=MySQLBackend
[server2]
type=server
address=###node_server_IP_2###
port=###node_server_port_2###
protocol=MySQLBackend
[server3]
type=server
address=###node_server_IP_3###
port=###node_server_port_3###
protocol=MySQLBackend
[server4]
type=server
address=###node_server_IP_4###
port=###node_server_port_4###
protocol=MySQLBackend

View File

@ -0,0 +1,18 @@
[maxscale]
threads=###threads###
[rwsplit-service]
type=service
router=readwritesplit
user=maxskysql
passwd=skysql
[CLI]
type=service
router=cli
[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
socket=default

View File

@ -12,6 +12,8 @@ monitor_interval=1000
detect_standalone_master=true
failcount=2
allow_cluster_recovery=true
events=master_down
script=/home/vagrant/replication-manager --hosts=$LIST --user=skysql:skysql --rpluser=skysql:skysql --switchover-at-sync=false --log-level=3 --logfile=/tmp/mrm.log switchover
[RW Split Router]
type=service

View File

@ -117,9 +117,6 @@ EOF
do_ssh <<EOF
sudo mkdir -p /etc/replication-manager/
sudo cp ./config.toml /etc/replication-manager/config.toml
sudo systemctl stop replication-manager
sudo replication-manager bootstrap --clean-all
sudo systemctl restart replication-manager
EOF
}

View File

@ -1270,6 +1270,7 @@ static void wait_until_pos(MYSQL *mysql, int filenum, int pos)
{
int slave_filenum = 0;
int slave_pos = 0;
bool error = false;
do
{
@ -1284,17 +1285,23 @@ static void wait_until_pos(MYSQL *mysql, int filenum, int pos)
if (res)
{
MYSQL_ROW row = mysql_fetch_row(res);
error = true;
if (row && row[6] && row[21])
if (row && row[5] && row[21])
{
char *file_suffix = strchr(row[5], '.') + 1;
slave_filenum = atoi(file_suffix);
slave_pos = atoi(row[21]);
char *file_suffix = strchr(row[5], '.');
if (file_suffix)
{
file_suffix++;
slave_filenum = atoi(file_suffix);
slave_pos = atoi(row[21]);
error = false;
}
}
mysql_free_result(res);
}
}
while (slave_filenum < filenum || slave_pos < pos);
while ((slave_filenum < filenum || slave_pos < pos) && !error);
}
void Mariadb_nodes::sync_slaves(int node)

View File

@ -0,0 +1,47 @@
#!/bin/bash
cat <<EOF > start_maxscale.sh
#!/bin/bash
sudo systemctl start maxscale
EOF
cat <<EOF >stop_maxscale.sh
#!/bin/bash
sudo systemctl stop maxscale
sudo rm -rf /var/lib/maxscale/*
sudo rm -rf /var/cache/maxscale/*
sudo rm -rf /var/run/maxscale/*
if [ -f /tmp/maxadmin.sock ]
then
sudo rm /tmp/maxadmin.sock
fi
EOF
cat <<EOF >start_double_maxscale.sh
#!/bin/bash
sudo systemctl start maxscale
ssh -i ~/maxscale_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet $galera_003_whoami@$galera_003_network "sudo systemctl start maxscale"
EOF
cat <<EOF >stop_double_maxscale.sh
#!/bin/bash
sudo systemctl stop maxscale
sudo rm -rf /var/lib/maxscale/*
sudo rm -rf /var/cache/maxscale/*
sudo rm -rf /var/run/maxscale/*
test ! -f /tmp/maxadmin.sock || sudo rm /tmp/maxadmin.sock
ssh -i ~/maxscale_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet $galera_003_whoami@$galera_003_network "sudo systemctl stop maxscale"
ssh -i ~/maxscale_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet $galera_003_whoami@$galera_003_network "sudo rm -rf /var/lib/maxscale/*"
ssh -i ~/maxscale_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet $galera_003_whoami@$galera_003_network "sudo rm -rf /var/cache/maxscale/*"
ssh -i ~/maxscale_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet $galera_003_whoami@$galera_003_network "sudo rm -rf /var/run/maxscale/*"
ssh -i ~/maxscale_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet $galera_003_whoami@$galera_003_network "sudo rm -rf /tmp/maxadmin.sock"
EOF
chmod +x *.sh

View File

@ -0,0 +1,37 @@
/**
* MXS-1468: Using dynamic commands to create readwritesplit configs fail after restart
*
* https://jira.mariadb.org/browse/MXS-1468
*/
#include "testconnections.h"
int main(int argc, char** argv)
{
TestConnections test(argc, argv);
test.verbose = true;
test.ssh_maxscale(true,
"maxadmin create monitor cluster-monitor mysqlmon;"
"maxadmin alter monitor cluster-monitor user=maxskysql password=skysql monitor_interval=1000;"
"maxadmin restart monitor cluster-monitor;"
"maxadmin create listener rwsplit-service rwsplit-listener 0.0.0.0 4006;"
"maxadmin create listener rwsplit-service rwsplit-listener2 0.0.0.0 4008;"
"maxadmin create listener rwsplit-service rwsplit-listener3 0.0.0.0 4009;"
"maxadmin list listeners;"
"maxadmin create server prod_mysql01 %s 3306;"
"maxadmin create server prod_mysql02 %s 3306;"
"maxadmin create server prod_mysql03 %s 3306;"
"maxadmin list servers;"
"maxadmin add server prod_mysql02 cluster-monitor rwsplit-service;"
"maxadmin add server prod_mysql01 cluster-monitor rwsplit-service;"
"maxadmin add server prod_mysql03 cluster-monitor rwsplit-service;"
"maxadmin list servers;", test.repl->IP[0], test.repl->IP[1], test.repl->IP[2]);
test.verbose = false;
test.tprintf("Restarting MaxScale");
test.add_result(test.restart_maxscale(), "Restart should succeed");
test.check_maxscale_alive();
return test.global_result;
}

View File

@ -21,9 +21,9 @@ void get_output(TestConnections& test)
test.tprintf("%s", output);
free(output);
test.tprintf("replication-manager output:");
test.tprintf("MaxScale output:");
output = test.ssh_maxscale_output(true,
"cat /var/log/replication-manager.log && sudo truncate -s 0 /var/log/replication-manager.log");
"cat /var/log/maxscale/maxscale.log && sudo truncate -s 0 /var/log/maxscale/maxscale.log");
test.tprintf("%s", output);
free(output);
}
@ -66,6 +66,21 @@ void check(TestConnections& test)
mysql_close(conn);
}
int get_server_id(TestConnections& test)
{
MYSQL *conn = test.open_rwsplit_connection();
int id = -1;
char str[1024];
if (find_field(conn, "SELECT @@server_id", "@@server_id", str) == 0)
{
id = atoi(str);
}
mysql_close(conn);
return id;
}
static bool interactive = false;
void get_input()
@ -83,8 +98,9 @@ int main(int argc, char** argv)
prepare();
TestConnections test(argc, argv);
test.tprintf("Installing replication-manager");
int rc = system("./manage_mrm.sh install > manage_mrm.log");
int rc = system("new_replication_manager=yes ./manage_mrm.sh install > manage_mrm.log");
if (!WIFEXITED(rc) || WEXITSTATUS(rc) != 0)
{
test.tprintf("Failed to install replication-manager, see manage_mrm.log for more details");
@ -98,6 +114,7 @@ int main(int argc, char** argv)
get_input();
test.connect_maxscale();
test.try_query(test.conn_rwsplit, "CREATE OR REPLACE TABLE test.t1(id INT)");
test.repl->sync_slaves();
check(test);
get_output(test);
@ -127,31 +144,34 @@ int main(int argc, char** argv)
check(test);
get_output(test);
test.tprintf("Starting all nodes and wait for replication-manager to fix the replication");
get_input();
test.repl->start_node(0, (char*)"");
sleep(5);
test.repl->start_node(1, (char*)"");
sleep(5);
test.repl->start_node(2, (char*)"");
sleep(5);
test.tprintf("Fix replication and recreate table");
test.close_maxscale_connections();
test.repl->fix_replication();
test.connect_maxscale();
test.try_query(test.conn_rwsplit, "CREATE OR REPLACE TABLE test.t1(id INT)");
test.repl->sync_slaves();
inserts = 0;
check(test);
get_output(test);
test.tprintf("Dropping tables");
get_input();
test.close_maxscale_connections();
test.connect_maxscale();
test.try_query(test.conn_rwsplit, "DROP TABLE test.t1");
test.close_maxscale_connections();
test.tprintf("Disable replication on a slave and kill master, check that it is not promoted");
execute_query(test.repl->nodes[1], "STOP SLAVE; RESET SLAVE; RESET SLAVE ALL;");
test.repl->stop_node(0);
sleep(10);
check(test);
get_output(test);
test.tprintf("Removing replication-manager");
get_input();
system("./manage_mrm.sh remove >> manage_mrm.log");
int id = get_server_id(test);
test.add_result(id == test.repl->get_server_id(1), "Invalid slave should not be used");
// TODO: Figure this also out, remove the component if it's not needed
// test.tprintf("Removing replication-manager");
// get_input();
// system("./manage_mrm.sh remove >> manage_mrm.log");
test.repl->fix_replication();
return test.global_result;
}

View File

@ -0,0 +1,37 @@
/**
* Run MaxCtrl test suite on the MaxScale machine
*/
#include "testconnections.h"
int main(int argc, char *argv[])
{
// Use galera_003 as the secondary MaxScale node
TestConnections::set_secondary_maxscale("galera_003_network", "galera_003_network6");
TestConnections test(argc, argv);
// This is not very nice as it's a bit too intrusive
system("envsubst < maxctrl_scripts.sh.in > maxctrl_scripts.sh");
system("chmod +x maxctrl_scripts.sh");
test.copy_to_maxscale("test_maxctrl.sh", "~");
test.copy_to_maxscale("maxctrl_scripts.sh", "~");
test.ssh_maxscale(true,"ssh-keygen -f maxscale_key -P \"\"");
test.copy_from_maxscale((char*)"~/maxscale_key.pub", (char*)".");
test.galera->copy_to_node("./maxscale_key.pub", "~", 3);
test.galera->ssh_node(3, false, "cat ~/maxscale_key.pub >> ~/.ssh/authorized_keys;"
"sudo iptables -I INPUT -p tcp --dport 8989 -j ACCEPT;");
// TODO: Don't handle test dependencies in tests
test.tprintf("Installing NPM");
test.ssh_maxscale(true,"yum -y install epel-release;yum -y install npm git;");
test.tprintf("Starting test");
test.verbose = true;
int rv = test.ssh_maxscale(true, "export maxscale2_API=%s:8989; ./test_maxctrl.sh", test.galera->IP[3]);
test.verbose = false;
test.tprintf("Removing NPM");
test.ssh_maxscale(true, "yum -y remove npm epel-release");
return rv;
}

View File

@ -0,0 +1,32 @@
#!/bin/bash
# Check branch name
ref=$(maxscale --version-full 2>&1|grep -o ' - .*'|sed 's/ - //')
if [ -z "$ref" ]
then
echo "Error: No commit ID in --version-full output"
exit 1
fi
if [ ! -d MaxScale ]
then
git clone https://www.github.com/mariadb-corporation/MaxScale.git
cd MaxScale
git checkout $ref
cd ..
fi
cd MaxScale/maxctrl
# Create the scripts that start and stop MaxScale
~/maxctrl_scripts.sh
chmod +x *.sh
npm i
# Export the value for --basedir where maxscale binaries are located
export MAXSCALE_DIR=/usr
./stop_maxscale.sh
npm test

View File

@ -68,6 +68,25 @@ void TestConnections::multiple_maxscales(bool value)
maxscale::multiple_maxscales = value;
}
void TestConnections::set_secondary_maxscale(const char* ip_var, const char* ip6_var)
{
const char* ip = getenv(ip_var);
const char* ip6 = getenv(ip6_var);
if (ip || ip6)
{
TestConnections::multiple_maxscales(true);
if (ip)
{
setenv("maxscale2_IP", ip, 1);
}
if (ip6)
{
setenv("maxscale2_network6", ip6, 1);
}
}
}
TestConnections::TestConnections(int argc, char *argv[]):
enable_timeouts(true),
global_result(0),
@ -1484,7 +1503,7 @@ int TestConnections::ssh_maxscale(bool sudo, const char* format, ...)
free(sys);
free(cmd);
return rc;
return WEXITSTATUS(rc);
}
int TestConnections::copy_to_maxscale(const char* src, const char* dest)

View File

@ -338,7 +338,10 @@ public:
static void require_galera_version(const char *version);
/** Initialize multiple MaxScale instances */
void multiple_maxscales(bool value);
static void multiple_maxscales(bool value);
/** Set secondary MaxScale address */
static void set_secondary_maxscale(const char* ip_var, const char* ip6_var);
/**
* @brief add_result adds result to global_result and prints error message if result is not 0