/** * @file bug592.cpp regression case for bug 592 ( "slave in "Running" state breaks authorization" ) MXS-326 * * - stop all slaves: "stop slave;" directly to every node (now they are in "Running" state, not in "Russning, Slave") * - via RWSplit "CREATE USER 'test_user'@'%' IDENTIFIED BY 'pass'" * - try to connect using 'test_user' (expecting success) * - start all slaves: "start slave;" directly to every node * - via RWSplit: "DROP USER 'test_user'@'%'" */ /* Timofey Turenko 2014-10-24 09:35:35 UTC 1. setup: Master/Slave replication 2. reboot slaves 3. create user usinf connection to RWSplit 4. try to use this user to connect to Maxscale expected result: Authentication is ok actual result: Access denied for user 'user'@'192.168.122.1' (using password: YES) Th issue was discovered with following setup state: MaxScale> show servers Server 0x3428260 (server1) Server: 192.168.122.106 Status: Master, Running Protocol: MySQLBackend Port: 3306 Server Version: 5.5.40-MariaDB-log Node Id: 106 Master Id: -1 Slave Ids: 107, 108 , 109 Repl Depth: 0 Number of connections: 0 Current no. of conns: 0 Current no. of operations: 0 Server 0x3428160 (server2) Server: 192.168.122.107 Status: Slave, Running Protocol: MySQLBackend Port: 3306 Server Version: 5.5.40-MariaDB-log Node Id: 107 Master Id: 106 Slave Ids: Repl Depth: 1 Number of connections: 0 Current no. of conns: 0 Current no. of operations: 0 Server 0x3428060 (server3) Server: 192.168.122.108 Status: Running Protocol: MySQLBackend Port: 3306 Server Version: 5.5.40-MariaDB-log Node Id: 108 Master Id: 106 Slave Ids: Repl Depth: 1 Number of connections: 0 Current no. of conns: 0 Current no. of operations: 0 Server 0x338c3f0 (server4) Server: 192.168.122.109 Status: Running Protocol: MySQLBackend Port: 3306 Server Version: 5.5.40-MariaDB-log Node Id: 109 Master Id: 106 Slave Ids: Repl Depth: 1 Number of connections: 0 Current no. of conns: 0 Current no. of operations: 0 Maxscale read mysql.user table from server4 which was not properly replicated Comment 1 Mark Riddoch 2014-11-05 09:55:07 UTC In the reload users routine, if there is a master available then use that rather than the first. */ #include #include "testconnections.h" int main(int argc, char *argv[]) { TestConnections * Test = new TestConnections(argc, argv); Test->set_timeout(10); int i; Test->repl->connect(); Test->connect_maxscale(); for (i = 1; i < Test->repl->N; i++) { execute_query(Test->repl->nodes[i], (char *) "stop slave;"); } execute_query(Test->conn_rwsplit, (char *) "CREATE USER 'test_user'@'%%' IDENTIFIED BY 'pass'"); MYSQL * conn = open_conn_no_db(Test->rwsplit_port, Test->maxscale_IP, (char *) "test_user", (char *) "pass", Test->ssl); if (conn == NULL) { Test->add_result(1, "Connections error\n"); } for (i = 1; i < Test->repl->N; i++) { execute_query(Test->repl->nodes[i], (char *) "start slave;"); } execute_query(Test->conn_rwsplit, (char *) "DROP USER 'test_user'@'%%'"); Test->repl->close_connections(); Test->close_maxscale_connections(); int rval = Test->global_result; delete Test; return rval; }