Removed redundancy from error and message logs.
server.c: Added new member to SERVER->master_err_is_logged. It is used if server loses master status. It causes error log print in readwritesplit router's eror handling. Initial value is false and it is set always to false when server's status is set to master. Added message log printing to mysql monitor, if master status changes to something else. It is not warning or error but only information which probably interests the user. readwritesplit.c:Muted warnings and error printings in cases if slaves are not found if it is allowed to have a master only. readwritesplit.c:Corrected error log printing in case where master lost its status. REdundant prints are removed.
This commit is contained in:
@ -68,25 +68,16 @@ server_alloc(char *servname, char *protocol, unsigned short port)
|
|||||||
{
|
{
|
||||||
SERVER *server;
|
SERVER *server;
|
||||||
|
|
||||||
if ((server = (SERVER *)malloc(sizeof(SERVER))) == NULL)
|
if ((server = (SERVER *)calloc(1, sizeof(SERVER))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
server->name = strdup(servname);
|
server->name = strdup(servname);
|
||||||
server->protocol = strdup(protocol);
|
server->protocol = strdup(protocol);
|
||||||
server->port = port;
|
server->port = port;
|
||||||
memset(&server->stats, 0, sizeof(SERVER_STATS));
|
|
||||||
server->status = SERVER_RUNNING;
|
server->status = SERVER_RUNNING;
|
||||||
server->nextdb = NULL;
|
|
||||||
server->monuser = NULL;
|
|
||||||
server->monpw = NULL;
|
|
||||||
server->unique_name = NULL;
|
|
||||||
server->server_string = NULL;
|
|
||||||
server->node_id = -1;
|
server->node_id = -1;
|
||||||
server->rlag = -2;
|
server->rlag = -2;
|
||||||
server->node_ts = 0;
|
|
||||||
server->parameters = NULL;
|
|
||||||
server->master_id = -1;
|
server->master_id = -1;
|
||||||
server->depth = -1;
|
server->depth = -1;
|
||||||
server->slaves = NULL;
|
|
||||||
|
|
||||||
spinlock_acquire(&server_spin);
|
spinlock_acquire(&server_spin);
|
||||||
server->next = allServers;
|
server->next = allServers;
|
||||||
@ -451,6 +442,12 @@ void
|
|||||||
server_set_status(SERVER *server, int bit)
|
server_set_status(SERVER *server, int bit)
|
||||||
{
|
{
|
||||||
server->status |= bit;
|
server->status |= bit;
|
||||||
|
|
||||||
|
/** clear error logged flag before the next failure */
|
||||||
|
if (SERVER_IS_MASTER(server))
|
||||||
|
{
|
||||||
|
server->master_err_is_logged = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -356,7 +356,7 @@ int listeners = 0;
|
|||||||
"%s: Failed to create router instance for service. Service not started.",
|
"%s: Failed to create router instance for service. Service not started.",
|
||||||
service->name)));
|
service->name)));
|
||||||
service->state = SERVICE_STATE_FAILED;
|
service->state = SERVICE_STATE_FAILED;
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
port = service->ports;
|
port = service->ports;
|
||||||
|
@ -91,6 +91,7 @@ typedef struct server {
|
|||||||
long master_id; /**< Master server id of this node */
|
long master_id; /**< Master server id of this node */
|
||||||
int depth; /**< Replication level in the tree */
|
int depth; /**< Replication level in the tree */
|
||||||
long *slaves; /**< Slaves of this node */
|
long *slaves; /**< Slaves of this node */
|
||||||
|
bool master_err_is_logged; /*< If node failed, this indicates whether it is logged */
|
||||||
} SERVER;
|
} SERVER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -123,8 +124,11 @@ typedef struct server {
|
|||||||
* Is the server a master? The server must be both running and marked as master
|
* Is the server a master? The server must be both running and marked as master
|
||||||
* in order for the macro to return true
|
* in order for the macro to return true
|
||||||
*/
|
*/
|
||||||
#define SERVER_IS_MASTER(server) \
|
#define SERVER_IS_MASTER(server) SRV_MASTER_STATUS((server)->status)
|
||||||
(((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == (SERVER_RUNNING|SERVER_MASTER))
|
|
||||||
|
#define SRV_MASTER_STATUS(status) ((status & \
|
||||||
|
(SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == \
|
||||||
|
(SERVER_RUNNING|SERVER_MASTER))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the server valid candidate for root master. The server must be running,
|
* Is the server valid candidate for root master. The server must be running,
|
||||||
|
@ -671,6 +671,16 @@ int log_no_master = 1;
|
|||||||
|
|
||||||
if (mon_status_changed(ptr))
|
if (mon_status_changed(ptr))
|
||||||
{
|
{
|
||||||
|
if (SRV_MASTER_STATUS(ptr->mon_prev_status))
|
||||||
|
{
|
||||||
|
/** Master failed, can't recover */
|
||||||
|
LOGIF(LM, (skygw_log_write(
|
||||||
|
LOGFILE_MESSAGE,
|
||||||
|
"Server %s:%d lost the master status.",
|
||||||
|
ptr->server->name,
|
||||||
|
ptr->server->port)));
|
||||||
|
}
|
||||||
|
|
||||||
dcb_call_foreach(DCB_REASON_NOT_RESPONDING);
|
dcb_call_foreach(DCB_REASON_NOT_RESPONDING);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -734,7 +744,13 @@ int log_no_master = 1;
|
|||||||
{
|
{
|
||||||
if (! SERVER_IN_MAINT(ptr->server)) {
|
if (! SERVER_IN_MAINT(ptr->server)) {
|
||||||
/* If "detect_stale_master" option is On, let's use the previus master */
|
/* If "detect_stale_master" option is On, let's use the previus master */
|
||||||
if (detect_stale_master && root_master && (!strcmp(ptr->server->name, root_master->server->name) && ptr->server->port == root_master->server->port) && (ptr->server->status & SERVER_MASTER) && !(ptr->pending_status & SERVER_MASTER)) {
|
if (detect_stale_master &&
|
||||||
|
root_master &&
|
||||||
|
(!strcmp(ptr->server->name, root_master->server->name) &&
|
||||||
|
ptr->server->port == root_master->server->port) &&
|
||||||
|
(ptr->server->status & SERVER_MASTER) &&
|
||||||
|
!(ptr->pending_status & SERVER_MASTER))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* In this case server->status will not be updated from pending_statu
|
* In this case server->status will not be updated from pending_statu
|
||||||
* Set the STALE bit for this server in server struct
|
* Set the STALE bit for this server in server struct
|
||||||
@ -744,8 +760,11 @@ int log_no_master = 1;
|
|||||||
/* log it once */
|
/* log it once */
|
||||||
if (mon_status_changed(ptr)) {
|
if (mon_status_changed(ptr)) {
|
||||||
LOGIF(LM, (skygw_log_write_flush(
|
LOGIF(LM, (skygw_log_write_flush(
|
||||||
LOGFILE_MESSAGE, "[mysql_mon]: root server [%s:%i] is no longer Master,"
|
LOGFILE_MESSAGE,
|
||||||
" let's use it again even if it could be a stale master,"
|
"[mysql_mon]: root server "
|
||||||
|
"[%s:%i] is no longer Master,"
|
||||||
|
" let's use it again even "
|
||||||
|
" if it could be a stale master,"
|
||||||
" you have been warned!",
|
" you have been warned!",
|
||||||
ptr->server->name,
|
ptr->server->name,
|
||||||
ptr->server->port)));
|
ptr->server->port)));
|
||||||
|
@ -3203,6 +3203,7 @@ static bool select_connect_backend_servers(
|
|||||||
|
|
||||||
if (slaves_connected == 0 && slaves_found > 0)
|
if (slaves_connected == 0 && slaves_found > 0)
|
||||||
{
|
{
|
||||||
|
#if defined(SS_EXTRA_DEBUG)
|
||||||
LOGIF(LE, (skygw_log_write(
|
LOGIF(LE, (skygw_log_write(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Warning : Couldn't connect to any of the %d "
|
"Warning : Couldn't connect to any of the %d "
|
||||||
@ -3216,9 +3217,11 @@ static bool select_connect_backend_servers(
|
|||||||
"slaves. Routing to %s only.",
|
"slaves. Routing to %s only.",
|
||||||
slaves_found,
|
slaves_found,
|
||||||
(is_synced_master ? "Galera nodes" : "Master"))));
|
(is_synced_master ? "Galera nodes" : "Master"))));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (slaves_found == 0)
|
else if (slaves_found == 0)
|
||||||
{
|
{
|
||||||
|
#if defined(SS_EXTRA_DEBUG)
|
||||||
LOGIF(LE, (skygw_log_write(
|
LOGIF(LE, (skygw_log_write(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Warning : Couldn't find any slaves from existing "
|
"Warning : Couldn't find any slaves from existing "
|
||||||
@ -3232,6 +3235,7 @@ static bool select_connect_backend_servers(
|
|||||||
"%d servers. Routing to %s only.",
|
"%d servers. Routing to %s only.",
|
||||||
router_nservers,
|
router_nservers,
|
||||||
(is_synced_master ? "Galera nodes" : "Master"))));
|
(is_synced_master ? "Galera nodes" : "Master"))));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (slaves_connected < max_nslaves)
|
else if (slaves_connected < max_nslaves)
|
||||||
{
|
{
|
||||||
@ -4306,6 +4310,13 @@ static void handleError (
|
|||||||
ROUTER_CLIENT_SES* rses = (ROUTER_CLIENT_SES *)router_session;
|
ROUTER_CLIENT_SES* rses = (ROUTER_CLIENT_SES *)router_session;
|
||||||
|
|
||||||
CHK_DCB(backend_dcb);
|
CHK_DCB(backend_dcb);
|
||||||
|
|
||||||
|
if (!rses_begin_locked_router_action(rses))
|
||||||
|
{
|
||||||
|
*succp = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/** Don't handle same error twice on same DCB */
|
/** Don't handle same error twice on same DCB */
|
||||||
if (backend_dcb->dcb_errhandle_called)
|
if (backend_dcb->dcb_errhandle_called)
|
||||||
{
|
{
|
||||||
@ -4330,21 +4341,26 @@ static void handleError (
|
|||||||
switch (action) {
|
switch (action) {
|
||||||
case ERRACT_NEW_CONNECTION:
|
case ERRACT_NEW_CONNECTION:
|
||||||
{
|
{
|
||||||
if (!rses_begin_locked_router_action(rses))
|
SERVER* srv = rses->rses_master_ref->bref_backend->backend_server;
|
||||||
{
|
/**
|
||||||
*succp = false;
|
* If master has lost its Master status error can't be
|
||||||
return;
|
* handled so that session could continue.
|
||||||
}
|
*/
|
||||||
|
|
||||||
if (rses->rses_master_ref->bref_dcb == backend_dcb &&
|
if (rses->rses_master_ref->bref_dcb == backend_dcb &&
|
||||||
!SERVER_IS_MASTER(rses->rses_master_ref->bref_backend->backend_server))
|
!SERVER_IS_MASTER(srv))
|
||||||
|
{
|
||||||
|
if (!srv->master_err_is_logged)
|
||||||
{
|
{
|
||||||
/** Master failed, can't recover */
|
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Error : Master node have failed. "
|
"Error : server %s:%d lost the "
|
||||||
"Session will be closed.")));
|
"master status. Readwritesplit "
|
||||||
|
"service can't locate the master. "
|
||||||
|
"Client sessions will be closed.",
|
||||||
|
srv->name,
|
||||||
|
srv->port)));
|
||||||
|
srv->master_err_is_logged = true;
|
||||||
|
}
|
||||||
*succp = false;
|
*succp = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -4364,6 +4380,7 @@ static void handleError (
|
|||||||
|
|
||||||
case ERRACT_REPLY_CLIENT:
|
case ERRACT_REPLY_CLIENT:
|
||||||
{
|
{
|
||||||
|
rses_end_locked_router_action(rses);
|
||||||
handle_error_reply_client(session,
|
handle_error_reply_client(session,
|
||||||
rses,
|
rses,
|
||||||
backend_dcb,
|
backend_dcb,
|
||||||
@ -4373,6 +4390,7 @@ static void handleError (
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
rses_end_locked_router_action(rses);
|
||||||
*succp = false;
|
*succp = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user