← Back to team overview

maria-discuss team mailing list archive

MariaDB non-blocking with EPOLL


Originally posted to :
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.


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

s = mysql_get_socket(mysql);
if(s > 0){
    brt_socket_set_fds(endpoint, s);
    struct epoll_event event;
    event.data.fd = s;
    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?



Follow ups