[pgpool-general-jp: 736] child.c: do_accept() と timeout

Jun Kuriyama kuriyama+ml @ s2factory.co.jp
2010年 2月 16日 (火) 11:55:41 JST


 ちょっとまだ途中で、細かいところを追求し切れていないのですが、ヒント
を求めて一端投稿してみます。

-----
 pgpool stop してもプロセスが終了しないことがある、という事象が手元で
発生していて、その原因を追っています。

 発生するのは、PCP リクエストが何らかの理由で刺さってしまって、
pcp_recovery_node コマンドなどを ^C で中断してしまった場合。毎回ではな
いのがややこしい。

 この時、pgpool stop すると SIGTERM が各子供に伝わるのですが、
child.c:die() の中で exit_request が設定されるにもかかわらず、その後
check_stop_request() まで到達していない。

 pool_debug() をいろいろと入れて試したところ、do_accept() の select()
で止まったままの様子(ちょっとここは自信がない)。
 本来 select() は SIGTERM 受けたら EINTR で戻るべき?

 また、今の child.c の実装では、最初接続を受けるまでは connected = 0
で、その状態で child_life_time を経過すると、do_child() の timeout =
{0, 0} となってしまい、次の do_accept() ではタイムアウト無しの状態で
select() に入る。(意図的?)

 do_accept() から戻った後に、timeout.tv_sec = child_life_time と戻し
てやると、ちゃんと select() が EINTR で戻って for(;;) をやり直して
check_stop_request() まで到達するようです。


 FreeBSD の select() の問題なのかなんなのかよくわからないのですが、今
のところ timeout.tv_sec を設定し直すとちゃんと終了するようになっていま
す。


-- 
Jun Kuriyama <kuriyama @ s2factory.co.jp> // S2 Factory, Inc.


pgpool-general-jp メーリングリストの案内