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

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

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

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

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


Categories : Tech