gpt4 book ai didi

mysql - MariaDB 非阻塞 EPOLL

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:17 25 4
gpt4 key购买 nike

我有一个用 C 语言编写的单线程服务器,它接受基于 EPOLL 的 TCP/UDP 连接,并支持我们需要支持的大量协议(protocol)层的插件。这点很好。

由于单线程的性质,我想实现一个数据库层,它可以利用相同的 EPOLL 架构,而不是单独迭代所有打开的连接。

我们在其 API 中使用 MariaDB 和支持非阻塞功能的 MariaDB 连接器。

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

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

首先,我触发 mysql_real_connect_start(),如果它返回零,我们会立即发送查询,因为这表明不需要阻塞,尽管这从未发生过。

否则,我获取似乎是即时的文件描述符并将其注册到 EPOLL 并返回主 EPOLL 循环等待事件。

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

所以,一段时间后,我确实收到了 EPOLLOUT,表明套接字已打开。

我尽职尽责地调用了 mysql_real_connect_cont() 但在这个阶段它仍然返回一个非零值,表明我必须等待更长的时间?

但那是我得到的最后一个 EPOLL 事件,除了 EPOLLRDHUP,当时我猜 MariaDB 在 10 秒后挂断。

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

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

最佳答案

对于登陆这里的任何其他人来说,我修复了它或者更确切地说是未破坏它。

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

状态包含标志 MYSQL_WAIT_READ、MYSQL_WAIT_WRITE、MYSQL_WAIT_EXCEPT、MYSQL_WAIT_TIMEOUT,如果没有传递给下一个 _cont,我猜你是在搞乱 _cont 状态机。

我没有保存调用 _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.

关于mysql - MariaDB 非阻塞 EPOLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37909652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com