Basic tests can be executed with 15 machines Master/slave backend. Tests have label BIG_REPL_BACKEND Default template modified to support big backend. Tests temporaraly labeled as UNSTABLE to prevent their execution nightly
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * @file bug587.cpp  regression case for the bug 587 ( "Hint filter don't work if listed before regex filter
 | 
						|
 * in configuration file" )
 | 
						|
 *
 | 
						|
 * - Maxscale.cnf
 | 
						|
 * @verbatim
 | 
						|
 *  [hints]
 | 
						|
 *  type=filter
 | 
						|
 *  module=hintfilter
 | 
						|
 *
 | 
						|
 *  [regex]
 | 
						|
 *  type=filter
 | 
						|
 *  module=regexfilter
 | 
						|
 *  match=fetch
 | 
						|
 *  replace=select
 | 
						|
 *
 | 
						|
 *  [RW Split Router]
 | 
						|
 *  type=service
 | 
						|
 *  router= readwritesplit
 | 
						|
 *  servers=server1,     server2,              server3,server4
 | 
						|
 *  user=skysql
 | 
						|
 *  passwd=skysql
 | 
						|
 *  max_slave_connections=100%
 | 
						|
 *  use_sql_variables_in=all
 | 
						|
 *  router_options=slave_selection_criteria=LEAST_BEHIND_MASTER
 | 
						|
 *  filters=hints|regex
 | 
						|
 *  @endverbatim
 | 
						|
 * - second test (bug587_1) is executed with "filters=regex|hints" (dffeent order of filters)
 | 
						|
 * - check if hints filter working by executing and comparing results:
 | 
						|
 *  + via RWSPLIT: "select @@server_id; -- maxscale route to server server%d" (%d - node number)
 | 
						|
 *  + directly to backend node "select @@server_id;"
 | 
						|
 * - do the same test with "filters=regex|hints" "filters=hints|regex"
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 *  Vilho Raatikka 2014-10-21 19:12:33 UTC
 | 
						|
 *  If filters and rwsplit are configured as follows, hints don't work.
 | 
						|
 *
 | 
						|
 *  [hints]
 | 
						|
 *  type=filter
 | 
						|
 *  module=hintfilter
 | 
						|
 *
 | 
						|
 *  [regex]
 | 
						|
 *  type=filter
 | 
						|
 *  module=regexfilter
 | 
						|
 *  match=fetch
 | 
						|
 *  replace=select
 | 
						|
 *
 | 
						|
 *  [RW Split Router]
 | 
						|
 *  type=service
 | 
						|
 *  router=readwritesplit
 | 
						|
 *  servers=server1,server2,server3,server4
 | 
						|
 *  max_slave_connections=100%
 | 
						|
 *  use_sql_variables_in=all
 | 
						|
 *  user=maxuser
 | 
						|
 *  passwd=maxpwd
 | 
						|
 *  filters=hints|regex
 | 
						|
 *
 | 
						|
 *  Changing filters=regex|hints makes it work. This is due to processing order. Regex filter drops hint off.
 | 
						|
 *  Comment 1 Vilho Raatikka 2014-10-23 18:08:07 UTC
 | 
						|
 *  buffer.c:gwbuf_make_contiguous: hint wasn't duplicated to new GWBUF struct. As a result hints were lost if
 | 
						|
 * query rewriting resulted in longer query than the original.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#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(4);
 | 
						|
    Test->set_timeout(10);
 | 
						|
    Test->repl->connect();
 | 
						|
    Test->maxscales->connect_maxscale(0);
 | 
						|
 | 
						|
    char server_id[256];
 | 
						|
    char server_id_d[256];
 | 
						|
 | 
						|
    char hint_sql[64];
 | 
						|
 | 
						|
    for (int i = 1; i < 25; i++)
 | 
						|
    {
 | 
						|
        for (int j = 0; j < Test->repl->N; j++)
 | 
						|
        {
 | 
						|
            Test->set_timeout(10);
 | 
						|
            sprintf(hint_sql, "select @@server_id; -- maxscale route to server server%d", j + 1);
 | 
						|
            Test->tprintf("%s\n", hint_sql);
 | 
						|
 | 
						|
            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->maxscales->close_maxscale_connections(0);
 | 
						|
    Test->repl->close_connections();
 | 
						|
 | 
						|
    Test->check_maxscale_alive(0);
 | 
						|
 | 
						|
    int rval = Test->global_result;
 | 
						|
    delete Test;
 | 
						|
    return rval;
 | 
						|
}
 |