У меня есть однопоточный сервер, написанный на C, который принимает TCP/UDP-соединения на основе EPOLL и поддерживает плагины для множества уровней протокола, которые нам необходимо поддерживать. Этот бит в порядке.MariaDB, не блокирующий с помощью EPOLL
Из-за однопоточной природы я хотел реализовать слой базы данных, который мог бы использовать одну и ту же архитектуру EPOLL, а затем отдельно перебирать все открытые соединения.
Мы используем соединители MariaDB и MariaDB, которые поддерживают неблокирующие функции в его API.
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 секунд.
Может ли кто-нибудь помочь мне понять, возможна ли эта идея?
Спасибо ... Спасибо ... столько спасибо.
Обновление: на самом деле на mysql_real_connect_cont я получаю сообщение об ошибке «0x6643a7„Подключение к серверу MySQL на „рукопожатия: чтение щёток пакета связи“, системная ошибка: 11“» –
An обновление: Я выбросил образец код с сайта MariaDB, и он отлично работает, поэтому предположим, что я ошибаюсь между _start и _cont в моем коде приложения. –