[pgsql-jp: 33702] Re: pgpool の接続が増え続けます

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 7月 19日 (月) 16:30:06 JST


石井です.

> 芋野です。
> pgpool 2.0.4 でやってみましたがやはり num_init_children を超えたところで
> 応答が帰ってきません。 -d -n でやってみると pgpool 側でも何の応答も
> ないようです。これは CSE でも、自作のアプリでも同じ反応でした。
> 言い忘れましたが自作アプリは libpq.dll 経由でアクセスする、Takesou さん
> 作の PQコンポという Delphi 用コンポーネントを C++Builder で使って作って
> おります。

実際にCSEと片岡さんが配布しているlibpq.dllを取ってきて調べてみました.

その結果,片岡さんのlibpq.dllはPostgreSQL 6.5ベースであり,libpqの6.5
の実装にはバグがあることがわかりました.本来コネクションを切断するメッ
セージはversion 2プロトコルでは1バイトの'X'という文字でなければならな
いのですが,6.5のlibpqでは,'X'に加えて'\n'を送信してしまっています.
その結果pgpoolが混乱して無限ループに入り,コネクションを解放できなくなっ
ていたのです.

6.5のlibpqのバグは,少なくとも7.3では直っているようです.
# pgpoolのREADMEでは,version 2プロトコルは7.0以降で採用,となっていま
# したが,これは間違いで,version 2は6.4から7.3.xで使われています.

ただ,こうしたフロントエンド側のバグにもpgpoolは備える必要があると思う
ので,とりあえず添付のようなパッチを作ってみました.私の手元のWindows
XP(VMWareで動いています)ではうまく行っているように見えます.よかったら
お試し下さい.

ただし,毎回

ERROR: pid 16228: ProcessFrontendResponse: unknown message type 

というエラーが出てしまいますが,これは前述の6.5のバグのせいなのでやむ
を得ません.

ちなみに,pgpoolは本日2.0.5をリリースしたばかりで,パッチは2.0.5に対す
るものとなっているので,それ以前のものではうまくあたらないかもしれませ
んが,1行だけの修正なので手で直すことも可能だと思います.
--
Tatsuo Ishii

-------------------------- cut here ---------------------------
diff -c -r1.27 pool_process_query.c
*** pool_process_query.c	19 Jul 2004 01:23:58 -0000	1.27
--- pool_process_query.c	19 Jul 2004 07:25:53 -0000
***************
*** 1294,1300 ****
  	char fkind;
  	POOL_STATUS status;
  
! 	if (frontend->no_forward != 0)
  		return POOL_CONTINUE;
  
  	if (pool_read(frontend, &fkind, 1) < 0)
--- 1294,1300 ----
  	char fkind;
  	POOL_STATUS status;
  
! 	if (frontend->len <= 0 && frontend->no_forward != 0)
  		return POOL_CONTINUE;
  
  	if (pool_read(frontend, &fkind, 1) < 0)



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