133 lines
5.5 KiB
C++
133 lines
5.5 KiB
C++
/**
|
|
* @file bug488.cpp regression case for bug 488 ("SHOW VARIABLES randomly failing with "Lost connection to
|
|
* MySQL server")
|
|
*
|
|
* - try "SHOW VARIABLES;" 100 times against all Maxscale services
|
|
* First round: 100 iterations for RWSplit, then ReadConn Master, then ReadConn Slave
|
|
* Second round: 100 iteration and in every iterations all three Maxscale services are in use.
|
|
* - check if Maxscale is alive.
|
|
*/
|
|
|
|
/*
|
|
* Kolbe Kegel 2014-08-27 18:37:14 UTC
|
|
* Created attachment 138 [details]
|
|
* good.txt and bad.txt
|
|
*
|
|
* Sending "SHOW VARIABLES" to MaxScale seems to sometimes result in "ERROR 2013 (HY000) at line 1: Lost
|
|
* connection to MySQL server during query". It appears to be random. It seems to be sending the query to the
|
|
* same backend server, so I'm not sure what is happening. I'm including the debug log for both the "good" and
|
|
* "bad" queries.
|
|
* Comment 1 Vilho Raatikka 2014-08-27 18:41:25 UTC
|
|
* Seems to happen exactly every second time with rwsplit router. Didn't experience it with read connection
|
|
* router.
|
|
* Comment 2 Kolbe Kegel 2014-08-27 18:47:13 UTC
|
|
* Not exactly every 2nd time.
|
|
*
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
|
|
* $ mysql -h max1 -P 4006 -u maxuser -pmaxpwd -e 'show variables' >/dev/null
|
|
* ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
|
|
* Comment 3 Vilho Raatikka 2014-08-28 10:48:39 UTC
|
|
* SHOW VARIABLES is session write command - which is unnecessary because those could be read from any server
|
|
* - and what causes client to return 'lost connection' message to the user is duplicated response packet from
|
|
* MaxScale to the client.
|
|
*
|
|
* SHOW VARIABLES response should start like this:
|
|
* T 127.0.0.1:59776 -> 127.0.0.1:4006 [AP]
|
|
* 0f 00 00 00 03 73 68 6f 77 20 76 61 72 69 61 62 .....show variab
|
|
* 6c 65 73 les
|
|
*
|
|
* T 127.0.0.1:4006 -> 127.0.0.1:59776 [AP]
|
|
* 01 00 00 01 02 .....
|
|
*
|
|
* T 127.0.0.1:4006 -> 127.0.0.1:59776 [AP]
|
|
* 54 00 00 02 03 64 65 66 12 69 6e 66 6f 72 6d 61 T....def.informa
|
|
* 74 69 6f 6e 5f 73 63 68 65 6d 61 09 56 41 52 49 tion_schema.VARI
|
|
* 41 42 4c 45 53 09 56 41 52 49 41 42 4c 45 53 0d ABLES.VARIABLES.
|
|
* 56 61 72 69 61 62 6c 65 5f 6e 61 6d 65 0d 56 41 Variable_name.VA
|
|
* 52 49 41 42 4c 45 5f 4e 41 4d 45 0c 08 00 40 00 RIABLE_NAME...@.
|
|
* 00 00 fd 01 00 00 00 00 ........
|
|
*
|
|
* While in the failing case the initial packet is followed something like this:
|
|
*
|
|
* T 127.0.0.1:59776 -> 127.0.0.1:4006 [AP]
|
|
* 0f 00 00 00 03 73 68 6f 77 20 76 61 72 69 61 62 .....show variab
|
|
* 6c 65 73 les
|
|
*
|
|
* T 127.0.0.1:4006 -> 127.0.0.1:59776 [AP]
|
|
* 1d 00 00 d5 18 69 6e 6e 6f 64 62 5f 75 73 65 5f .....innodb_use_
|
|
* 61 74 6f 6d 69 63 5f 77 72 69 74 65 73 03 4f 46 atomic_writes.OF
|
|
* 46 F
|
|
*
|
|
* T 127.0.0.1:4006 -> 127.0.0.1:59776 [AP]
|
|
* 19 00 00 d6 14 69 6e 6e 6f 64 62 5f 75 73 65 5f .....innodb_use_
|
|
* 66 61 6c 6c 6f 63 61 74 65 03 4f 46 46 fallocate.OFF
|
|
*
|
|
* - where those innodb related packets are duplicates from the previous response.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
#include <iostream>
|
|
#include "testconnections.h"
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
TestConnections* Test = new TestConnections(argc, argv);
|
|
Test->set_timeout(10);
|
|
int i;
|
|
|
|
Test->repl->connect();
|
|
Test->maxscales->connect_maxscale(0);
|
|
|
|
Test->tprintf("Trying SHOW VARIABLES to different Maxscale services\n");
|
|
fflush(stdout);
|
|
Test->tprintf("RWSplit\n");
|
|
for (i = 0; i < 100; i++)
|
|
{
|
|
Test->set_timeout(5);
|
|
Test->try_query(Test->maxscales->conn_rwsplit[0], (char*) "SHOW VARIABLES;");
|
|
}
|
|
Test->tprintf("ReadConn master\n");
|
|
for (i = 0; i < 100; i++)
|
|
{
|
|
Test->set_timeout(5);
|
|
Test->try_query(Test->maxscales->conn_master[0], (char*) "SHOW VARIABLES;");
|
|
}
|
|
Test->tprintf("ReadConn slave\n");
|
|
for (i = 0; i < 100; i++)
|
|
{
|
|
Test->set_timeout(5);
|
|
Test->try_query(Test->maxscales->conn_slave[0], (char*) "SHOW VARIABLES;");
|
|
}
|
|
|
|
Test->tprintf("All in one loop\n");
|
|
for (i = 0; i < 100; i++)
|
|
{
|
|
Test->set_timeout(5);
|
|
Test->try_query(Test->maxscales->conn_rwsplit[0], (char*) "SHOW VARIABLES;");
|
|
Test->try_query(Test->maxscales->conn_master[0], (char*) "SHOW VARIABLES;");
|
|
Test->try_query(Test->maxscales->conn_slave[0], (char*) "SHOW VARIABLES;");
|
|
}
|
|
|
|
Test->set_timeout(10);
|
|
Test->maxscales->close_maxscale_connections(0);
|
|
Test->repl->close_connections();
|
|
|
|
Test->check_maxscale_alive(0);
|
|
|
|
int rval = Test->global_result;
|
|
delete Test;
|
|
return rval;
|
|
}
|