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