MXS-1845 Only select a master if current master is no longer usable

The purpose is to make the selected master server sticky. The master is reselected only
if the current master is no longer a valid master.
This commit is contained in:
Esa Korhonen
2018-06-12 10:27:23 +03:00
parent 95935991ab
commit 2f987d0b10
6 changed files with 174 additions and 36 deletions

View File

@ -77,7 +77,7 @@ void MariaDBMonitor::reset_server_info()
// Next, initialize the data.
for (auto mon_server = m_monitor->monitored_servers; mon_server; mon_server = mon_server->next)
{
m_servers.push_back(new MariaDBServer(mon_server));
m_servers.push_back(new MariaDBServer(mon_server, m_servers.size()));
}
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++)
{
@ -392,20 +392,36 @@ void MariaDBMonitor::tick()
build_replication_graph();
find_graph_cycles();
// Use the information to find the so far best master server.
MariaDBServer* root_master = find_topology_master_server();
if (root_master)
string reason;
MariaDBServer* root_master = m_master; // TODO: Refactor this out by reducing use of root_master
if (master_no_longer_valid(&reason))
{
MXS_DEBUG("Server '%s' is the best master candidate with %d slaves.",
root_master->name(), root_master->m_node.reach);
m_master = root_master;
if (m_master && !reason.empty())
{
MXS_WARNING("The previous master server '%s' is no longer a valid master because %s",
m_master->name(), reason.c_str());
}
// The current master is no longer ok (or it never was). Find another. Master changes are logged
// by the log_master_changes()-method.
root_master = find_topology_master_server();
if (root_master)
{
m_master = root_master;
// A new master has been set. Save some data regarding the type of the master.
int new_cycle_id = m_master->m_node.cycle;
m_master_cycle_status.cycle_id = new_cycle_id;
if (new_cycle_id == NodeData::CYCLE_NONE)
{
m_master_cycle_status.cycle_members.clear();
}
else
{
m_master_cycle_status.cycle_members = m_cycles[new_cycle_id];
}
}
}
#ifdef SS_DEBUG
else
{
MXS_DEBUG("No valid master server found in the cluster.");
}
#endif
assign_master_and_slave();
if (!m_ignore_external_masters)
@ -1049,7 +1065,7 @@ string monitored_servers_to_string(const ServerArray& servers)
{
rval += separator;
rval += servers[i]->name();
separator = ",";
separator = ", ";
}
}
return rval;