[pgpool-general-jp: 1441] マスタスレーブモードとコマンドクエリキャッシュ有効時にpgpool2から応答がこなくなる
Nobuyuki Nagai
nagai.nb @ ncos.nec.co.jp
2017年 1月 18日 (水) 16:00:33 JST
はじめまして、永井と申します。
Javaアプリケーションからpgpool-IIを介して、
PostgreSQLに接続しています。
当初はデフォルトのpgpool.confで正常に通信ができていたのですが、
master_slave_mode = on
master_slave_sub_mode = 'stream'
memory_cache_enabled = on
memqcache_method = 'shmem'
の設定に変更してから、pgpool-IIからアプリに無応答になる
事象が発生しました。
Java : 6
JDBCドライバ : postgresql-9.4.1212.jre6.jar
pgpool-II : 3.5.4 (3.5.5も同様)
PostgreSQL : 9.5.5
CentOS : 6.6
そこで、tcpdumpとpgpool-II 3.5.4のソースコードの付け合わせを行ったところ
以下のコードに問題があるように思いました。
そこで、こちらの調査で根本的な勘違いをしていなかと思い、どなたかご確認頂ければ幸いです。
○通信
AP pgpool PostgreSQL
→ P(select 1)/B/D/E/S→
→ P(select 1) →
→ B →
→ D →
→ H →
← 1/2/T ←
← 1/2/T ←
← D/C ←
← Z ←
→ P(delete 〜)/B/D/E/S→★
→ H →
※B…Bind
D…Describe
E…Eexecute
H…Flush
P…Parse
S…Sync
○コード
pool_proto_modules.c:574 Execute関数で、キャッシュにヒットすると
pool_unset_query_in_progress()等を呼び出して
704行目でリターンしています。
キャッシュにヒットしないと、master_slave_mode = onなら
786行目で pool_unset_pending_response() を呼び出してから
リターンしています。
つまりキャッシュがあるとpending_responseがtrueになったままで、
次のクエリが来ると(★)
pool_process_query.c:1980 do_query関数でFlushを発行し、
しかしPostgreSQLからは応答がないため、2009行目でタイムアウトする
までループし続けるのではないか?
※pool_is_pending_response関数は
master_slave_mode = on
master_slave_sub_mode = 'stream'
以外では固定falseで、Flushを発行するルートにならない。
以上、よろしくお願いいたします。
pgpool-general-jp メーリングリストの案内