113 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * MySQL Monitor crash safety test
 | 
						|
 *
 | 
						|
 * - Start MaxScale
 | 
						|
 * - Kill slaves to trigger stale master status
 | 
						|
 * - Kill MaxScale process and restart MaxScale
 | 
						|
 * - Expect stale master status to still exist for the master
 | 
						|
 */
 | 
						|
 | 
						|
#include "testconnections.h"
 | 
						|
 | 
						|
void check_master(TestConnections& test)
 | 
						|
{
 | 
						|
    test.add_result(test.find_master_maxadmin(test.repl) != 0, "Node 0 is not the master");
 | 
						|
 | 
						|
    test.connect_maxscale();
 | 
						|
    test.try_query(test.conn_rwsplit, "INSERT INTO test.t1 VALUES (1)");
 | 
						|
    test.close_maxscale_connections();
 | 
						|
}
 | 
						|
 | 
						|
void check_slave(TestConnections& test)
 | 
						|
{
 | 
						|
    test.add_result(test.find_slave_maxadmin(test.repl) == -1, "No slaves found");
 | 
						|
 | 
						|
    test.connect_maxscale();
 | 
						|
    test.try_query(test.conn_rwsplit, "SELECT * FROM test.t1");
 | 
						|
    test.close_maxscale_connections();
 | 
						|
}
 | 
						|
 | 
						|
void kill_maxscale(TestConnections& test)
 | 
						|
{
 | 
						|
    test.tprintf("Killing and restarting MaxScale");
 | 
						|
    test.ssh_maxscale(true, "pkill -9 maxscale");
 | 
						|
    test.start_maxscale();
 | 
						|
 | 
						|
    test.tprintf("Waiting for MaxScale to start");
 | 
						|
    sleep(10);
 | 
						|
}
 | 
						|
 | 
						|
void restart_maxscale(TestConnections& test)
 | 
						|
{
 | 
						|
    test.restart_maxscale();
 | 
						|
    test.tprintf("Waiting for MaxScale to start");
 | 
						|
    sleep(10);
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char** argv)
 | 
						|
{
 | 
						|
    TestConnections test(argc, argv);
 | 
						|
 | 
						|
    test.connect_maxscale();
 | 
						|
    test.try_query(test.conn_rwsplit, "CREATE OR REPLACE TABLE test.t1(id int)");
 | 
						|
    test.close_maxscale_connections();
 | 
						|
 | 
						|
    test.tprintf("Checking that node 0 is the master and slaves are OK");
 | 
						|
    check_master(test);
 | 
						|
    check_slave(test);
 | 
						|
 | 
						|
    test.tprintf("Blocking slaves to trigger stale master status");
 | 
						|
    test.repl->block_node(1);
 | 
						|
    test.repl->block_node(2);
 | 
						|
    test.repl->block_node(3);
 | 
						|
    sleep(5);
 | 
						|
 | 
						|
    test.tprintf("Checking that master has stale status");
 | 
						|
    check_master(test);
 | 
						|
 | 
						|
    kill_maxscale(test);
 | 
						|
 | 
						|
    test.tprintf("Checking that master still has stale status");
 | 
						|
    check_master(test);
 | 
						|
 | 
						|
    restart_maxscale(test);
 | 
						|
 | 
						|
    test.tprintf("Checking that master has stale status after restart");
 | 
						|
    check_master(test);
 | 
						|
 | 
						|
    test.repl->unblock_node(1);
 | 
						|
    test.repl->unblock_node(2);
 | 
						|
    test.repl->unblock_node(3);
 | 
						|
    sleep(5);
 | 
						|
 | 
						|
    test.tprintf("Checking that node 0 is the master and slaves are OK");
 | 
						|
    check_master(test);
 | 
						|
    check_slave(test);
 | 
						|
 | 
						|
    test.tprintf("Blocking master to trigger stale slave status");
 | 
						|
    test.repl->block_node(0);
 | 
						|
    sleep(5);
 | 
						|
 | 
						|
    test.tprintf("Checking that slaves have stale status");
 | 
						|
    check_slave(test);
 | 
						|
 | 
						|
    kill_maxscale(test);
 | 
						|
 | 
						|
    test.tprintf("Checking that slaves still have stale status");
 | 
						|
    check_slave(test);
 | 
						|
 | 
						|
    restart_maxscale(test);
 | 
						|
 | 
						|
    test.tprintf("Checking that slaves have stale status after restart");
 | 
						|
    check_slave(test);
 | 
						|
 | 
						|
    test.repl->unblock_node(0);
 | 
						|
    sleep(5);
 | 
						|
 | 
						|
    test.tprintf("Checking that node 0 is the master and slaves are OK");
 | 
						|
    check_master(test);
 | 
						|
    check_slave(test);
 | 
						|
 | 
						|
    return test.global_result;
 | 
						|
}
 |