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

Imono Kazuo imonomail @ nbsystem.co.jp
2004年 7月 20日 (火) 12:06:08 JST


芋野です。
早速以下部分を修正した 2.0.5 で試してみました。

[PostgreSQL、pgpool 共に同一PC]

例1) CSE、及び、libpq.dll を使った自作アプリのみで行った場合
    起動後終了すると postgre の接続は開放される。繰り返してもOK。
    次々同じDB、ユーザーでつないでゆくとnum_init_children に達した
    後は反応が返ってこない。他の接続を一つでも開放すると接続さ
    れる。これは違うDBを交えても同じ。

例2) ODBC接続を用いた自作アプリのみで行った場合
    起動後終了しても postgre の接続は維持されたまま。
    その後同じDB,ユーザーで起動しても接続は増えない。(再利用?)
    次々同じDB、ユーザーでつないでゆくとnum_init_children に達した
    後は反応が返ってこない。他の接続を一つでも開放すると接続さ
    れる。これは違うDBを交えても同じ。

[PostgreSQL が別PC]
    上記の場合と同じでした。

これらの結果を踏まえて以下の諸点につき質問させてください。

1.例1)の場合アプリを終了するとその都度接続は開放されますが
    これはいわゆる「コネクションプール」機能が働いていないという
    ことなんでしょうか。
2.どちらの例もそうなのですが、num_init_children に達するとそれ以上
    接続されず、待たされているようなのですがこれは本来の動きなの
    でしょうか。

以上、ご面倒ですがよろしくお願いいたします。



----- Original Message ----- 
From: "Tatsuo Ishii" <t-ishii @ sra.co.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Monday, July 19, 2004 4:30 PM
Subject: [pgsql-jp: 33702] Re: pgpool の接続が増え続けます


> 石井です.
>
> 実際に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 メーリングリストの案内