New version, with client socket closed detection
This commit is contained in:
62
gateway.c
62
gateway.c
@ -58,11 +58,19 @@ static void signal_set (int sig, void (*handler)(int)) {
|
|||||||
|
|
||||||
int handle_event_errors(DCB *dcb, int event) {
|
int handle_event_errors(DCB *dcb, int event) {
|
||||||
struct epoll_event ed;
|
struct epoll_event ed;
|
||||||
|
MySQLProtocol *protocol = DCB_PROTOCOL(dcb, MySQLProtocol);
|
||||||
|
|
||||||
|
fprintf(stderr, "#### Handle error function for %i\n", dcb->fd);
|
||||||
|
|
||||||
|
if (dcb) {
|
||||||
|
if (dcb->state == DCB_STATE_DISCONNECTED) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(stderr, "#### Handle error function\n");
|
|
||||||
#ifdef GW_EVENT_DEBUG
|
#ifdef GW_EVENT_DEBUG
|
||||||
if (event != -1) {
|
if (event != -1) {
|
||||||
fprintf(stderr, ">>>>>> DCB state %i, Protocol State %i: event %i, %i\n", dcb->state, dcb->proto_state, event & EPOLLERR, event & EPOLLHUP);
|
fprintf(stderr, ">>>>>> DCB state %i, Protocol State %i: event %i, %i\n", dcb->state, protocol->state, event & EPOLLERR, event & EPOLLHUP);
|
||||||
if(event & EPOLLHUP)
|
if(event & EPOLLHUP)
|
||||||
fprintf(stderr, "EPOLLHUP\n");
|
fprintf(stderr, "EPOLLHUP\n");
|
||||||
|
|
||||||
@ -80,27 +88,32 @@ int handle_event_errors(DCB *dcb, int event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GW_EVENT_DEBUG
|
#ifdef GW_EVENT_DEBUG
|
||||||
fprintf(stderr, "closing fd [%i], from events check and backend too [%i]\n", dcb->fd, &dcb->session->backends->fd);
|
fprintf(stderr, "closing fd [%i]=[%i], from events\n", dcb->fd, protocol->fd);
|
||||||
#endif
|
#endif
|
||||||
if (dcb->fd) {
|
if (dcb->fd) {
|
||||||
close (dcb->fd);
|
//fprintf(stderr, "Client protocol dcb->protocol %p\n", dcb->protocol);
|
||||||
|
|
||||||
if(dcb) {
|
gw_mysql_close((MySQLProtocol **)&dcb->protocol);
|
||||||
if (dcb->session) {
|
fprintf(stderr, "Client protocol dcb->protocol %p\n", dcb->protocol);
|
||||||
if (dcb->session->backends) {
|
dcb->state = DCB_STATE_DISCONNECTED;
|
||||||
gw_mysql_close((MySQLProtocol **)&dcb->session->backends->protocol);
|
|
||||||
}
|
|
||||||
}
|
if (dcb->session->backends->protocol != NULL) {
|
||||||
free(dcb);
|
fprintf(stderr, "!!!!!! BAckend still open! dcb %p\n", dcb->session->backends->protocol);
|
||||||
|
gw_mysql_close((MySQLProtocol **)&dcb->session->backends->protocol);
|
||||||
}
|
}
|
||||||
|
close(dcb->fd);
|
||||||
}
|
}
|
||||||
|
free(dcb->session);
|
||||||
|
free(dcb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int handle_event_errors_backend(DCB *dcb, int event) {
|
int handle_event_errors_backend(DCB *dcb, int event) {
|
||||||
struct epoll_event ed;
|
struct epoll_event ed;
|
||||||
|
MySQLProtocol *protocol = DCB_PROTOCOL(dcb, MySQLProtocol);
|
||||||
|
|
||||||
fprintf(stderr, "#### Handle Backend error function\n");
|
fprintf(stderr, "#### Handle Backend error function for %i\n", dcb->fd);
|
||||||
|
|
||||||
#ifdef GW_EVENT_DEBUG
|
#ifdef GW_EVENT_DEBUG
|
||||||
if (event != -1) {
|
if (event != -1) {
|
||||||
@ -122,15 +135,16 @@ int handle_event_errors_backend(DCB *dcb, int event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GW_EVENT_DEBUG
|
#ifdef GW_EVENT_DEBUG
|
||||||
fprintf(stderr, "Backend closing fd [%i], from events check and backend too [%i]\n", dcb->fd);
|
fprintf(stderr, "Backend closing fd [%i]=%i, from events check\n", dcb->fd, protocol->fd);
|
||||||
#endif
|
#endif
|
||||||
if (dcb->fd) {
|
if (dcb->fd) {
|
||||||
close (dcb->fd);
|
dcb->state = DCB_STATE_DISCONNECTED;
|
||||||
|
fprintf(stderr, "Freeing backend MySQL conn %p, %p\n", dcb->protocol, &dcb->protocol);
|
||||||
if(dcb) {
|
gw_mysql_close((MySQLProtocol **)&dcb->protocol);
|
||||||
free(dcb);
|
fprintf(stderr, "Freeing backend MySQL conn %p, %p\n", dcb->protocol, &dcb->protocol);
|
||||||
}
|
close(dcb->fd);
|
||||||
}
|
}
|
||||||
|
free(dcb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,15 +216,15 @@ int main(int argc, char **argv) {
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GW_EVENT_DEBUG
|
//#ifdef GW_EVENT_DEBUG
|
||||||
fprintf(stderr, "wake from epoll_wait, n. %i events\n", nfds);
|
fprintf(stderr, "wake from epoll_wait, n. %i events\n", nfds);
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
for (n = 0; n < nfds; ++n) {
|
for (n = 0; n < nfds; ++n) {
|
||||||
DCB *dcb = (DCB *) (events[n].data.ptr);
|
DCB *dcb = (DCB *) (events[n].data.ptr);
|
||||||
|
|
||||||
|
|
||||||
#ifdef GW_EVENT_DEBUG
|
//#ifdef GW_EVENT_DEBUG
|
||||||
fprintf(stderr, "New event %i for socket %i is %i\n", n, dcb->fd, events[n].events);
|
fprintf(stderr, "New event %i for socket %i is %i\n", n, dcb->fd, events[n].events);
|
||||||
if (events[n].events & EPOLLIN)
|
if (events[n].events & EPOLLIN)
|
||||||
fprintf(stderr, "New event %i for socket %i is EPOLLIN\n", n, dcb->fd);
|
fprintf(stderr, "New event %i for socket %i is EPOLLIN\n", n, dcb->fd);
|
||||||
@ -219,7 +233,7 @@ int main(int argc, char **argv) {
|
|||||||
if (events[n].events & EPOLLPRI)
|
if (events[n].events & EPOLLPRI)
|
||||||
fprintf(stderr, "New event %i for socket %i is EPOLLPRI\n", n, dcb->fd);
|
fprintf(stderr, "New event %i for socket %i is EPOLLPRI\n", n, dcb->fd);
|
||||||
|
|
||||||
#endif
|
//#endif
|
||||||
if ((events[n].events & EPOLLIN) || (events[n].events & EPOLLPRI)) {
|
if ((events[n].events & EPOLLIN) || (events[n].events & EPOLLPRI)) {
|
||||||
// now checking the listening socket
|
// now checking the listening socket
|
||||||
if (dcb->state == DCB_STATE_LISTENING) {
|
if (dcb->state == DCB_STATE_LISTENING) {
|
||||||
@ -242,8 +256,10 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (events[n].events & (EPOLLERR | EPOLLHUP)) {
|
if (events[n].events & (EPOLLERR | EPOLLHUP)) {
|
||||||
|
|
||||||
// error handling
|
// error handling
|
||||||
(dcb->func).error(dcb, events[n].events);
|
(dcb->func).error(dcb, events[n].events);
|
||||||
|
if (dcb) free(dcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // filedesc loop
|
} // filedesc loop
|
||||||
|
@ -171,7 +171,7 @@ int do_read_buffer(DCB *dcb, uint8_t *buffer) {
|
|||||||
|
|
||||||
if (n == 0 & (errno==EOF)) {
|
if (n == 0 & (errno==EOF)) {
|
||||||
fprintf(stderr, "ReadBuffer Socket EOF\n");
|
fprintf(stderr, "ReadBuffer Socket EOF\n");
|
||||||
return -1;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
|
Reference in New Issue
Block a user