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