Move sending of the OK on client side authentication to the EPOLLIN event processing routine

Addition of a compile switch to make epoll block rather than timeout, useful only for debugging
This commit is contained in:
Mark Riddoch
2013-06-27 09:28:34 +02:00
parent 3b8ebfd215
commit 99465dd6b7
2 changed files with 31 additions and 25 deletions

View File

@ -104,6 +104,9 @@ struct epoll_event ev;
return epoll_ctl(epoll_fd, EPOLL_CTL_DEL, dcb->fd, &ev); return epoll_ctl(epoll_fd, EPOLL_CTL_DEL, dcb->fd, &ev);
} }
#define BLOCKINGPOLL 1 /* Set BLOCKING POLL to 1 if using a single thread and to make
* debugging easier.
*/
/** /**
* The main polling loop * The main polling loop
* *
@ -118,6 +121,11 @@ int i, nfds;
while (1) while (1)
{ {
#if BLOCKINGPOLL
if ((nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1)) == -1)
{
}
#else
if ((nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, 0)) == -1) if ((nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, 0)) == -1)
{ {
} }
@ -127,6 +135,7 @@ int i, nfds;
{ {
} }
} }
#endif
if (nfds > 0) if (nfds > 0)
{ {
atomic_add(&pollStats.n_polls, 1); atomic_add(&pollStats.n_polls, 1);

View File

@ -823,11 +823,33 @@ int gw_read_client_event(DCB* dcb) {
queue = gwbuf_consume(queue, len); queue = gwbuf_consume(queue, len);
if (auth_val == 0) if (auth_val == 0)
{
SESSION *session = NULL;
protocol->state = MYSQL_AUTH_RECV; protocol->state = MYSQL_AUTH_RECV;
//write to client mysql AUTH_OK packet, packet n. is 2
mysql_send_ok(dcb, 2, 0, NULL);
// start a new session, and connect to backends
session = session_alloc(dcb->service, dcb);
protocol->state = MYSQL_IDLE;
session->data = (MYSQL_session *)dcb->data;
}
else else
{
protocol->state = MYSQL_AUTH_FAILED; protocol->state = MYSQL_AUTH_FAILED;
// still to implement
mysql_send_auth_error(dcb, 2, 0, "Authorization failed");
dcb->func.close(dcb);
}
} }
break; break;
case MYSQL_IDLE: case MYSQL_IDLE:
@ -952,31 +974,6 @@ int gw_write_client_event(DCB *dcb) {
return 1; return 1;
} }
if(protocol->state == MYSQL_AUTH_RECV) {
SESSION *session = NULL;
//write to client mysql AUTH_OK packet, packet n. is 2
mysql_send_ok(dcb, 2, 0, NULL);
// start a new session, and connect to backends
session = session_alloc(dcb->service, dcb);
protocol->state = MYSQL_IDLE;
session->data = (MYSQL_session *)dcb->data;
return 0;
}
if (protocol->state == MYSQL_AUTH_FAILED) {
// still to implement
mysql_send_auth_error(dcb, 2, 0, "Authorization failed");
dcb->func.close(dcb);
return 0;
}
if ((protocol->state == MYSQL_IDLE) || (protocol->state == MYSQL_WAITING_RESULT)) { if ((protocol->state == MYSQL_IDLE) || (protocol->state == MYSQL_WAITING_RESULT)) {
int w; int w;