2011年12月22日

[pgsql-jp: 41009]pgpool-II 3.1 系 parallel_mode - 子プロセスハングアップ

こんにちは、sho と申します。

pgpool-II 3.1 および 3.1.1 で parallel_mode をテストしているのですが、
たまに反応が帰ってこなくなるときがあります。
(特定のSQLを何度か繰り返すと発生するのですが、簡単・確実に再現する
SQL が見つけられませんでした)
状態としては、CPU 利用率がほぼ 100 %で、その子プロセスを gdb でみたところ、

pool_process_query in pool_process_query.c:
内の for 文を抜け出せないようです。
gdb で next を繰り返すと、以下のコードのところをずーとループしているようです。

if (state == 0 && reset_request)
check_stop_request();
if (*InRecovery > 0 && pool_config->client_idle_limit_in_recovery == -1)
if (is_cache_empty(frontend, backend) && !pool_is_query_in_progress())
if (!pool_read_buffer_is_empty(frontend) && !pool_is_query_in_progress())
if (!pool_read_buffer_is_empty(MASTER(backend)) || pool_is_query_in_progress()) <--※1
if (got_sighup)

問題がないときは、※1 内の処理に入るようですが、問題が出ているときはこの処理に入りません。
pool_read_buffer_is_empty(MASTER(backend)) が真になっているようです。
MASTER にあたる connection データの len だけ 0 で他のノードはまだ len > 0 に
なっていました。
もしかしたら、pool_is_query_in_progress 側の問題かもしれませんが、よくわかりませんでした。

なお、2.3.2.2 では上記のような現象はでません。

情報が不足してるとは思いますが、なにかわかりますでしょうか?
以上、よろしくお願いします。

-- sho


投稿者 xml-rpc : 2011年12月22日 16:23
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/107804
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。