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

tak4ml @ yahoo.co.jp tak4ml @ yahoo.co.jp
2011年 8月 12日 (金) 19:46:23 JST


はじめまして。滝口と申します。

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