[pgsql-jp: 41009] pgpool-II 3.1 系 parallel_mode - 子プロセスハングアップ
sho
sho @ big.or.jp
2011年 12月 22日 (木) 16:23:08 JST
こんにちは、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
pgsql-jp メーリングリストの案内