maria-discuss team mailing list archive
-
maria-discuss team
-
Mailing list archive
-
Message #03666
MariaDB non-blocking with EPOLL
Originally posted to :
http://stackoverflow.com/questions/37909652/mariadb-non-blocking-with-epoll
Edited for context.
I have single threaded server written in C that accepts TCP/UDP connections
based on EPOLL and supports plugins for the multitude of protocol layers we
need to support. That bit is fine.
Due to the single threaded nature I wanted to implement a database layer
that could utilize the same EPOLL architecture rather then separately
iterating over all of the open connections.
We use MariaDB and the MariaDB C connector that supports non blocking
functions in it's API as described here.
https://mariadb.com/kb/en/mariadb/using-the-non-blocking-library/
But what I'm finding is not what I expected, and what I was expecting is
described below.
First I fire the mysql_real_connect_start() and if it returns zero we
dispatch the query immediately as this indicates no blocking was required,
although this never happens.
Otherwise I fetch the file descriptor that seems to be immediate and
register it with EPOLL and bail back to the main EPOLL loop waiting for
events.
s = mysql_get_socket(mysql);
if(s > 0){
brt_socket_set_fds(endpoint, s);
struct epoll_event event;
event.data.fd = s;
event.events = EPOLLRDHUP | EPOLLIN | EPOLLET | EPOLLOUT;
s = epoll_ctl(efd, EPOLL_CTL_ADD, s, &event);
if (s == -1) {
syslog(LOG_ERR, "brd_db : epoll error.");
// handle error.
}...
So then some time later I do get the EPOLLOUT indicating the socket has
been opened.
And I dutifully call mysql_real_connect_cont() but at this stage it is
still returning a non-zero value, indicating I must wait longer?
But then that is the last EPOLL event I get, except for the EPOLLRDHUP when
I guess the MariaDB hangs up after 10 seconds.
Can anyone help me understand if this idea is even workable?
Thanks
David
Follow ups