無限ループ

mod_jk 1.2.14〜1.2.15までは、reply_timeoutを設定した場合に
Tomcatから応答がないと待ち続ける問題があった。
#つまり、reply_timeoutを設定しているにも関わらずワーカは開放されない。
setsockoptsでSO_RCVTIMEOを設定しているが、recvがSO_RCVTIMEOの
設定時間でタイムアウトした時に
・戻り値:-1
・errno:EAGAIN
が返る。この場合にループを継続するコードになっている。
jk_connect.c jk_tcp_socket_recvfull() L.590

意図としては、recvの返却値が0になってjk_tcp_socket_recvfull()を
抜けてjk_shutdown_socket()に戻ってってのを16回(16秒)繰り返して
それでもFINがこなければclose()っていう動きにしたかったんだろうけど、
モノの見事にうまくいってない。


で、1.2.18では動きを見る限りは無限ループが発生しない。
なんでかいなぁ、と思い続けて早幾年月。


よくよくコード見てみたら、
1.2.20 jk_connect.c jk_shutdown_socket() L.519

    if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO,
                   (const void *) &tv, sizeof(tv)))
        rc = 1;

setsockoptは成功したら0、失敗したら-1を返す。
つまり、失敗したときだけrcには1が設定される。

おまけに、無限ループの現況であるjk_tcp_socket_recvfull()が
実行されるのはrcが1の時。
単にjk_tcp_socket_recvfull()が実行されないだけじゃん。


まぁ、実行されたところで読み捨ててるだけだから、いいのかもしれんが。

とりあえず、誰か英語書ける人にBugzillaに登録してもらおうかいな。


jk_tcp_socket_recvfull()に入る前にselect()してみようか思ったけど、
うまくselect()で引っかかってくれない。
なんかお作法あんのかな?
→select()の第一引数に設定する値を間違えてたらしい orz