[pgpool-general-jp: 606] Re: pgpool-IIのsegfaultについて

Tatsuo Ishii ishii @ sraoss.co.jp
2009年 8月 13日 (木) 16:56:07 JST


> > あれから色々と検証を行いpgpool-II 2.2.3でも動作確認を行いましたが、
> > 以下の場合だけやはり問題が発生します。
> > 
> > <正常に動作するパターン>
> > ・pgpoolにアクセスが来ない状態で起動。
> > ・pgpoolに少し(10〜20程度)アクセスが来る状態で起動。
> > ・設定ファイルに起動しているデータベースのみ記述し、大量にアクセスが来ている状態で起動。
> > 
> > <プロセスが終了してしまうパターン>
> > ・設定ファイルに起動していないデータベースも記述(縮退運転の状態)し、大量にアクセスが来ている状態で起動。
> > 
> > 運用で逃げることもできなくはないのですが、この問題を回避することは可能でしょうか?
> 
> health_checkの設定はどうなっているでしょうか?pgpool.confを見せてもら
> えますか?
> 
> もしhealth_checkが無効であれば、有効にしてみるとどうなるでしょうか?

原因が分かりました。

pgpoolの親がsignal handlerを設定する前に、子プロセスからフェイルオーバ
を要求するシグナルが上がってきて、親プロセスが死んでしまうのが原因でし
た。以下のパッチで直ると思います。お試し下さい。

Index: main.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/main.c,v
retrieving revision 1.45.2.3
diff -c -r1.45.2.3 main.c
*** main.c	22 Jul 2009 08:46:55 -0000	1.45.2.3
--- main.c	13 Aug 2009 07:52:58 -0000
***************
*** 428,433 ****
--- 428,435 ----
  	}
  	*InRecovery = 0;
  
+ 	POOL_SETMASK(&BlockSig);
+ 
  	/* fork the children */
  	for (i=0;i<pool_config->num_init_children;i++)
  	{
***************
*** 436,442 ****
  	}
  
  	/* set up signal handlers */
! 	POOL_SETMASK(&BlockSig);
  	pool_signal(SIGTERM, exit_handler);
  	pool_signal(SIGINT, exit_handler);
  	pool_signal(SIGQUIT, exit_handler);
--- 438,444 ----
  	}
  
  	/* set up signal handlers */
! 
  	pool_signal(SIGTERM, exit_handler);
  	pool_signal(SIGINT, exit_handler);
  	pool_signal(SIGQUIT, exit_handler);



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