2023/6/16(金)
ジョギングをした。4.2km。
ほぼ日のジョギングは続いている割にそんなに体力が付いた感じがしないので、もっとちゃんとメシと肉を食べて良く寝るべきだという結論に至った。とりあえず昼は大盛の唐揚げ丼を食べた。今夜は早く寝る。
Drogonを使ってたら謎のセグフォが出たので一日中原因と再現条件を調べていた。セグフォの原因はlibmariadbの挙動のようだった。さらなる根本原因までは分からなかったが、再現条件はおおよそ分かった。思ったより条件が狭い。
- Ubuntu(WSL含む)で動かす。Rocky Linuxでは再現しなかった。
- vcpkgのlibmariadbを用いて動かす。aptで取得したlibmariadb-devでビルドしても再現しなかった。
- ノンブロッキングモードで動作させる。(参考)
- mysql_real_connect_startで「Unixソケットによって」接続を試行し、そして失敗する。
- 失敗後にmysql_get_socketを呼ぶ。
以上でセグフォが発生する。
なんでこんなレアケースを踏むことになったのかと言うと、以下のような事情による。
- いつものようにvcpkgで開発を進めていた。
- WSLでDrogonの動作を試みていた。データベースの機能も使っていた。Drogonのmysql接続は中身としてはlibmariadbである。
- Drogonはノンブロッキングが売りなので内部的にノンブロッキングモードで動作させていた。
- libmariadbの仕様として、ホスト名にlocalhostを渡した場合はTCP接続ではなくUnixソケットに自動的に変更するようになっている。(参考)
- Drogonはmysql_real_connect_startで接続を開始した後にmysql_get_socketを呼ぶようになっていた。よく分からないがエラーチェックの類?そのチェックでセグフォが出ているわけだが。
https://github.com/drogonframework/drogon/blob/master/orm_lib/src/mysql_impl/MysqlConnection.cc#L119
一体どこにissueを建てるべきなのかすら見当も付かない。
Categories: 未分類