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