Mariadb与Epoll非阻滞



我有C中写的单线螺纹服务器,该服务器接受基于EPOLL的TCP/UDP连接,并支持我们需要支持的多种协议层的插件。那一点很好。

由于单程性质,我想实现一个数据库层,该数据库层可以利用相同的Epoll体系结构,而不是在所有开放连接上分别迭代。

我们使用MariadB和MariaDB连接器,该连接器支持其API中的非阻止功能。

https://mariadb.com/kb/en/mariadb/using-the-non-blocking-library/

,但我发现的不是我的期望,而我期望的是下面描述的。

首先,我发射mysql_real_connect_start(),如果返回零,我们立即派遣查询,因为这表明不需要阻止,尽管这从未发生。

否则,我获取似乎立即进行的文件描述符,并在Epoll中注册并保释回主Epoll Loop等待事件。

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.
    }
...

所以,一段时间后,我确实得到了表明插座已打开的epulout。

我尽职尽责地致电mysql_real_connect_cont(),但在此阶段,它仍在返回非零值,表明我必须等待更长的时间?

,但这是我最后一次获得的epoll事件,除了我猜玛丽亚德(Mariadb)10秒后挂断的epollrdhup。

谁能帮助我了解这个想法是否可行?

谢谢...谢谢...非常感谢。

可以适合在这里降落的任何其他人,我修复了它或取消它。

请注意,从示例中 - _start/_cont调用的返回状态作为参数传递给下一个_cont。原来这很关键。

状态包含标志mysql_wait_read,mysql_wait_write,mysql_wait_except,mysql_wait_timeout,如果未传递给下一个_cont,我的猜测是您猜测您正在与_cont State-Machine搞乱。

没有在_start和_cont的不同位置之间保存状态状态。
struct MC
{
    MYSQL *mysql;
    int status;
} MC;
...
// Initial call
mc->status = mysql_real_connect_start(&ret, mc->mysql, host, user, password, NULL, 0, NULL, 0);
// EPOLL raised calls.
mc->status = mysql_real_connect_cont(&ret, mc->mysql, mc->status);
if(mc->status) return... // keep waiting check for errors.

相关内容

  • 没有找到相关文章

最新更新