MXS-2481 Test transaction replay at group change

Take down a node other than the one we are connected to, which
will cause a group change error, and test that MaxScale catches
that and replay the transaction.
This commit is contained in:
Johan Wikman
2019-05-27 11:15:04 +03:00
parent e0b397455d
commit 71b648e965

View File

@ -48,7 +48,7 @@ void collect_information(TestConnections& test)
static_by_address.insert(make_pair(server.address, server)); static_by_address.insert(make_pair(server.address, server));
} }
if (!node_by_address.count(server.address) == 0) if (node_by_address.count(server.address) == 0)
{ {
Clustrix_nodes* pClustrix = test.clustrix; Clustrix_nodes* pClustrix = test.clustrix;
@ -56,6 +56,7 @@ void collect_information(TestConnections& test)
{ {
if (pClustrix->IP_private[i] == server.address) if (pClustrix->IP_private[i] == server.address)
{ {
cout << server.address << " IS NODE " << i << endl;
node_by_address[server.address] = i; node_by_address[server.address] = i;
break; break;
} }
@ -171,6 +172,26 @@ MaxRest::Server get_current_server(TestConnections& test, MYSQL* pMysql)
return dynamic_by_address[address]; return dynamic_by_address[address];
} }
void test_transaction_replay(TestConnections& test, MYSQL* pMysql, const std::string& name, int node)
{
test.try_query(pMysql, "BEGIN");
test.try_query(pMysql, "SELECT * FROM test.clustrix_tr");
cout << "Stopping server " << name << " on node " << node << "." << endl;
if (stop_server(test, name, node))
{
// The server we were connected to is now down. If the following
// succeeds, then reconnect + transaction replay worked as specified.
test.try_query(pMysql, "SELECT * FROM test.clustrix_tr");
test.try_query(pMysql, "COMMIT");
cout << "Starting Clustrix " << name << " on node " << node << "." << endl;
int timeout = 3 * 60;
start_server(test, name, node, timeout);
}
}
void run_test(TestConnections& test) void run_test(TestConnections& test)
{ {
MaxRest maxrest(&test); MaxRest maxrest(&test);
@ -191,26 +212,38 @@ void run_test(TestConnections& test)
<< " running on node " << node << "." << " running on node " << node << "."
<< endl; << endl;
test.try_query(pMysql, "BEGIN"); // FIRST TEST: Take down the very node we are connected to.
test.try_query(pMysql, "SELECT * FROM test.clustrix_tr"); //
// This requires MaxScale to open a new connection to another node,
// seed the session and replay the transaction.
test_transaction_replay(test, pMysql, dynamic_name, node);
cout << "Stopping server " << dynamic_name << " on node " << node << "." << endl; MaxRest::Server server2 = get_current_server(test, pMysql);
if (stop_server(test, dynamic_name, node))
test.expect(server.address != server2.address, "Huh, server did not switch.");
server = server2;
for (const auto& kv : dynamic_by_address)
{ {
// The server we were connected to is now down. If the following if (kv.first != server.address)
// succeeds, then reconnect + transaction replay worked as specified. {
test.try_query(pMysql, "SELECT * FROM test.clustrix_tr"); server2 = kv.second;
test.try_query(pMysql, "COMMIT"); break;
}
cout << "Starting Clustrix " << dynamic_name << " on node " << node << "." << endl;
int timeout = 3 * 60;
start_server(test, dynamic_name, node, timeout);
} }
MaxRest::Server server_after = get_current_server(test, pMysql); node = node_by_address[server2.address];
test.expect(server.address != server_after.address, "Huh, server did not switch."); // SECOND TEST: Take down another node but than the one we are connected to.
// That will cause a Clustrix Group Change event.
//
// This requires MaxScale to detect the error and replay the transaction.
test_transaction_replay(test, pMysql, server2.name, node);
server2 = get_current_server(test, pMysql);
test.expect(server.address == server2.address, "Huh, server has switched.");
} }
} }