Files
MaxScale/maxscale-system-test/mxs1743_rconn_bitmask.cpp
Markus Mäkelä d22f6d7b1c MXS-1743: Fix load balancing with router_options=master,slave
The code that selects the candidate backend always returned the root
master if the server bitmask contained the master bit. This should only be
done if the master bit is the only bit in the bitmask and when there are
other bits, the normal candidate selection code should be used.

Also added a query to the expanded test case to make sure the connection
actually works.
2018-06-04 15:17:48 +03:00

77 lines
2.5 KiB
C++

/**
* MXS-1743: Maxscale unable to enforce round-robin between read service for Slave
*
* https://jira.mariadb.org/browse/MXS-1743
*/
#include "testconnections.h"
#include <vector>
int main(int argc, char** argv)
{
TestConnections test(argc, argv);
test.tprintf("Testing with both master and slave up");
test.maxscales->connect();
test.try_query(test.maxscales->conn_master[0], "SELECT 1");
test.maxscales->disconnect();
test.tprintf("Testing with only the master");
test.repl->block_node(0);
sleep(5);
test.maxscales->connect();
test.try_query(test.maxscales->conn_master[0], "SELECT 1");
test.maxscales->disconnect();
test.repl->unblock_node(0);
sleep(5);
test.tprintf("Testing with only the slave");
test.repl->block_node(1);
sleep(5);
test.maxscales->connect();
test.try_query(test.maxscales->conn_master[0], "SELECT 1");
test.maxscales->disconnect();
test.repl->unblock_node(1);
sleep(5);
test.tprintf("Checking that both the master and slave are used");
std::vector<MYSQL*> connections;
test.repl->connect();
execute_query_silent(test.repl->nodes[0], "DROP USER IF EXISTS 'mxs1743'@'%'");
test.try_query(test.repl->nodes[0], "%s", "CREATE USER 'mxs1743'@'%' IDENTIFIED BY 'mxs1743'");
test.try_query(test.repl->nodes[0], "%s", "GRANT ALL ON *.* TO 'mxs1743'@'%'");
test.repl->sync_slaves();
for (int i = 0; i < 20; i++)
{
// Open a connection and make sure it works
MYSQL* conn = open_conn(test.maxscales->readconn_master_port[0], test.maxscales->IP[0],
"mxs1743", "mxs1743", false);
test.try_query(conn, "SELECT 1");
connections.push_back(conn);
}
// Give the connections a few seconds to establish
sleep(5);
std::string query = "SELECT COUNT(*) AS connections FROM information_schema.processlist WHERE user = 'mxs1743'";
char master_connections[1024];
char slave_connections[1024];
find_field(test.repl->nodes[0], query.c_str(), "connections", master_connections);
find_field(test.repl->nodes[1], query.c_str(), "connections", slave_connections);
test.assert(strcmp(master_connections, slave_connections) == 0,
"Master and slave shoud have the same amount of connections: %s != %s",
master_connections, slave_connections);
for (auto a: connections)
{
mysql_close(a);
}
execute_query_silent(test.repl->nodes[0], "DROP USER 'mxs1743'@'%'");
test.repl->disconnect();
return test.global_result;
}