200 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * @file bug471.cpp bug471 regression case ( Routing Hints route to server sometimes doesn't work )
 | 
						|
 *
 | 
						|
 * - try "select @@server_id; -- maxscale route to server server%d" (where %d - server number) and compares
 | 
						|
 * result
 | 
						|
 * with "select @@server_id;" sent directly to backend node.
 | 
						|
 * - do it 25 times.
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 *  Massimiliano 2014-08-06 13:27:05 UTC
 | 
						|
 *  I found using basic routing hints such as:
 | 
						|
 *
 | 
						|
 *  select @@server_id; -- maxscale route to server server4
 | 
						|
 *  select @@server_id; -- maxscale route to server server3
 | 
						|
 *  select @@server_id; -- maxscale route to server server2
 | 
						|
 *
 | 
						|
 *  server3 is the current master
 | 
						|
 *
 | 
						|
 *  and server4 server_id is 4
 | 
						|
 *  server3 server_id is 3
 | 
						|
 *  server2 server_id is 2
 | 
						|
 *
 | 
						|
 *  sometimes I cannot get the expected results that are:
 | 
						|
 *
 | 
						|
 *  4
 | 
						|
 *  3
 | 
						|
 *  2
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *  Sometimes I got:
 | 
						|
 *
 | 
						|
 *  2
 | 
						|
 *  3
 | 
						|
 *  2
 | 
						|
 *
 | 
						|
 *  or
 | 
						|
 *
 | 
						|
 *  4
 | 
						|
 *  3
 | 
						|
 *  4
 | 
						|
 *
 | 
						|
 *  In maxScale configuration 5 servers defined:
 | 
						|
 *
 | 
						|
 *  server1 is not monitored but listed in [RW Split Service]
 | 
						|
 *  server5 is always stopped
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *  MaxScale configuration:
 | 
						|
 *
 | 
						|
 *  [gateway]
 | 
						|
 *  threads=4
 | 
						|
 *
 | 
						|
 *  [RW Split Service]
 | 
						|
 #Please note server1 is not monitored n MySQL Monitor section
 | 
						|
 *  type=service
 | 
						|
 *  router=readwritesplit
 | 
						|
 *  servers=server1,server2,server3,server5,server4
 | 
						|
 *  max_slave_connections=100%
 | 
						|
 *  max_slave_replication_lag=21
 | 
						|
 *  user=massi
 | 
						|
 *  passwd=massi
 | 
						|
 *  enable_root_user=0
 | 
						|
 *  filters=Hint
 | 
						|
 *
 | 
						|
 # Definition of the servers
 | 
						|
 #  [server1]
 | 
						|
 #not monitored
 | 
						|
 #  type=server
 | 
						|
 #  address=127.0.0.1
 | 
						|
 #  port=3306
 | 
						|
 #  protocol=MySQLBackend
 | 
						|
 #
 | 
						|
 #  [server2]
 | 
						|
 #  type=server
 | 
						|
 #  address=127.0.0.1
 | 
						|
 #  port=3307
 | 
						|
 #  protocol=MySQLBackend
 | 
						|
 #
 | 
						|
 #  [server3]
 | 
						|
 #  type=server
 | 
						|
 #  address=127.0.0.1
 | 
						|
 #  port=3308
 | 
						|
 #  protocol=MySQLBackend
 | 
						|
 #
 | 
						|
 #  [server4]
 | 
						|
 #  type=server
 | 
						|
 #  address=127.0.0.1
 | 
						|
 #  port=3309
 | 
						|
 #  protocol=MySQLBackend
 | 
						|
 #
 | 
						|
 #  [server5]
 | 
						|
 #always stopped
 | 
						|
 #  type=server
 | 
						|
 #  address=127.0.0.1
 | 
						|
 #  port=3310
 | 
						|
 #  protocol=MySQLBackend
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #  [RW Split Listener]
 | 
						|
 #  type=listener
 | 
						|
 #  service=RW Split Service
 | 
						|
 #  protocol=MySQLClient
 | 
						|
 #  port=4606
 | 
						|
 #
 | 
						|
 #  [Hint]
 | 
						|
 #  type=filter
 | 
						|
 #  module=hintfilter
 | 
						|
 #
 | 
						|
 #  [MySQL Monitor]
 | 
						|
 # Please note server1 is not monitored
 | 
						|
 #  type=monitor
 | 
						|
 #  module=mysqlmon
 | 
						|
 #  servers=server4,server2,server3,server5
 | 
						|
 #  user=massi
 | 
						|
 #  passwd=massi
 | 
						|
 #  detect_replication_lag=1
 | 
						|
 #  monitor_interval=10001
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #  Removing server1 from the service section gives right results for server_id selection
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #
 | 
						|
 # mysql -c -h 127.0.0.1 -P 4606 -umassi -pmassi
 | 
						|
 #  MariaDB> select @@server_id; -- maxscale route to server server4
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #  Please not -c option that allows comments to be sent
 | 
						|
 #
 | 
						|
 #
 | 
						|
 #  Vilho Raatikka 2014-08-08 08:13:42 UTC
 | 
						|
 #  After further consideration we decided that the behavior is invalid. Routing hints should be followed if
 | 
						|
 #they don't violate database consistency nor cluster setup.
 | 
						|
 #  Comment 11 Vilho Raatikka 2014-08-08 17:26:25 UTC
 | 
						|
 #  Pushed fix in commit d4de582e1622908cc95396f57878f8691289c35b to Z2.
 | 
						|
 #  Replication lag is not checked if routing hint is used.
 | 
						|
 #
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#include <iostream>
 | 
						|
#include <unistd.h>
 | 
						|
#include "testconnections.h"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
int main(int argc, char* argv[])
 | 
						|
{
 | 
						|
    TestConnections* Test = new TestConnections(argc, argv);
 | 
						|
    Test->repl->limit_nodes(Test->maxscales->get_backend_servers_num(0, "RW-Split-Router"));
 | 
						|
    Test->set_timeout(10);
 | 
						|
 | 
						|
    Test->repl->connect();
 | 
						|
    Test->add_result(Test->maxscales->connect_maxscale(0), "Failed to connect to MaxScale\n");
 | 
						|
 | 
						|
    char server_id[256];
 | 
						|
    char server_id_d[256];
 | 
						|
 | 
						|
    char hint_sql[80];
 | 
						|
 | 
						|
    for (int i = 1; i < 25; i++)
 | 
						|
    {
 | 
						|
        for (int j = 0; j < Test->repl->N; j++)
 | 
						|
        {
 | 
						|
            if (j != 1)
 | 
						|
            {
 | 
						|
                Test->set_timeout(5);
 | 
						|
                sprintf(hint_sql, "select @@server_id; -- maxscale route to server server%d", j + 1);
 | 
						|
 | 
						|
                find_field(Test->maxscales->conn_rwsplit[0], hint_sql, (char*) "@@server_id", &server_id[0]);
 | 
						|
                find_field(Test->repl->nodes[j],
 | 
						|
                           (char*) "select @@server_id;",
 | 
						|
                           (char*) "@@server_id",
 | 
						|
                           &server_id_d[0]);
 | 
						|
 | 
						|
                Test->tprintf("server%d ID from Maxscale: \t%s\n", j + 1, server_id);
 | 
						|
                Test->tprintf("server%d ID directly from node: \t%s\n", j + 1, server_id_d);
 | 
						|
 | 
						|
                Test->add_result(strcmp(server_id, server_id_d), "Hints does not work!\n");
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    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;
 | 
						|
}
 |