160 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * @file galera_priority.cpp Galera node priority test
 | 
						|
 *
 | 
						|
 * Node priorities are configured in the following order:
 | 
						|
 * node3 > node1 > node4 > node2
 | 
						|
 *
 | 
						|
 * The test executes a SELECT @@server_id to get the server id of each
 | 
						|
 * node. The same query is executed in a transaction through MaxScale
 | 
						|
 * and the server id should match the expected output depending on which
 | 
						|
 * of the nodes are available. The simple test blocks nodes from highest priority
 | 
						|
 * to lowest priority.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#include <iostream>
 | 
						|
#include "testconnections.h"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
int check_server_id(TestConnections* test, char *node_id)
 | 
						|
{
 | 
						|
    char str[1024];
 | 
						|
    int rval = 0;
 | 
						|
    if (execute_query(test->conn_rwsplit, "BEGIN") ||
 | 
						|
            find_field(test->conn_rwsplit, "SELECT @@server_id", "@@server_id", str) ||
 | 
						|
            execute_query(test->conn_rwsplit, "COMMIT"))
 | 
						|
    {
 | 
						|
        test->tprintf("Failed to compare @@server_id.\n");
 | 
						|
        rval = 1;
 | 
						|
    }
 | 
						|
    else if (strcmp(node_id, str))
 | 
						|
    {
 | 
						|
        test->tprintf("@@server_id is %s instead of %s\n", str, node_id);
 | 
						|
        rval = 1;
 | 
						|
    }
 | 
						|
    return rval;
 | 
						|
}
 | 
						|
 | 
						|
int simple_failover(TestConnections* test)
 | 
						|
{
 | 
						|
    test->galera->connect();
 | 
						|
    int rval = 0;
 | 
						|
    bool blocked = false;
 | 
						|
    char server_id[test->galera->N][1024];
 | 
						|
 | 
						|
    /** Get server_id for each node */
 | 
						|
    for (int i = 0; i < test->galera->N; i++)
 | 
						|
    {
 | 
						|
        sprintf(server_id[i], "%d", test->galera->get_server_id(i));
 | 
						|
    }
 | 
						|
 | 
						|
    do
 | 
						|
    {
 | 
						|
        /** Node 3 should be master */
 | 
						|
        test->tprintf("Executing SELECT @@server_id, expecting '%s'...\n", server_id[2]);
 | 
						|
        if (test->connect_rwsplit() || check_server_id(test, server_id[2]))
 | 
						|
        {
 | 
						|
            test->tprintf("Test failed without any blocked nodes.\n");
 | 
						|
            rval = 1;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        test->close_rwsplit();
 | 
						|
        test->galera->block_node(2);
 | 
						|
        blocked = true;
 | 
						|
        test->tprintf("OK\n");
 | 
						|
        sleep(15);
 | 
						|
 | 
						|
        /** Block node 3 and node 1 should be master */
 | 
						|
        test->tprintf("Expecting '%s'...\n", server_id[0]);
 | 
						|
        if (test->connect_rwsplit() || check_server_id(test, server_id[0]))
 | 
						|
        {
 | 
						|
            test->tprintf("Test failed with first blocked node.\n");
 | 
						|
            rval = 1;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        test->close_rwsplit();
 | 
						|
        test->galera->block_node(0);
 | 
						|
        test->tprintf("OK\n");
 | 
						|
        sleep(15);
 | 
						|
 | 
						|
        /** Block node 1 and node 4 should be master */
 | 
						|
        test->tprintf("Expecting '%s'...\n", server_id[3]);
 | 
						|
        if (test->connect_rwsplit() || check_server_id(test, server_id[3]))
 | 
						|
        {
 | 
						|
            test->tprintf("Test failed with second blocked node.\n");
 | 
						|
            rval = 1;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        test->close_rwsplit();
 | 
						|
        test->galera->block_node(3);
 | 
						|
        test->tprintf("OK\n");
 | 
						|
        sleep(15);
 | 
						|
 | 
						|
        /** Block node 4 and node 2 should be master */
 | 
						|
        test->tprintf("Expecting '%s'...\n", server_id[1]);
 | 
						|
        if (test->connect_rwsplit() || check_server_id(test, server_id[1]))
 | 
						|
        {
 | 
						|
            test->tprintf("Test failed with third blocked node.\n");
 | 
						|
            rval = 1;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        test->close_rwsplit();
 | 
						|
        test->galera->block_node(1);
 | 
						|
        test->tprintf("OK\n");
 | 
						|
        sleep(15);
 | 
						|
 | 
						|
        /** All nodes blocked, expect failure */
 | 
						|
        test->tprintf("Expecting failure...\n");
 | 
						|
        int myerrno = 0;
 | 
						|
        if ((myerrno = test->connect_rwsplit()) == 0 && test->conn_rwsplit)
 | 
						|
        {
 | 
						|
            test->tprintf("Connecting to rwsplit was expected to fail but it was"
 | 
						|
                          " successful. Returned error was %d.\n", myerrno);
 | 
						|
            if (execute_query(test->conn_rwsplit, "SELECT @@server_id") == 0)
 | 
						|
            {
 | 
						|
                test->tprintf("SELECT @@server_id was expected to fail but the query was successful.\n");
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                test->tprintf("Connection succeeded but query failed.\n");
 | 
						|
            }
 | 
						|
            test->tprintf("Test failed with all nodes blocked.\n");
 | 
						|
            rval = 1;
 | 
						|
        }
 | 
						|
        test->tprintf("OK\n");
 | 
						|
 | 
						|
        /** Unblock all nodes, node 3 should be master again */
 | 
						|
        test->galera->unblock_all_nodes();
 | 
						|
        blocked = false;
 | 
						|
        sleep(15);
 | 
						|
        test->tprintf("Expecting '%s'...\n", server_id[2]);
 | 
						|
        if (test->connect_rwsplit() || check_server_id(test, server_id[2]))
 | 
						|
        {
 | 
						|
            test->tprintf("Test failed after unblocking all nodes.\n");
 | 
						|
            rval = 1;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        test->close_rwsplit();
 | 
						|
        test->tprintf("OK\n");
 | 
						|
    }
 | 
						|
    while (false);
 | 
						|
 | 
						|
    if (blocked)
 | 
						|
    {
 | 
						|
        test->galera->unblock_all_nodes();
 | 
						|
    }
 | 
						|
    return rval;
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
    TestConnections *test = new TestConnections(argc, argv);
 | 
						|
    test->galera->verbose = false;
 | 
						|
    int rval1 = 0;
 | 
						|
    rval1 += simple_failover(test);
 | 
						|
    int rval = test->global_result;
 | 
						|
    delete test;
 | 
						|
    return rval;
 | 
						|
}
 |