MXS-1679 Add more accurate error printing

The reason for rejoin failing should now be clearer.
This commit is contained in:
Esa Korhonen
2018-03-07 18:20:47 +02:00
parent b8bf0e4ba5
commit b982458497

View File

@ -116,7 +116,7 @@ static bool query_one_row(MXS_MONITORED_SERVER *database, const char* query, uns
StringVector* output); StringVector* output);
static void read_server_variables(MXS_MONITORED_SERVER* database, MySqlServerInfo* serv_info); static void read_server_variables(MXS_MONITORED_SERVER* database, MySqlServerInfo* serv_info);
static bool server_is_rejoin_suspect(MYSQL_MONITOR* mon, MXS_MONITORED_SERVER* server, static bool server_is_rejoin_suspect(MYSQL_MONITOR* mon, MXS_MONITORED_SERVER* server,
MySqlServerInfo* master_info); MySqlServerInfo* master_info, json_t** output);
static bool get_joinable_servers(MYSQL_MONITOR* mon, ServerVector* output); static bool get_joinable_servers(MYSQL_MONITOR* mon, ServerVector* output);
static uint32_t do_rejoin(MYSQL_MONITOR* mon, const ServerVector& servers); static uint32_t do_rejoin(MYSQL_MONITOR* mon, const ServerVector& servers);
static bool join_cluster(MXS_MONITORED_SERVER* server, const char* change_cmd); static bool join_cluster(MXS_MONITORED_SERVER* server, const char* change_cmd);
@ -720,39 +720,50 @@ bool mysql_rejoin(MXS_MONITOR* mon, SERVER* rejoin_server, json_t** output)
MYSQL_MONITOR *handle = static_cast<MYSQL_MONITOR*>(mon->handle); MYSQL_MONITOR *handle = static_cast<MYSQL_MONITOR*>(mon->handle);
if (cluster_can_be_joined(handle)) if (cluster_can_be_joined(handle))
{ {
const char* rejoin_serv_name = rejoin_server->unique_name;
MXS_MONITORED_SERVER* mon_server = mon_get_monitored_server(mon, rejoin_server); MXS_MONITORED_SERVER* mon_server = mon_get_monitored_server(mon, rejoin_server);
if (mon_server) if (mon_server)
{ {
MXS_MONITORED_SERVER* master = handle->master; MXS_MONITORED_SERVER* master = handle->master;
const char* master_name = master->server->unique_name;
MySqlServerInfo* master_info = get_server_info(handle, master); MySqlServerInfo* master_info = get_server_info(handle, master);
MySqlServerInfo* server_info = get_server_info(handle, mon_server); MySqlServerInfo* server_info = get_server_info(handle, mon_server);
if (server_is_rejoin_suspect(handle, mon_server, master_info) && if (server_is_rejoin_suspect(handle, mon_server, master_info, output))
update_gtids(handle, master, master_info) &&
can_replicate_from(handle, mon_server, server_info, master, master_info))
{ {
ServerVector joinable_server; if (update_gtids(handle, master, master_info))
joinable_server.push_back(mon_server);
if (do_rejoin(handle, joinable_server) == 1)
{ {
rval = true; if (can_replicate_from(handle, mon_server, server_info, master, master_info))
MXS_NOTICE("Rejoin performed."); {
ServerVector joinable_server;
joinable_server.push_back(mon_server);
if (do_rejoin(handle, joinable_server) == 1)
{
rval = true;
MXS_NOTICE("Rejoin performed.");
}
else
{
PRINT_MXS_JSON_ERROR(output, "Rejoin attempted but failed.");
}
}
else
{
PRINT_MXS_JSON_ERROR(output, "Server '%s' cannot replicate from cluster master '%s' "
"or it could not be queried.", rejoin_serv_name, master_name);
}
} }
else else
{ {
PRINT_MXS_JSON_ERROR(output, "Rejoin attempted but failed."); PRINT_MXS_JSON_ERROR(output, "Cluster master '%s' gtid info could not be updated.",
master_name);
} }
} }
else
{
PRINT_MXS_JSON_ERROR(output, "Server is not eligible for rejoin or eligibility could not be "
"ascertained.");
}
} }
else else
{ {
PRINT_MXS_JSON_ERROR(output, "The given server '%s' is not monitored by this monitor.", PRINT_MXS_JSON_ERROR(output, "The given server '%s' is not monitored by this monitor.",
rejoin_server->unique_name); rejoin_serv_name);
} }
} }
else else
@ -4603,17 +4614,18 @@ static bool can_replicate_from(MYSQL_MONITOR* mon,
* criteria and another call to can_replicate_from() should be made. * criteria and another call to can_replicate_from() should be made.
* *
* @param mon Cluster monitor * @param mon Cluster monitor
* @param server Server to check. * @param rejoin_server Server to check
* @param master_info Master server info * @param master_info Master server info
* @param output Error output. If NULL, no error is printed to log.
* @return True, if server is a rejoin suspect. * @return True, if server is a rejoin suspect.
*/ */
static bool server_is_rejoin_suspect(MYSQL_MONITOR* mon, MXS_MONITORED_SERVER* server, static bool server_is_rejoin_suspect(MYSQL_MONITOR* mon, MXS_MONITORED_SERVER* rejoin_server,
MySqlServerInfo* master_info) MySqlServerInfo* master_info, json_t** output)
{ {
bool is_suspect = false; bool is_suspect = false;
if (!SERVER_IS_MASTER(server->server) && SERVER_IS_RUNNING(server->server)) if (!SERVER_IS_MASTER(rejoin_server->server) && SERVER_IS_RUNNING(rejoin_server->server))
{ {
MySqlServerInfo* server_info = get_server_info(mon, server); MySqlServerInfo* server_info = get_server_info(mon, rejoin_server);
SlaveStatusInfo* slave_status = &server_info->slave_status; SlaveStatusInfo* slave_status = &server_info->slave_status;
// Has no slave connection, yet is not a master. // Has no slave connection, yet is not a master.
if (server_info->n_slaves_configured == 0) if (server_info->n_slaves_configured == 0)
@ -4639,6 +4651,11 @@ static bool server_is_rejoin_suspect(MYSQL_MONITOR* mon, MXS_MONITORED_SERVER* s
} }
} }
} }
else if (output != NULL)
{
PRINT_MXS_JSON_ERROR(output, "Server '%s' is master or not running.",
rejoin_server->server->unique_name);
}
return is_suspect; return is_suspect;
} }
@ -4664,7 +4681,7 @@ static bool get_joinable_servers(MYSQL_MONITOR* mon, ServerVector* output)
server != NULL; server != NULL;
server = server->next) server = server->next)
{ {
if (server_is_rejoin_suspect(mon, server, master_info)) if (server_is_rejoin_suspect(mon, server, master_info, NULL))
{ {
suspects.push_back(server); suspects.push_back(server);
} }