[pgsql-jp: 39953] Re: pgpool でプロトコルエラー

Tatsuo Ishii ishii @ sraoss.co.jp
2009年 8月 6日 (木) 15:34:11 JST


石井です。

板垣さん、テストありがとうございます。

石田さん、パッチありがとうございます。早速コミットさせて頂きます。
--
Tatsuo Ishii
SRA OSS, Inc. Japan

> こんにちは。石田@苫小牧市です。
> 
> 2009/08/05 16:45 に Itagaki Takahiro<itagaki.takahiro @ oss.ntt.co.jp> さんは書きました:
> > 板垣です。
> >
> > pgpool を、あえて通常とは異なる使い方をしてテストしていたのですが、
> > SELECT の結果行数が異なるパターンでは、プロトコルエラーによる強制切断が
> > 発生するようです。
> >
> > ----
> > =# /**/SELECT * FROM generate_series(1, (random()*10)::integer);
> > ERROR:  kind mismatch among backends. Possible last query was:
> >    "/**/SELECT * FROM generate_series(1, (random()*10)::integer);" kind de
> > メッセージの内容がメッセージ種類"E"の長さに合いません
> > サーバとの接続が想定外にクローズされました
> >        おそらく要求の処理前または処理中にサーバが異常終了
> >        したことを意味しています。
> >
> > (pgpool のエラーログ)
> > ERROR: kind mismatch among backends. Possible last query was:
> >    "/**/SELECT * FROM generate_series(1, (random()*10)::integer);"
> >    kind details are: 0[C] 1[D]
> >
> > $ pgpool -v
> > pgpool-II version 2.2.2 (urukiboshi)
> > ----
> >
> > 一方、片方がエラーになるパターン (kind details are: 0[T] 1[E]) では、
> > 適切に強制切断されています。最初のパターンでも、エラーになることは
> > 確実なのですが、エラーの種類が適切でないようなので気になっております。
> 
> 
> pgpoolがフロントエンドにErrorResponseを返す時に、メッセージを
> 整形する処理に問題があるようです。
> 片方がエラーになるパターンは(kind details are: 0[T] 1[E])
> 短かいSQLだったのではないでしょうか。
> 
> 単純に直すとすれば、
> 
> diff -r ee01705b85e1 pool_process_query.c
> --- a/pool_process_query.c	Thu Jul 16 17:21:01 2009 +0900
> +++ b/pool_process_query.c	Thu Aug 06 14:52:04 2009 +0900
> @@ -2329,16 +2329,19 @@ void pool_send_error_message(POOL_CONNEC
> 
>  		/* error level */
>  		thislen = snprintf(msgbuf, MAXMSGBUF, "SERROR");
> +		thislen = Min(thislen, MAXMSGBUF);
>  		memcpy(data +len, msgbuf, thislen+1);
>  		len += thislen + 1;
> 
>  		/* code */
>  		thislen = snprintf(msgbuf, MAXMSGBUF, "C%s", code);
> +		thislen = Min(thislen, MAXMSGBUF);
>  		memcpy(data +len, msgbuf, thislen+1);
>  		len += thislen + 1;
> 
>  		/* message */
>  		thislen = snprintf(msgbuf, MAXMSGBUF, "M%s", message);
> +		thislen = Min(thislen, MAXMSGBUF);
>  		memcpy(data +len, msgbuf, thislen+1);
>  		len += thislen + 1;
> 
> ...以下同様
> 
> で良いと思いますが、MAXMSGBUFはもうすこし大きくても
> 良いかもしれません。
> 
> 
> 
> >
> > とりあえず、報告だけになります。原因の詳細までは解析できていません。
> >
> > ------------------------------------------------------------
> > 板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>
> >
> >
> >
> 
> 
> 
> -- 
> ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>



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