MXS-2168 Update test_cycle_find

The test now uses both server id:s and hostname:port combinations.
This commit is contained in:
Esa Korhonen 2018-11-16 10:21:16 +02:00
parent c61aaee0ba
commit 5d4775cac1

View File

@ -16,7 +16,6 @@
#include <iostream>
#include <numeric>
#include <string>
#include <sstream>
#include <vector>
#include <maxbase/log.hh>
#include <maxbase/maxbase.hh>
@ -33,7 +32,7 @@ const int MAX_EDGES = 20;
class MariaDBMonitor::Test
{
// These defines are required since Centos 6 doesn't support vector literal initialisers :/
// TODO: Now using C++11 even on Centos 6 so get rid of these
typedef struct
{
int members[MAX_CYCLE_SIZE];
@ -56,17 +55,22 @@ class MariaDBMonitor::Test
} EdgeArray;
public:
Test();
Test(bool use_hostnames);
~Test();
int run_tests();
private:
MariaDBMonitor* m_monitor;
int m_current_test;
MariaDBMonitor* m_monitor = NULL;
int m_current_test = 0;
bool m_use_hostnames = true;
void init_servers(int count);
void clear_servers();
void add_replication(EdgeArray edges);
int check_result_cycles(CycleArray expected_cycles);
string create_servername(int i);
string create_hostname(int i);
MariaDBServer* get_server(int i);
};
int main()
@ -74,13 +78,19 @@ int main()
maxbase::init();
maxbase::Log log;
MariaDBMonitor::Test tester;
return tester.run_tests();
bool use_hostnames = true;
MariaDBMonitor::Test tester1(use_hostnames);
int rval = tester1.run_tests();
use_hostnames = false;
MariaDBMonitor::Test tester2(use_hostnames);
rval += tester2.run_tests();
return rval;
}
MariaDBMonitor::Test::Test()
MariaDBMonitor::Test::Test(bool use_hostnames)
: m_monitor(new MariaDBMonitor(NULL))
, m_current_test(0)
, m_use_hostnames(use_hostnames)
{
}
@ -140,20 +150,36 @@ int MariaDBMonitor::Test::run_tests()
void MariaDBMonitor::Test::init_servers(int count)
{
clear_servers();
m_monitor->m_assume_unique_hostnames = m_use_hostnames;
mxb_assert(m_monitor->m_servers.empty() && m_monitor->m_servers_by_id.empty());
for (int i = 1; i < count + 1; i++)
{
SERVER* base_server = new SERVER; // Contents mostly undefined
std::stringstream server_name;
server_name << "Server" << i;
base_server->name = MXS_STRDUP(server_name.str().c_str());
string server_name = create_servername(i);
base_server->name = MXS_STRDUP(server_name.c_str());
MXS_MONITORED_SERVER* mon_server = new MXS_MONITORED_SERVER; // Contents mostly undefined
mon_server->server = base_server;
MariaDBServer* new_server = new MariaDBServer(mon_server, i - 1);
new_server->m_server_id = i;
m_monitor->m_servers.push_back(new_server);
m_monitor->m_servers_by_id[i] = new_server;
MariaDBServer* mariadb_server = new MariaDBServer(mon_server, i - 1, m_use_hostnames);
if (m_use_hostnames)
{
string hostname = create_hostname(i);
strcpy(base_server->address, hostname.c_str());
base_server->port = i;
}
else
{
mariadb_server->m_server_id = i;
}
m_monitor->m_servers.push_back(mariadb_server);
if (!m_use_hostnames)
{
m_monitor->m_servers_by_id[i] = mariadb_server;
}
}
m_current_test++;
}
@ -189,12 +215,23 @@ void MariaDBMonitor::Test::add_replication(EdgeArray edges)
{
break;
}
auto iter2 = m_monitor->m_servers_by_id.find(slave_id);
mxb_assert(iter2 != m_monitor->m_servers_by_id.end());
SlaveStatus ss;
ss.master_server_id = master_id;
ss.slave_io_running = SlaveStatus::SLAVE_IO_YES;
(*iter2).second->m_slave_status.push_back(ss);
ss.slave_sql_running = true;
if (m_use_hostnames)
{
ss.master_host = create_hostname(master_id);
ss.master_port = master_id;
}
else
{
ss.master_server_id = master_id;
ss.seen_connected = true;
}
MariaDBServer* slave = get_server(slave_id);
slave->m_slave_status.push_back(ss);
}
m_monitor->build_replication_graph();
@ -209,12 +246,12 @@ void MariaDBMonitor::Test::add_replication(EdgeArray edges)
*/
int MariaDBMonitor::Test::check_result_cycles(CycleArray expected_cycles)
{
std::stringstream test_name_ss;
test_name_ss << "Test " << m_current_test << ": ";
string test_name = test_name_ss.str();
string test_name = "Test " + std::to_string(m_current_test) + " ("
+ (m_use_hostnames ? "hostnames" : "server id:s") + "): ";
int errors = 0;
// Copy the index->server map so it can be checked later
IdToServerMap no_cycle_servers = m_monitor->m_servers_by_id;
// Copy the servers for later comparison.
std::set<MariaDBServer*> no_cycle_servers(m_monitor->m_servers.begin(), m_monitor->m_servers.end());
std::set<int> used_cycle_ids;
for (auto ind_cycles = 0; ind_cycles < MAX_CYCLES; ind_cycles++)
{
@ -227,7 +264,8 @@ int MariaDBMonitor::Test::check_result_cycles(CycleArray expected_cycles)
{
break;
}
auto cycle_server = m_monitor->get_server(search_id);
MariaDBServer* cycle_server = get_server(search_id);
if (cycle_server->m_node.cycle == NodeData::CYCLE_NONE)
{
cout << test_name << cycle_server->name() << " is not in a cycle when it should.\n";
@ -254,14 +292,13 @@ int MariaDBMonitor::Test::check_result_cycles(CycleArray expected_cycles)
<< " when " << cycle_id << " was expected.\n";
errors++;
}
no_cycle_servers.erase(cycle_server->m_server_id);
no_cycle_servers.erase(cycle_server);
}
}
// Check that servers not in expected_cycles are not in a cycle
for (auto& map_elem : no_cycle_servers)
for (MariaDBServer* server : no_cycle_servers)
{
MariaDBServer* server = map_elem.second;
if (server->m_node.cycle != NodeData::CYCLE_NONE)
{
cout << server->name() << " is in cycle " << server->m_node.cycle << " when none was expected.\n";
@ -271,3 +308,21 @@ int MariaDBMonitor::Test::check_result_cycles(CycleArray expected_cycles)
return errors;
}
MariaDBServer* MariaDBMonitor::Test::get_server(int i)
{
auto rval = m_use_hostnames ? m_monitor->get_server(create_hostname(i), i) :
m_monitor->get_server(i);
mxb_assert(rval);
return rval;
}
string MariaDBMonitor::Test::create_servername(int i)
{
return "Server" + std::to_string(i);
}
string MariaDBMonitor::Test::create_hostname(int i)
{
return "hostname" + std::to_string(i) + ".mariadb.com";
}