194 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			3.9 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->set_timeout(10);
 | |
| 
 | |
|     Test->repl->connect();
 | |
|     Test->add_result(Test->connect_maxscale(), "Failed to connect to MaxScale\n");
 | |
| 
 | |
|     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++)
 | |
|         {
 | |
|             if (j != 1 )
 | |
|             {
 | |
|                 Test->set_timeout(5);
 | |
|                 sprintf(hint_sql, "select @@server_id; -- maxscale route to server server%d", j + 1);
 | |
| 
 | |
|                 find_field(Test->conn_rwsplit, 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->close_maxscale_connections();
 | |
|     Test->repl->close_connections();
 | |
| 
 | |
|     Test->check_maxscale_alive();
 | |
| 
 | |
|     int rval = Test->global_result;
 | |
|     delete Test;
 | |
|     return rval;
 | |
| }
 | 
