 74ec1e7400
			
		
	
	74ec1e7400
	
	
	
		
			
			If a test requires Galera but it is not available, it is now skipped. All tests that explicitly use the `test.galera` member as well as all tests that use a Galera configuration now require that Galera is present.
		
			
				
	
	
		
			175 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.5 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->maxscales->conn_rwsplit[0], "BEGIN")
 | |
|         || find_field(test->maxscales->conn_rwsplit[0], "SELECT @@server_id", "@@server_id", str)
 | |
|         || execute_query(test->maxscales->conn_rwsplit[0], "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->maxscales->connect_rwsplit(0) || check_server_id(test, server_id[2]))
 | |
|         {
 | |
|             test->tprintf("Test failed without any blocked nodes.\n");
 | |
|             rval = 1;
 | |
|             break;
 | |
|         }
 | |
|         test->maxscales->close_rwsplit(0);
 | |
|         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->maxscales->connect_rwsplit(0) || check_server_id(test, server_id[0]))
 | |
|         {
 | |
|             test->tprintf("Test failed with first blocked node.\n");
 | |
|             rval = 1;
 | |
|             break;
 | |
|         }
 | |
|         test->maxscales->close_rwsplit(0);
 | |
|         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->maxscales->connect_rwsplit(0) || check_server_id(test, server_id[3]))
 | |
|         {
 | |
|             test->tprintf("Test failed with second blocked node.\n");
 | |
|             rval = 1;
 | |
|             break;
 | |
|         }
 | |
|         test->maxscales->close_rwsplit(0);
 | |
|         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->maxscales->connect_rwsplit(0) || check_server_id(test, server_id[1]))
 | |
|         {
 | |
|             test->tprintf("Test failed with third blocked node.\n");
 | |
|             rval = 1;
 | |
|             break;
 | |
|         }
 | |
|         test->maxscales->close_rwsplit(0);
 | |
|         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->maxscales->connect_rwsplit(0)) == 0 && test->maxscales->conn_rwsplit[0])
 | |
|         {
 | |
|             test->tprintf("Connecting to rwsplit was expected to fail but it was"
 | |
|                           " successful. Returned error was %d.\n",
 | |
|                           myerrno);
 | |
|             if (execute_query(test->maxscales->conn_rwsplit[0], "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->maxscales->connect_rwsplit(0) || check_server_id(test, server_id[2]))
 | |
|         {
 | |
|             test->tprintf("Test failed after unblocking all nodes.\n");
 | |
|             rval = 1;
 | |
|             break;
 | |
|         }
 | |
|         test->maxscales->close_rwsplit(0);
 | |
|         test->tprintf("OK\n");
 | |
| 
 | |
|         /** Restart MaxScale check that states are the same */
 | |
|         test->maxscales->restart();
 | |
|         sleep(15);
 | |
|         test->tprintf("Expecting '%s'...", server_id[2]);
 | |
|         if (test->maxscales->connect_rwsplit(0) || check_server_id(test, server_id[2]))
 | |
|         {
 | |
|             test->tprintf("Test failed after restarting MaxScale.");
 | |
|             rval = 1;
 | |
|             break;
 | |
|         }
 | |
|         test->maxscales->close_rwsplit(0);
 | |
|         test->tprintf("OK\n");
 | |
|     }
 | |
|     while (false);
 | |
| 
 | |
|     if (blocked)
 | |
|     {
 | |
|         test->galera->unblock_all_nodes();
 | |
|     }
 | |
|     return rval;
 | |
| }
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|     TestConnections::require_galera(true);
 | |
|     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;
 | |
| }
 |