[pgpool-general-jp: 740] Re: child.c: do_accept() と timeout
Tatsuo Ishii
ishii @ sraoss.co.jp
2010年 2月 22日 (月) 13:40:29 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() に入る。(意図的?)
はい、これは意図的です。まだ何にも働いていないプロセスが
child_life_timeごとにselectに入るのも無駄なので。
> do_accept() から戻った後に、timeout.tv_sec = child_life_time と戻し
> てやると、ちゃんと select() が EINTR で戻って for(;;) をやり直して
> check_stop_request() まで到達するようです。
これは、EINTRで戻っているのではなく、何らかの理由(pcp_recovery_nodeが
刺さったから?)で、select実行中に割り込みが禁止されているからではない
でしょうか?そうだとすれば、pcp_recovery_nodeが刺さったときに、割り込
み禁止にならないように修正するのが本来のような気がします。
timeoutを設定するとEINTRでselectから戻る、そうでなければ戻らないという
のは確かでしょうか?
また、「pcp_recovery_nodeが刺ささる」というのは具体的にどういう状態か
わかりますか?
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
> FreeBSD の select() の問題なのかなんなのかよくわからないのですが、今
> のところ timeout.tv_sec を設定し直すとちゃんと終了するようになっていま
> す。
>
>
> --
> Jun Kuriyama <kuriyama @ s2factory.co.jp> // S2 Factory, Inc.
> _______________________________________________
> pgpool-general-jp mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
pgpool-general-jp メーリングリストの案内