MXS-1775 Use same arrangement in update_server_status

All monitors (but possible for MariaDBMon) now handle the
connecting to the server in the same way, that is, if the
connecting fails, then the status is updated and we return.
This commit is contained in:
Johan Wikman
2018-05-24 10:18:53 +03:00
parent df4e19eb27
commit 5196371762
5 changed files with 64 additions and 63 deletions

View File

@ -56,55 +56,55 @@ void AuroraMonitor::destroy()
*/
void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
SERVER temp_server = {};
temp_server.status = monitored_server->server->status;
server_clear_status_nolock(&temp_server,
SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR);
/** Try to connect to or ping the database */
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (mon_connection_is_ok(rval))
{
server_set_status_nolock(&temp_server, SERVER_RUNNING);
MYSQL_RES *result;
/** Connection is OK, query for replica status */
if (mxs_mysql_query(monitored_server->con, "SELECT @@aurora_server_id, server_id FROM "
"information_schema.replica_host_status "
"WHERE session_id = 'MASTER_SESSION_ID'") == 0 &&
(result = mysql_store_result(monitored_server->con)))
{
ss_dassert(mysql_field_count(monitored_server->con) == 2);
MYSQL_ROW row = mysql_fetch_row(result);
int status = SERVER_SLAVE;
/** The master will return a row with two identical non-NULL fields */
if (row[0] && row[1] && strcmp(row[0], row[1]) == 0)
{
status = SERVER_MASTER;
}
server_set_status_nolock(&temp_server, status);
mysql_free_result(result);
}
else
{
mon_report_query_error(monitored_server);
}
}
else
if (!mon_connection_is_ok(rval))
{
/** Failed to connect to the database */
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
server_set_status_nolock(&temp_server, SERVER_AUTH_ERROR);
server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR);
}
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
SERVER temp_server = {};
temp_server.status = monitored_server->server->status;
server_clear_status_nolock(&temp_server,
SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR);
server_set_status_nolock(&temp_server, SERVER_RUNNING);
MYSQL_RES *result;
/** Connection is OK, query for replica status */
if (mxs_mysql_query(monitored_server->con, "SELECT @@aurora_server_id, server_id FROM "
"information_schema.replica_host_status "
"WHERE session_id = 'MASTER_SESSION_ID'") == 0 &&
(result = mysql_store_result(monitored_server->con)))
{
ss_dassert(mysql_field_count(monitored_server->con) == 2);
MYSQL_ROW row = mysql_fetch_row(result);
int status = SERVER_SLAVE;
/** The master will return a row with two identical non-NULL fields */
if (row[0] && row[1] && strcmp(row[0], row[1]) == 0)
{
status = SERVER_MASTER;
}
server_set_status_nolock(&temp_server, status);
mysql_free_result(result);
}
else
{
mon_report_query_error(monitored_server);
}
server_transfer_status(monitored_server->server, &temp_server);

View File

@ -262,10 +262,6 @@ static bool using_xtrabackup(MXS_MONITORED_SERVER *database, const char* server_
*/
void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
MYSQL_ROW row;
MYSQL_RES *result;
char *server_string;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
@ -290,6 +286,10 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
return;
}
MYSQL_ROW row;
MYSQL_RES *result;
char *server_string;
/* If we get this far then we have a working connection */
server_set_status_nolock(monitored_server->server, SERVER_RUNNING);

View File

@ -148,12 +148,12 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
else
{
/* If we get this far then we have a working connection */
server_set_status_nolock(monitored_server->server, SERVER_RUNNING);
}
/* If we get this far then we have a working connection */
server_set_status_nolock(monitored_server->server, SERVER_RUNNING);
if (is_master(monitored_server))
{

View File

@ -146,13 +146,6 @@ json_t* MMMonitor::diagnostics_json() const
*/
void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
MYSQL_ROW row;
MYSQL_RES *result;
int isslave = 0;
int ismaster = 0;
unsigned long int server_version = 0;
char *server_string;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
@ -179,13 +172,19 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
else
{
server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR);
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR);
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
MYSQL_ROW row;
MYSQL_RES *result;
int isslave = 0;
int ismaster = 0;
unsigned long int server_version = 0;
char *server_string;
/* Store current status in both server and monitor server pending struct */
server_set_status_nolock(monitored_server->server, SERVER_RUNNING);

View File

@ -129,12 +129,8 @@ static json_t* diagnostics_json(const MXS_MONITOR_INSTANCE *mon)
*/
void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
MYSQL_ROW row;
MYSQL_RES *result;
int isjoined = 0;
char *server_string;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
server_clear_status_nolock(monitored_server->server, SERVER_RUNNING);
@ -150,6 +146,7 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
@ -157,6 +154,11 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
/* If we get this far then we have a working connection */
server_set_status_nolock(monitored_server->server, SERVER_RUNNING);
MYSQL_ROW row;
MYSQL_RES *result;
int isjoined = 0;
char *server_string;
/* get server version string */
mxs_mysql_set_server_version(monitored_server->con, monitored_server->server);
server_string = monitored_server->server->version_string;