[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 メーリングリストの案内