2017-12-08 12:23:04 +02:00

126 lines
5.3 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;
}