Menu

apr_memcacheではまる

馬鹿もーーんっ…!
なんだっ…!
このライブラリはっ…!

バグ持ち…!
致命的なバグ持ちじゃねえかっ…!
通るかっ…!こんなもん…!

 Apacheモジュールでapr_memcacheを使っていたら、ひどいバグにぶち当たった。こいつはapr_socket_sendv()等の結果をきちんとチェックしていないために、中途までしかデータが送られなかった場合にやりとりが破綻してしまう。ソケット通信系の関数はAPR_SUCCESSが返れば成功なのではなく、きちんと*lenを検査しなければならない(ソケットのoptionsメンバを見てもよい)のに、それを怠っている。

 悪いことにapr_memcacheAPR_SUCCESSが返る限りは接続を維持し、memcachedの方もプロトコル上サーバ側からは接続を切らないので、会話が噛み合わないまま接続が生き続ける。エラーとしては最初にAPR_EGENERALが起き、以後はEPIPE(Broken Pipe)を発し続けることになる。(たまたま帳尻が合ったりすれば別だが)

 これに気がついたのが本番投入後だったからしびれた。負荷テストはもっと真剣にやろう…。

2 Replies to “apr_memcacheではまる”

  1. apr_memcacheのバグ修正

    先日のapr_memcacheの問題だが、修正を入れてしばらく動かしたが目立った問題は出ていない。サービスに本番投入してもいけているので、パッチを公開することにする。 apr_memcache 0.7.0リリースにはそもそも不具合があるので、Subversionレポジトリから最新のtrunk(執筆..

コメントを残す

メールアドレスが公開されることはありません。