[pgpool-general-jp: 968] Re: IN演算子に値を3000個以上指定したSQLを実行すると、後続のSQLが失敗する。

滝口 tak4ml @ yahoo.co.jp
2011年 8月 15日 (月) 16:54:47 JST


滝口です。ご回答ありがとうございます。

より再現しやすい手順を発見しましたので、報告いたします。
私の環境(3.1 alpha3)では100%再現可能になりました。

前回提示した手順1と手順2の間に、
以下の追加手順を実行してください。

------------------------------------------------------
手順1.1 一旦psqlクライアント終了
\q

手順1.2 再度接続
psql -U ****** ******

手順1.3 適当なSQL実行
SELECT * FROM test01;
------------------------------------------------------

手順1.2以後のSQL実行はファイルから実行してもOKです。
psql -U ****** ****** < file.sql

なお、3.0.3 環境では先回提示した通りの手順でも50%で再現可能ですが、
上記のように適当なSQLを実行した後だと100%再現出来ます。
テーブルのデータは不要です。

追加の補足情報ですが、
別のサーバ(Fedora12)にも3.0.3を導入しましたがそちらでも再現しました。
PostgreSQLとPgPoolが同一サーバでも、別サーバでも再現します。
メモリは2GBでSWAPは発生していません。
また、PgPoolII 2.3.2.2 では再現しない事を確認しました。



--- Tatsuo Ishii  wrote:
> 石井です。
> 
> pgpool-II 3.1 beta1でためしましたが、再現しませんでした。
> テスト用のテーブルは空の状態ですが、データが入っていないと再現しない、とか条件はありますか?
> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
> English: http://www.sraoss.co.jp/index_en.php
> Japanese: http://www.sraoss.co.jp
> 
> > はじめまして。滝口と申します。
> > 
> > PgPoolII3.x.xを利用させていただいておりますが、
> > 実行中のSQLが突然失敗する問題が
> > 発生しましたので報告させていただきます。
> > 
> > 【現象】
> > 2つのSQL(後述)を順番に実行すると2つ目のSQL実行が失敗します。
> > その時、PgPoolから出力されるメッセージは以下のものです。
> > -----------------------------------------------------------------
> > server closed the connection unexpectedly
> >         This probably means the server terminated abnormally
> >         before or while processing the request.
> > The connection to the server was lost. Attempting reset: Succeeded.
> > -----------------------------------------------------------------
> > 
> > ログには以下のメッセージが出力されています。
> > -----------------------------------------------------------------
> > ERROR: pid 1392: Child process 17082 was terminated by segmentation fault
> > -----------------------------------------------------------------
> > 
> > SQLを実行しても100%発生するわけではありません。
> > PgPoolII 3.0.3 だと2回中1回発生します。
> > PgPoolII 3.1.0alpha3 だと10回中1回程度です。
> > PgPoolを介さずPostgreSQLに直接実行した場合は発生しません。
> > 
> > 
> > 【再現手順】
> > 以下のSQLを順番に実行します。
> > 
> > 1. テスト用テーブル作成
> > create table test01 (data01 int);
> > 
> > 2. IN演算子の値を3000個指定して検索
> > SELECT data01 FROM test01 WHERE data01 IN 
> > (1,2,3,4,5,6,7,8,9,10, ・・・・・略・・・・ 2999, 3000);
> > 
> > 3. テーブルを6回結合して、IN演算子の値を10個指定して、ORDER LIMIT OFFSETなどを指定して検索
> > SELECT a.data01 FROM test01 a LEFT OUTER JOIN test01 b ON (a.data01= b.data01 and a.data01= b.data01) LEFT OUTER JOIN test01 c ON (a.data01=c.data01) LEFT OUTER JOIN test01 d ON (a.data01=d.data01) LEFT OUTER JOIN test01 e ON (a.data01=e.data01) LEFT OUTER JOIN test01 as k ON (a.data01=k.data01) WHERE a.data01 IN (1,2,3,4,5,6,7,8,9,10) ORDER BY b.data01 ASC,b.data01 ASC, a.data01 DESC ,c.data01 ASC,d.data01 ASC,e.data01 DESC LIMIT 20 OFFSET 0;
> > 
> > 4. ここでエラーが出ますが、出ない場合2と3の実行を繰り返します。
> > 
> > 
> > 【環境】
> > CentOS 5.4
> > PostgreSQL 9.0
> > PgPoolII 3.0.3
> > PgPoolII 3.1.0 alpha3 (上記の再現のために入れてみました)
> > 
> > 
> > 【設定】
> > 変更箇所は以下の点です。
> > num_init_children = 10
> > max_pool = 1
> > connection_life_time = 21
> > child_max_connections = 120
> > replication_mode = true
> > load_balance_mode = true
> > replication_stop_on_mismatch = true
> > master_slave_mode = false
> > バックエンドDBは1台または3台で確認
> > 
> > 
> > 【補足】
> > 再現手順の3で6回結合したり、値を3000個指定していますが、
> > 変化をつけながら様々なパターンで確認したところ
> > 5回の結合や、値2500個の場合は再現しませんでした。
> > 3000個以上より多い場合は再現します。
> > 
> > それと再現手順の2または3を単体で何度実行しても再現しません。
> > 順番が影響しているようです。
> > 
> > もし原因などお分かりになる方がいらっしゃいましたら
> > アドバイスをいただければ幸いです。
> > また何か開示した方が良い情報や試した方が良い事がありましたらご指摘ください。
> > _______________________________________________
> > pgpool-general-jp mailing list
> > pgpool-general-jp @ sraoss.jp
> > http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
>


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