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;
 | 
						|
}
 |