MXS-2860: Extract socket error only when needed
As the process of extracting the socket error also resets it, it should be done only when necessary.
This commit is contained in:
@ -2657,30 +2657,12 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events)
|
|||||||
|
|
||||||
if ((events & EPOLLOUT) && (dcb->n_close == 0))
|
if ((events & EPOLLOUT) && (dcb->n_close == 0))
|
||||||
{
|
{
|
||||||
int eno = 0;
|
rc |= MXB_POLL_WRITE;
|
||||||
eno = gw_getsockerrno(dcb->fd);
|
|
||||||
|
|
||||||
if (eno == 0)
|
if (dcb_session_check(dcb, "write_ready"))
|
||||||
{
|
{
|
||||||
rc |= MXB_POLL_WRITE;
|
DCB_EH_NOTICE("Calling dcb->func.write_ready(%p)", dcb);
|
||||||
|
dcb->func.write_ready(dcb);
|
||||||
if (dcb_session_check(dcb, "write_ready"))
|
|
||||||
{
|
|
||||||
DCB_EH_NOTICE("Calling dcb->func.write_ready(%p)", dcb);
|
|
||||||
dcb->func.write_ready(dcb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char errbuf[MXS_STRERROR_BUFLEN];
|
|
||||||
MXS_DEBUG("%lu [poll_waitevents] "
|
|
||||||
"EPOLLOUT due %d, %s. "
|
|
||||||
"dcb %p, fd %i",
|
|
||||||
pthread_self(),
|
|
||||||
eno,
|
|
||||||
strerror_r(eno, errbuf, sizeof(errbuf)),
|
|
||||||
dcb,
|
|
||||||
dcb->fd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((events & EPOLLIN) && (dcb->n_close == 0))
|
if ((events & EPOLLIN) && (dcb->n_close == 0))
|
||||||
@ -2712,16 +2694,6 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events)
|
|||||||
}
|
}
|
||||||
if ((events & EPOLLERR) && (dcb->n_close == 0))
|
if ((events & EPOLLERR) && (dcb->n_close == 0))
|
||||||
{
|
{
|
||||||
int eno = gw_getsockerrno(dcb->fd);
|
|
||||||
if (eno != 0)
|
|
||||||
{
|
|
||||||
char errbuf[MXS_STRERROR_BUFLEN];
|
|
||||||
MXS_DEBUG("%lu [poll_waitevents] "
|
|
||||||
"EPOLLERR due %d, %s.",
|
|
||||||
pthread_self(),
|
|
||||||
eno,
|
|
||||||
strerror_r(eno, errbuf, sizeof(errbuf)));
|
|
||||||
}
|
|
||||||
rc |= MXB_POLL_ERROR;
|
rc |= MXB_POLL_ERROR;
|
||||||
|
|
||||||
if (dcb_session_check(dcb, "error"))
|
if (dcb_session_check(dcb, "error"))
|
||||||
@ -2733,16 +2705,6 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events)
|
|||||||
|
|
||||||
if ((events & EPOLLHUP) && (dcb->n_close == 0))
|
if ((events & EPOLLHUP) && (dcb->n_close == 0))
|
||||||
{
|
{
|
||||||
MXB_AT_DEBUG(int eno = gw_getsockerrno(dcb->fd));
|
|
||||||
MXB_AT_DEBUG(char errbuf[MXS_STRERROR_BUFLEN]);
|
|
||||||
MXS_DEBUG("%lu [poll_waitevents] "
|
|
||||||
"EPOLLHUP on dcb %p, fd %d. "
|
|
||||||
"Errno %d, %s.",
|
|
||||||
pthread_self(),
|
|
||||||
dcb,
|
|
||||||
dcb->fd,
|
|
||||||
eno,
|
|
||||||
strerror_r(eno, errbuf, sizeof(errbuf)));
|
|
||||||
rc |= MXB_POLL_HUP;
|
rc |= MXB_POLL_HUP;
|
||||||
|
|
||||||
if (!dcb->dcb_errhandle_called)
|
if (!dcb->dcb_errhandle_called)
|
||||||
@ -2760,16 +2722,6 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events)
|
|||||||
#ifdef EPOLLRDHUP
|
#ifdef EPOLLRDHUP
|
||||||
if ((events & EPOLLRDHUP) && (dcb->n_close == 0))
|
if ((events & EPOLLRDHUP) && (dcb->n_close == 0))
|
||||||
{
|
{
|
||||||
MXB_AT_DEBUG(int eno = gw_getsockerrno(dcb->fd));
|
|
||||||
MXB_AT_DEBUG(char errbuf[MXS_STRERROR_BUFLEN]);
|
|
||||||
MXS_DEBUG("%lu [poll_waitevents] "
|
|
||||||
"EPOLLRDHUP on dcb %p, fd %d. "
|
|
||||||
"Errno %d, %s.",
|
|
||||||
pthread_self(),
|
|
||||||
dcb,
|
|
||||||
dcb->fd,
|
|
||||||
eno,
|
|
||||||
strerror_r(eno, errbuf, sizeof(errbuf)));
|
|
||||||
rc |= MXB_POLL_HUP;
|
rc |= MXB_POLL_HUP;
|
||||||
|
|
||||||
if (!dcb->dcb_errhandle_called)
|
if (!dcb->dcb_errhandle_called)
|
||||||
|
@ -1329,29 +1329,15 @@ static int gw_error_backend_event(DCB* dcb)
|
|||||||
if (dcb->persistentstart == 0)
|
if (dcb->persistentstart == 0)
|
||||||
{
|
{
|
||||||
/** Not a persistent connection, something is wrong. */
|
/** Not a persistent connection, something is wrong. */
|
||||||
MXS_ERROR("EPOLLERR event on a non-persistent DCB with no session. "
|
MXS_ERROR("EPOLLERR event on a non-persistent DCB with no session. Closing connection.");
|
||||||
"Closing connection.");
|
|
||||||
}
|
}
|
||||||
dcb_close(dcb);
|
dcb_close(dcb);
|
||||||
}
|
}
|
||||||
else if (dcb->state != DCB_STATE_POLLING || session->state != SESSION_STATE_STARTED)
|
else if (dcb->state != DCB_STATE_POLLING || session->state != SESSION_STATE_STARTED)
|
||||||
{
|
{
|
||||||
int error;
|
if (auto err = gw_getsockerrno(dcb->fd))
|
||||||
int len = sizeof(error);
|
|
||||||
|
|
||||||
if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, (socklen_t*) &len) == 0 && error != 0)
|
|
||||||
{
|
{
|
||||||
if (dcb->state != DCB_STATE_POLLING)
|
MXS_ERROR("DCB in state %s got error '%s'.", STRDCBSTATE(dcb->state), mxs_strerror(err));
|
||||||
{
|
|
||||||
MXS_ERROR("DCB in state %s got error '%s'.",
|
|
||||||
STRDCBSTATE(dcb->state),
|
|
||||||
mxs_strerror(errno));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MXS_ERROR("Error '%s' in session that is not ready for routing.",
|
|
||||||
mxs_strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1381,15 +1367,11 @@ static int gw_backend_hangup(DCB* dcb)
|
|||||||
{
|
{
|
||||||
if (session->state != SESSION_STATE_STARTED)
|
if (session->state != SESSION_STATE_STARTED)
|
||||||
{
|
{
|
||||||
int error;
|
if (session->state != SESSION_STATE_STOPPING)
|
||||||
int len = sizeof(error);
|
|
||||||
if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, (socklen_t*) &len) == 0)
|
|
||||||
{
|
{
|
||||||
if (error != 0 && session->state != SESSION_STATE_STOPPING)
|
if (auto err = gw_getsockerrno(dcb->fd))
|
||||||
{
|
{
|
||||||
MXS_ERROR("Hangup in session that is not ready for routing, "
|
MXS_ERROR("Hangup in session that is not ready for routing: %s", mxs_strerror(err));
|
||||||
"Error reported is '%s'.",
|
|
||||||
mxs_strerror(errno));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user