Remove redundant error handling code from routers

The routers no longer need to track the number of errors each DCB
receives. This is now done by the protocol modules.

The type of the DCB no longer needs to be checked in the handleError
implementation as the function is only called when a backend DCB fails.
This commit is contained in:
Markus Mäkelä
2017-03-06 11:44:19 +02:00
parent 29ece502f5
commit f18a40ce73
6 changed files with 129 additions and 202 deletions

View File

@ -1732,6 +1732,7 @@ errorReply(MXS_ROUTER *instance,
mxs_error_action_t action,
bool *succp)
{
ss_dassert(backend_dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER);
ROUTER_INSTANCE *router = (ROUTER_INSTANCE *)instance;
int error;
socklen_t len;
@ -1742,54 +1743,46 @@ errorReply(MXS_ROUTER *instance,
mysql_errno = (unsigned long) extract_field(((uint8_t *)GWBUF_DATA(message) + 5), 16);
errmsg = extract_message(message);
/** Don't handle same error twice on same DCB */
if (backend_dcb->dcb_errhandle_called)
/** Check router state and set errno an message */
if (router->master_state < BLRM_BINLOGDUMP || router->master_state != BLRM_SLAVE_STOPPED)
{
/** Check router state and set errno an message */
if (router->master_state < BLRM_BINLOGDUMP || router->master_state != BLRM_SLAVE_STOPPED)
/* Authentication failed */
if (router->master_state == BLRM_TIMESTAMP)
{
/* Authentication failed */
if (router->master_state == BLRM_TIMESTAMP)
spinlock_acquire(&router->lock);
/* set io error message */
if (router->m_errmsg)
{
spinlock_acquire(&router->lock);
/* set io error message */
if (router->m_errmsg)
{
free(router->m_errmsg);
}
router->m_errmsg = mxs_strdup("#28000 Authentication with master server failed");
/* set mysql_errno */
router->m_errno = 1045;
/* Stop replication */
router->master_state = BLRM_SLAVE_STOPPED;
spinlock_release(&router->lock);
/* Force backend DCB close */
dcb_close(backend_dcb);
MXS_ERROR("%s: Master connection error %lu '%s' in state '%s', "
"%s while connecting to master %s:%d",
router->service->name, router->m_errno, router->m_errmsg,
blrm_states[BLRM_TIMESTAMP], msg,
router->service->dbref->server->name,
router->service->dbref->server->port);
free(router->m_errmsg);
}
}
if (errmsg)
{
free(errmsg);
}
router->m_errmsg = mxs_strdup("#28000 Authentication with master server failed");
/* set mysql_errno */
router->m_errno = 1045;
/** we optimistically assume that previous call succeed */
*succp = true;
return;
/* Stop replication */
router->master_state = BLRM_SLAVE_STOPPED;
spinlock_release(&router->lock);
/* Force backend DCB close */
dcb_close(backend_dcb);
MXS_ERROR("%s: Master connection error %lu '%s' in state '%s', "
"%s while connecting to master %s:%d",
router->service->name, router->m_errno, router->m_errmsg,
blrm_states[BLRM_TIMESTAMP], msg,
router->service->dbref->server->name,
router->service->dbref->server->port);
}
}
else
if (errmsg)
{
backend_dcb->dcb_errhandle_called = true;
free(errmsg);
}
/** we optimistically assume that previous call succeed */
*succp = true;
return;
len = sizeof(error);
if (router->master &&
getsockopt(router->master->fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0 &&