Merge branch '2.1' into 2.2
This commit is contained in:
@ -14,6 +14,12 @@ cmake .. $cmake_flags
|
|||||||
export LD_LIBRARY_PATH=$PWD/log_manager:$PWD/query_classifier
|
export LD_LIBRARY_PATH=$PWD/log_manager:$PWD/query_classifier
|
||||||
make
|
make
|
||||||
|
|
||||||
|
if [[ "$cmake_flags" =~ "BUILD_TESTS" ]]
|
||||||
|
then
|
||||||
|
# All tests must pass otherwise the build is considered a failure
|
||||||
|
make test || exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
export LD_LIBRARY_PATH=$(for i in `find $PWD/ -name '*.so*'`; do echo $(dirname $i); done|sort|uniq|xargs|sed -e 's/[[:space:]]/:/g')
|
export LD_LIBRARY_PATH=$(for i in `find $PWD/ -name '*.so*'`; do echo $(dirname $i); done|sort|uniq|xargs|sed -e 's/[[:space:]]/:/g')
|
||||||
make package
|
make package
|
||||||
res=$?
|
res=$?
|
||||||
|
@ -12,6 +12,12 @@ cd _build
|
|||||||
cmake .. $cmake_flags
|
cmake .. $cmake_flags
|
||||||
make
|
make
|
||||||
|
|
||||||
|
if [[ "$cmake_flags" =~ "BUILD_TESTS" ]]
|
||||||
|
then
|
||||||
|
# All tests must pass otherwise the build is considered a failure
|
||||||
|
make test || exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $remove_strip == "yes" ] ; then
|
if [ $remove_strip == "yes" ] ; then
|
||||||
sudo rm -rf /usr/bin/strip
|
sudo rm -rf /usr/bin/strip
|
||||||
sudo touch /usr/bin/strip
|
sudo touch /usr/bin/strip
|
||||||
|
@ -553,6 +553,10 @@ add_test_executable(mxs1476.cpp mxs1476 mxs1476 LABELS GALERA_BACKEND)
|
|||||||
# https://jira.mariadb.org/browse/MXS-1509
|
# https://jira.mariadb.org/browse/MXS-1509
|
||||||
add_test_executable(mxs1509.cpp mxs1509 mxs1509 LABELS REPL_BACKEND)
|
add_test_executable(mxs1509.cpp mxs1509 mxs1509 LABELS REPL_BACKEND)
|
||||||
|
|
||||||
|
# MXS-1585: Crash in MaxScale 2.1.12
|
||||||
|
# https://jira.mariadb.org/browse/MXS-1585
|
||||||
|
add_test_executable(mxs1585.cpp mxs1585 mxs1585 LABELS REPL_BACKEND)
|
||||||
|
|
||||||
# 'namedserverfilter' test
|
# 'namedserverfilter' test
|
||||||
add_test_executable(namedserverfilter.cpp namedserverfilter namedserverfilter LABELS namedserverfilter LIGHT REPL_BACKEND)
|
add_test_executable(namedserverfilter.cpp namedserverfilter namedserverfilter LABELS namedserverfilter LIGHT REPL_BACKEND)
|
||||||
|
|
||||||
|
88
maxscale-system-test/cnf/maxscale.cnf.template.mxs1585
Executable file
88
maxscale-system-test/cnf/maxscale.cnf.template.mxs1585
Executable file
@ -0,0 +1,88 @@
|
|||||||
|
[maxscale]
|
||||||
|
threads=###threads###
|
||||||
|
|
||||||
|
[Galera Monitor]
|
||||||
|
type=monitor
|
||||||
|
module=galeramon
|
||||||
|
servers=server1,server2,server3,server4
|
||||||
|
user=maxskysql
|
||||||
|
passwd=skysql
|
||||||
|
monitor_interval=1000
|
||||||
|
root_node_as_master=false
|
||||||
|
|
||||||
|
[RW Split Router]
|
||||||
|
type=service
|
||||||
|
router=readwritesplit
|
||||||
|
servers=server1,server2,server3,server4
|
||||||
|
user=maxskysql
|
||||||
|
passwd=skysql
|
||||||
|
master_failure_mode=fail_on_write
|
||||||
|
|
||||||
|
[Read Connection Router Slave]
|
||||||
|
type=service
|
||||||
|
router=readconnroute
|
||||||
|
router_options=slave
|
||||||
|
servers=server1,server2,server3,server4
|
||||||
|
user=maxskysql
|
||||||
|
passwd=skysql
|
||||||
|
|
||||||
|
[Read Connection Router Master]
|
||||||
|
type=service
|
||||||
|
router=readconnroute
|
||||||
|
router_options=master
|
||||||
|
servers=server1,server2,server3,server4
|
||||||
|
user=maxskysql
|
||||||
|
passwd=skysql
|
||||||
|
|
||||||
|
[RW Split Listener]
|
||||||
|
type=listener
|
||||||
|
service=RW Split Router
|
||||||
|
protocol=MySQLClient
|
||||||
|
port=4006
|
||||||
|
|
||||||
|
[Read Connection Listener Slave]
|
||||||
|
type=listener
|
||||||
|
service=Read Connection Router Slave
|
||||||
|
protocol=MySQLClient
|
||||||
|
port=4009
|
||||||
|
|
||||||
|
[Read Connection Listener Master]
|
||||||
|
type=listener
|
||||||
|
service=Read Connection Router Master
|
||||||
|
protocol=MySQLClient
|
||||||
|
port=4008
|
||||||
|
|
||||||
|
[CLI]
|
||||||
|
type=service
|
||||||
|
router=cli
|
||||||
|
|
||||||
|
[CLI Listener]
|
||||||
|
type=listener
|
||||||
|
service=CLI
|
||||||
|
protocol=maxscaled
|
||||||
|
socket=default
|
||||||
|
|
||||||
|
[server1]
|
||||||
|
type=server
|
||||||
|
address=###galera_server_IP_1###
|
||||||
|
port=###galera_server_port_1###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
|
[server2]
|
||||||
|
type=server
|
||||||
|
address=###galera_server_IP_2###
|
||||||
|
port=###galera_server_port_2###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
|
[server3]
|
||||||
|
type=server
|
||||||
|
address=###galera_server_IP_3###
|
||||||
|
port=###galera_server_port_3###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
|
[server4]
|
||||||
|
type=server
|
||||||
|
address=###galera_server_IP_4###
|
||||||
|
port=###galera_server_port_4###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
87
maxscale-system-test/mxs1585.cpp
Normal file
87
maxscale-system-test/mxs1585.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/**
|
||||||
|
* MXS-1585: https://jira.mariadb.org/browse/MXS-1585
|
||||||
|
*
|
||||||
|
* Check that MaxScale doesn't crash when the master is set into maintenance
|
||||||
|
* mode when master_failure_mode is fail_on_write.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "testconnections.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
static bool running = true;
|
||||||
|
|
||||||
|
void* query_thr(void* data)
|
||||||
|
{
|
||||||
|
TestConnections* test = (TestConnections*)data;
|
||||||
|
|
||||||
|
while (running)
|
||||||
|
{
|
||||||
|
MYSQL* mysql = test->open_rwsplit_connection();
|
||||||
|
|
||||||
|
while (running)
|
||||||
|
{
|
||||||
|
if (mysql_query(mysql, "SET sql_log_bin = 0") ||
|
||||||
|
mysql_query(mysql, "INSERT INTO test.mxs1585 VALUES (1)") ||
|
||||||
|
mysql_query(mysql, "DELETE FROM test.mxs1585"))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mysql_close(mysql);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
TestConnections test(argc, argv);
|
||||||
|
|
||||||
|
test.connect_maxscale();
|
||||||
|
test.try_query(test.conn_rwsplit, "DROP TABLE IF EXISTS test.mxs1585");
|
||||||
|
test.try_query(test.conn_rwsplit, "CREATE TABLE test.mxs1585(id INT) ENGINE=MEMORY");
|
||||||
|
test.close_maxscale_connections();
|
||||||
|
|
||||||
|
std::vector<pthread_t> threads;
|
||||||
|
threads.resize(100);
|
||||||
|
|
||||||
|
for (auto& a: threads)
|
||||||
|
{
|
||||||
|
pthread_create(&a, NULL, query_thr, &test);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 15; i++)
|
||||||
|
{
|
||||||
|
for (int x = 1; x <= 4; x++)
|
||||||
|
{
|
||||||
|
test.ssh_maxscale(true, "maxadmin set server server%d maintenance", x);
|
||||||
|
sleep(1);
|
||||||
|
test.ssh_maxscale(true, "maxadmin clear server server%d maintenance", x);
|
||||||
|
sleep(2);
|
||||||
|
|
||||||
|
test.ssh_maxscale(true, "maxadmin remove server server%d \"RW Split Router\" \"Galera Monitor\"", x);
|
||||||
|
sleep(1);
|
||||||
|
test.ssh_maxscale(true, "maxadmin add server server%d \"RW Split Router\" \"Galera Monitor\"", x);
|
||||||
|
sleep(2);
|
||||||
|
|
||||||
|
test.galera->block_node(x - 1);
|
||||||
|
sleep(5);
|
||||||
|
test.galera->unblock_node(x - 1);
|
||||||
|
sleep(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
running = false;
|
||||||
|
|
||||||
|
for (auto& a: threads)
|
||||||
|
{
|
||||||
|
pthread_join(a, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
test.connect_maxscale();
|
||||||
|
test.try_query(test.conn_rwsplit, "DROP TABLE test.mxs1585");
|
||||||
|
test.check_maxscale_alive();
|
||||||
|
|
||||||
|
return test.global_result;
|
||||||
|
}
|
@ -48,6 +48,7 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
qc_setup("qc_sqlite", QC_SQL_MODE_DEFAULT, NULL);
|
qc_setup("qc_sqlite", QC_SQL_MODE_DEFAULT, NULL);
|
||||||
qc_process_init(QC_INIT_BOTH);
|
qc_process_init(QC_INIT_BOTH);
|
||||||
|
qc_thread_init(QC_INIT_BOTH);
|
||||||
|
|
||||||
infile = fopen(argv[1], "rb");
|
infile = fopen(argv[1], "rb");
|
||||||
outfile = fopen(argv[2], "wb");
|
outfile = fopen(argv[2], "wb");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
if [[ $# -lt 4 ]]
|
if [ $# -lt 4 ]
|
||||||
then
|
then
|
||||||
echo "Usage: canontest.sh <logfile name> <input file> <output file> <expected output>"
|
echo "Usage: canontest.sh <logfile name> <input file> <output file> <expected output>"
|
||||||
exit 0
|
exit 0
|
||||||
@ -11,7 +11,7 @@ EXPECTED=$4
|
|||||||
DIFFLOG=diff.out
|
DIFFLOG=diff.out
|
||||||
|
|
||||||
if [ $# -eq 5 ]
|
if [ $# -eq 5 ]
|
||||||
then
|
then
|
||||||
EXECUTABLE=$5
|
EXECUTABLE=$5
|
||||||
else
|
else
|
||||||
EXECUTABLE=$PWD/canonizer
|
EXECUTABLE=$PWD/canonizer
|
||||||
@ -20,11 +20,11 @@ fi
|
|||||||
$EXECUTABLE $INPUT $OUTPUT
|
$EXECUTABLE $INPUT $OUTPUT
|
||||||
diff $OUTPUT $EXPECTED > $DIFFLOG
|
diff $OUTPUT $EXPECTED > $DIFFLOG
|
||||||
if [ $? -eq 0 ]
|
if [ $? -eq 0 ]
|
||||||
then
|
then
|
||||||
echo "PASSED" >> $TESTLOG
|
echo "PASSED" >> $TESTLOG
|
||||||
exval=0
|
exval=0
|
||||||
else
|
else
|
||||||
echo "FAILED" >> $TESTLOG
|
echo "FAILED" >> $TESTLOG
|
||||||
echo "Diff output: " >> $TESTLOG
|
echo "Diff output: " >> $TESTLOG
|
||||||
cat $DIFFLOG >> $TESTLOG
|
cat $DIFFLOG >> $TESTLOG
|
||||||
exval=1
|
exval=1
|
||||||
|
@ -15,3 +15,4 @@ QUERY_TYPE_SESSION_WRITE
|
|||||||
QUERY_TYPE_READ|QUERY_TYPE_MASTER_READ
|
QUERY_TYPE_READ|QUERY_TYPE_MASTER_READ
|
||||||
QUERY_TYPE_READ|QUERY_TYPE_MASTER_READ
|
QUERY_TYPE_READ|QUERY_TYPE_MASTER_READ
|
||||||
QUERY_TYPE_READ|QUERY_TYPE_MASTER_READ
|
QUERY_TYPE_READ|QUERY_TYPE_MASTER_READ
|
||||||
|
QUERY_TYPE_READ|QUERY_TYPE_SYSVAR_READ
|
||||||
|
@ -15,3 +15,4 @@ use X;
|
|||||||
select last_insert_id();
|
select last_insert_id();
|
||||||
select @@last_insert_id;
|
select @@last_insert_id;
|
||||||
select @@identity;
|
select @@identity;
|
||||||
|
select if(@@hostname='box02','prod_mariadb02','n');
|
||||||
|
@ -183,6 +183,8 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
if (mxs_log_init(NULL, ".", MXS_LOG_TARGET_DEFAULT))
|
if (mxs_log_init(NULL, ".", MXS_LOG_TARGET_DEFAULT))
|
||||||
{
|
{
|
||||||
|
set_libdir(strdup("../../../query_classifier/qc_sqlite"));
|
||||||
|
|
||||||
// We have to setup something in order for the regexes to be compiled.
|
// We have to setup something in order for the regexes to be compiled.
|
||||||
if (qc_setup("qc_sqlite", QC_SQL_MODE_DEFAULT, NULL) &&
|
if (qc_setup("qc_sqlite", QC_SQL_MODE_DEFAULT, NULL) &&
|
||||||
qc_process_init(QC_INIT_BOTH) &&
|
qc_process_init(QC_INIT_BOTH) &&
|
||||||
|
@ -420,6 +420,8 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
if (mxs_log_init(NULL, ".", MXS_LOG_TARGET_DEFAULT))
|
if (mxs_log_init(NULL, ".", MXS_LOG_TARGET_DEFAULT))
|
||||||
{
|
{
|
||||||
|
set_libdir(strdup("../../../query_classifier/qc_sqlite"));
|
||||||
|
|
||||||
// We have to setup something in order for the regexes to be compiled.
|
// We have to setup something in order for the regexes to be compiled.
|
||||||
if (qc_setup("qc_sqlite", QC_SQL_MODE_DEFAULT, NULL) &&
|
if (qc_setup("qc_sqlite", QC_SQL_MODE_DEFAULT, NULL) &&
|
||||||
qc_process_init(QC_INIT_BOTH) &&
|
qc_process_init(QC_INIT_BOTH) &&
|
||||||
|
@ -590,7 +590,7 @@ static pcre2_code* remove_comments_re = NULL;
|
|||||||
static const PCRE2_SPTR remove_comments_pattern = (PCRE2_SPTR)
|
static const PCRE2_SPTR remove_comments_pattern = (PCRE2_SPTR)
|
||||||
"(?:`[^`]*`\\K)|"
|
"(?:`[^`]*`\\K)|"
|
||||||
"(\\/[*](?!(M?!)).*?[*]\\/)|"
|
"(\\/[*](?!(M?!)).*?[*]\\/)|"
|
||||||
"([[:space:]](?:#.*|--[[:space:]].*(\\n|\\r\\n)))";
|
"((?:#.*|--[[:space:]].*)(\\n|\\r\\n|$))";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove SQL comments from the end of a string
|
* Remove SQL comments from the end of a string
|
||||||
|
@ -989,6 +989,8 @@ SRWBackend handle_slave_is_target(RWSplit *inst, RWSplitSession *rses,
|
|||||||
static void log_master_routing_failure(RWSplitSession *rses, bool found,
|
static void log_master_routing_failure(RWSplitSession *rses, bool found,
|
||||||
SRWBackend& old_master, SRWBackend& curr_master)
|
SRWBackend& old_master, SRWBackend& curr_master)
|
||||||
{
|
{
|
||||||
|
ss_dassert(!old_master || old_master->dcb()->dcb_role == DCB_ROLE_BACKEND_HANDLER);
|
||||||
|
ss_dassert(!curr_master || curr_master->dcb()->dcb_role == DCB_ROLE_BACKEND_HANDLER);
|
||||||
char errmsg[MAX_SERVER_ADDRESS_LEN * 2 + 100]; // Extra space for error message
|
char errmsg[MAX_SERVER_ADDRESS_LEN * 2 + 100]; // Extra space for error message
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
@ -999,6 +1001,8 @@ static void log_master_routing_failure(RWSplitSession *rses, bool found,
|
|||||||
{
|
{
|
||||||
/** We found a master but it's not the same connection */
|
/** We found a master but it's not the same connection */
|
||||||
ss_dassert(old_master != curr_master);
|
ss_dassert(old_master != curr_master);
|
||||||
|
ss_dassert(old_master->dcb()->server && curr_master->dcb()->server);
|
||||||
|
|
||||||
if (old_master != curr_master)
|
if (old_master != curr_master)
|
||||||
{
|
{
|
||||||
sprintf(errmsg, "Master server changed from '%s' to '%s'",
|
sprintf(errmsg, "Master server changed from '%s' to '%s'",
|
||||||
|
Reference in New Issue
Block a user