馬鹿もーーんっ…!
なんだっ…!
このライブラリはっ…!
バグ持ち…!
致命的なバグ持ちじゃねえかっ…!
通るかっ…!こんなもん…!
Apacheモジュールでapr_memcacheを使っていたら、ひどいバグにぶち当たった。こいつはapr_socket_sendv()
等の結果をきちんとチェックしていないために、中途までしかデータが送られなかった場合にやりとりが破綻してしまう。ソケット通信系の関数はAPR_SUCCESS
が返れば成功なのではなく、きちんと*len
を検査しなければならない(ソケットのoptions
メンバを見てもよい)のに、それを怠っている。
悪いことにapr_memcache
はAPR_SUCCESS
が返る限りは接続を維持し、memcached
の方もプロトコル上サーバ側からは接続を切らないので、会話が噛み合わないまま接続が生き続ける。エラーとしては最初にAPR_EGENERAL
が起き、以後はEPIPE
(Broken Pipe)を発し続けることになる。(たまたま帳尻が合ったりすれば別だが)
これに気がついたのが本番投入後だったからしびれた。負荷テストはもっと真剣にやろう…。
しびれますたな。
apr_memcacheのバグ修正
先日のapr_memcacheの問題だが、修正を入れてしばらく動かしたが目立った問題は出ていない。サービスに本番投入してもいけているので、パッチを公開することにする。 apr_memcache 0.7.0リリースにはそもそも不具合があるので、Subversionレポジトリから最新のtrunk(執筆..
I don’t think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article.