EPOLL に基づいて TCP/UDP 接続を受け入れ、サポートする必要がある多数のプロトコル層のプラグインをサポートする、C で記述されたシングル スレッド サーバーがあります。そのビットは大丈夫です。
シングル スレッドの性質上、開いているすべての接続を個別に反復処理するのではなく、同じ EPOLL アーキテクチャを利用できるデータベース レイヤーを実装したいと考えました。
MariaDB と、その API でノンブロッキング機能をサポートする MariaDB コネクタを使用します。
https://mariadb.com/kb/en/mariadb/using-the-non-blocking-library/
しかし、私が見つけたのは私が期待したものではなく、私が期待していたものは以下に説明されています.
最初に を起動し、mysql_real_connect_start()
0 が返された場合は、ブロックが不要であることを示しているため、すぐにクエリをディスパッチしますが、これは発生しません。
それ以外の場合は、即時と思われるファイル記述子を取得して 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 イベントです。ただし、MariaDB が 10 秒後にハングアップすると思われる EPOLLRDHUP を除きます。
このアイデアが実行可能かどうかを理解するのを手伝ってくれる人はいますか?
ありがとう…ありがとう…どうもありがとう。