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