MXS-1703 Use monitor-specific array instead of linked list
Also starting cleanup of server specific monitor code.
This commit is contained in:
@ -351,10 +351,11 @@ void MariaDBMonitor::find_graph_cycles()
|
|||||||
struct graph_node *stack[nservers];
|
struct graph_node *stack[nservers];
|
||||||
int nodes = 0;
|
int nodes = 0;
|
||||||
|
|
||||||
for (MXS_MONITORED_SERVER *db = m_monitor_base->monitored_servers; db; db = db->next)
|
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++)
|
||||||
{
|
{
|
||||||
graph[nodes].info = get_server_info(db);
|
MariaDBServer* server = *iter;
|
||||||
graph[nodes].db = db;
|
graph[nodes].info = server;
|
||||||
|
graph[nodes].db = server->m_server_base;
|
||||||
graph[nodes].index = graph[nodes].lowest_index = 0;
|
graph[nodes].index = graph[nodes].lowest_index = 0;
|
||||||
graph[nodes].cycle = 0;
|
graph[nodes].cycle = 0;
|
||||||
graph[nodes].active = false;
|
graph[nodes].active = false;
|
||||||
@ -563,7 +564,7 @@ void MariaDBMonitor::monitor_mysql_db(MariaDBServer* serv_info)
|
|||||||
monitor_set_pending_status(database, SERVER_SLAVE);
|
monitor_set_pending_status(database, SERVER_SLAVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Store master_id of current node. For MySQL 5.1 it will be set at a later point. */
|
/** Store master_id of current node. */
|
||||||
database->server->master_id = !serv_info->m_slave_status.empty() ?
|
database->server->master_id = !serv_info->m_slave_status.empty() ?
|
||||||
serv_info->m_slave_status[0].master_server_id : SERVER_ID_UNKNOWN;
|
serv_info->m_slave_status[0].master_server_id : SERVER_ID_UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -876,7 +877,7 @@ void MariaDBMonitor::monitor_one_server(MariaDBServer& server)
|
|||||||
ptr->pending_status = ptr->server->status;
|
ptr->pending_status = ptr->server->status;
|
||||||
|
|
||||||
/* monitor current node */
|
/* monitor current node */
|
||||||
monitor_database(get_server_info(ptr));
|
monitor_database(&server);
|
||||||
|
|
||||||
if (mon_status_changed(ptr))
|
if (mon_status_changed(ptr))
|
||||||
{
|
{
|
||||||
@ -986,12 +987,9 @@ void MariaDBMonitor::assign_relay_master(MariaDBServer& candidate)
|
|||||||
*/
|
*/
|
||||||
void MariaDBMonitor::update_server_states(MariaDBServer& db_server, MariaDBServer* root_master_server)
|
void MariaDBMonitor::update_server_states(MariaDBServer& db_server, MariaDBServer* root_master_server)
|
||||||
{
|
{
|
||||||
MXS_MONITORED_SERVER* ptr = db_server.m_server_base;
|
|
||||||
MXS_MONITORED_SERVER* root_master = root_master_server ? root_master_server->m_server_base : NULL;
|
MXS_MONITORED_SERVER* root_master = root_master_server ? root_master_server->m_server_base : NULL;
|
||||||
if (!SERVER_IN_MAINT(ptr->server))
|
if (!SERVER_IN_MAINT(db_server.m_server_base->server))
|
||||||
{
|
{
|
||||||
MariaDBServer *serv_info = get_server_info(ptr);
|
|
||||||
|
|
||||||
/** If "detect_stale_master" option is On, let's use the previous master.
|
/** If "detect_stale_master" option is On, let's use the previous master.
|
||||||
*
|
*
|
||||||
* Multi-master mode detects the stale masters in find_graph_cycles().
|
* Multi-master mode detects the stale masters in find_graph_cycles().
|
||||||
@ -1000,12 +998,14 @@ void MariaDBMonitor::update_server_states(MariaDBServer& db_server, MariaDBServe
|
|||||||
* the master status. An adequate solution would be to promote
|
* the master status. An adequate solution would be to promote
|
||||||
* the stale master as a real master if it is the last running server.
|
* the stale master as a real master if it is the last running server.
|
||||||
*/
|
*/
|
||||||
|
MXS_MONITORED_SERVER* ptr = db_server.m_server_base;
|
||||||
if (m_detect_stale_master && root_master && !m_detect_multimaster &&
|
if (m_detect_stale_master && root_master && !m_detect_multimaster &&
|
||||||
|
// This server is still the root master and ...
|
||||||
(strcmp(ptr->server->address, root_master->server->address) == 0 &&
|
(strcmp(ptr->server->address, root_master->server->address) == 0 &&
|
||||||
ptr->server->port == root_master->server->port) &&
|
ptr->server->port == root_master->server->port) &&
|
||||||
(ptr->server->status & SERVER_MASTER) &&
|
// had master status but is now losing it.
|
||||||
!(ptr->pending_status & SERVER_MASTER) &&
|
(ptr->server->status & SERVER_MASTER) && !(ptr->pending_status & SERVER_MASTER) &&
|
||||||
!serv_info->m_read_only)
|
!db_server.m_read_only)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* In this case server->status will not be updated from pending_status
|
* In this case server->status will not be updated from pending_status
|
||||||
@ -1018,9 +1018,8 @@ void MariaDBMonitor::update_server_states(MariaDBServer& db_server, MariaDBServe
|
|||||||
* the stale master bit set */
|
* the stale master bit set */
|
||||||
if ((ptr->mon_prev_status & SERVER_STALE_STATUS) == 0)
|
if ((ptr->mon_prev_status & SERVER_STALE_STATUS) == 0)
|
||||||
{
|
{
|
||||||
MXS_WARNING("All slave servers under the current master "
|
MXS_WARNING("All slave servers under the current master server have been lost. "
|
||||||
"server have been lost. Assigning Stale Master"
|
"Assigning Stale Master status to the old master server '%s' (%s:%i).",
|
||||||
" status to the old master server '%s' (%s:%i).",
|
|
||||||
ptr->server->name, ptr->server->address,
|
ptr->server->name, ptr->server->address,
|
||||||
ptr->server->port);
|
ptr->server->port);
|
||||||
}
|
}
|
||||||
@ -1057,7 +1056,7 @@ void MariaDBMonitor::update_server_states(MariaDBServer& db_server, MariaDBServe
|
|||||||
{
|
{
|
||||||
monitor_set_pending_status(ptr, SERVER_SLAVE);
|
monitor_set_pending_status(ptr, SERVER_SLAVE);
|
||||||
}
|
}
|
||||||
else if (root_master == NULL && !serv_info->m_slave_status.empty())
|
else if (root_master == NULL && !db_server.m_slave_status.empty())
|
||||||
{
|
{
|
||||||
monitor_set_pending_status(ptr, SERVER_SLAVE);
|
monitor_set_pending_status(ptr, SERVER_SLAVE);
|
||||||
}
|
}
|
||||||
|
@ -1406,19 +1406,15 @@ bool MariaDBMonitor::handle_auto_failover()
|
|||||||
bool MariaDBMonitor::failover_not_possible()
|
bool MariaDBMonitor::failover_not_possible()
|
||||||
{
|
{
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
|
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++)
|
||||||
for (MXS_MONITORED_SERVER* s = m_monitor_base->monitored_servers; s; s = s->next)
|
|
||||||
{
|
{
|
||||||
MariaDBServer* info = get_server_info(s);
|
if ((*iter)->m_slave_status.size() > 1)
|
||||||
|
|
||||||
if (info->m_slave_status.size() > 1)
|
|
||||||
{
|
{
|
||||||
MXS_ERROR("Server '%s' is configured to replicate from multiple "
|
MXS_ERROR("Server '%s' is configured to replicate from multiple masters, "
|
||||||
"masters, failover is not possible.", s->server->name);
|
"failover is not possible.", (*iter)->name());
|
||||||
rval = true;
|
rval = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1432,14 +1428,14 @@ bool MariaDBMonitor::slave_receiving_events()
|
|||||||
ss_dassert(m_master);
|
ss_dassert(m_master);
|
||||||
bool received_event = false;
|
bool received_event = false;
|
||||||
int64_t master_id = m_master->m_server_base->server->node_id;
|
int64_t master_id = m_master->m_server_base->server->node_id;
|
||||||
for (MXS_MONITORED_SERVER* server = m_monitor_base->monitored_servers; server; server = server->next)
|
|
||||||
{
|
|
||||||
MariaDBServer* info = get_server_info(server);
|
|
||||||
|
|
||||||
if (!info->m_slave_status.empty() &&
|
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++)
|
||||||
info->m_slave_status[0].slave_io_running == SlaveStatus::SLAVE_IO_YES &&
|
{
|
||||||
info->m_slave_status[0].master_server_id == master_id &&
|
MariaDBServer* server = *iter;
|
||||||
difftime(time(NULL), info->m_latest_event) < m_master_failure_timeout)
|
if (!server->m_slave_status.empty() &&
|
||||||
|
server->m_slave_status[0].slave_io_running == SlaveStatus::SLAVE_IO_YES &&
|
||||||
|
server->m_slave_status[0].master_server_id == master_id &&
|
||||||
|
difftime(time(NULL), server->m_latest_event) < m_master_failure_timeout)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The slave is still connected to the correct master and has received events. This means that
|
* The slave is still connected to the correct master and has received events. This means that
|
||||||
|
@ -91,26 +91,18 @@ void MariaDBMonitor::init_server_info()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get monitor-specific server info for the monitored server.
|
* Get monitor-specific server info for the monitored server.
|
||||||
*
|
*
|
||||||
* @param handle
|
* @param handle
|
||||||
* @param db Server to get info for. Must be a valid server or function crashes.
|
* @param db Server to get info for. Must be a valid server or function crashes.
|
||||||
* @return The server info.
|
* @return The server info.
|
||||||
*/
|
*/
|
||||||
MariaDBServer* MariaDBMonitor::get_server_info(MXS_MONITORED_SERVER* db)
|
MariaDBServer* MariaDBMonitor::get_server_info(MXS_MONITORED_SERVER* db)
|
||||||
{
|
{
|
||||||
ss_dassert(m_server_info.count(db) == 1); // Should always exist in the map
|
ss_dassert(m_server_info.count(db) == 1); // Should always exist in the map
|
||||||
return m_server_info[db];
|
return m_server_info[db];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constant version of get_server_info().
|
|
||||||
*/
|
|
||||||
const MariaDBServer* MariaDBMonitor::get_server_info(const MXS_MONITORED_SERVER* db) const
|
|
||||||
{
|
|
||||||
return const_cast<MariaDBMonitor*>(this)->get_server_info(const_cast<MXS_MONITORED_SERVER*>(db));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MariaDBMonitor::set_replication_credentials(const MXS_CONFIG_PARAMETER* params)
|
bool MariaDBMonitor::set_replication_credentials(const MXS_CONFIG_PARAMETER* params)
|
||||||
{
|
{
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
|
@ -163,7 +163,6 @@ private:
|
|||||||
bool load_config_params(const MXS_CONFIG_PARAMETER* params);
|
bool load_config_params(const MXS_CONFIG_PARAMETER* params);
|
||||||
bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params);
|
bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params);
|
||||||
MariaDBServer* get_server_info(MXS_MONITORED_SERVER* db);
|
MariaDBServer* get_server_info(MXS_MONITORED_SERVER* db);
|
||||||
const MariaDBServer* get_server_info(const MXS_MONITORED_SERVER* db) const;
|
|
||||||
|
|
||||||
// Cluster discovery and status assignment methods
|
// Cluster discovery and status assignment methods
|
||||||
void monitor_one_server(MariaDBServer& server);
|
void monitor_one_server(MariaDBServer& server);
|
||||||
|
Reference in New Issue
Block a user