#author("2018-02-13T12:14:53+00:00","default:haikikyou","haikikyou")
#author("2018-02-13T12:15:02+00:00","default:haikikyou","haikikyou")
[[PostgreSQL/Pgpool-II]]

#contents

* Pgpool-IIのタイムアウト関連のパラメータ及び設定など [#wa707596]

ざっと調べたところ、以下のようになっている。特に、''connect_timeout''は、共通して色々なところで使われ、health_check_timeoutとも関連している。システムのタイムアウトの設計をするときには要確認。

#ref(./pgpool-timeout.png,90%)
#ref(./pgpool-timeout.png,85%)

* クエリ実行中の動作 [#r23ad898]

- backendからの応答を、&code(){select};で30secタイムアウトで待つ。
- 30secタイムアウトした後は、frontendに対してダミーのパラメータ状態報告(ParameterStatus (B))を送り、frontendへのソケット書き込みが成功するか否かをチェックしている(ただし、TCPではfrontendの接続が既に閉じられていて&code(){FIN};を送られていても&code(){write};は可能である。最初の&code(){write};で&code(){RST};が誘発され、続く&code(){write};で&code(){SIGPIPE};が送られることとなる)。

&label(warn){参考};
- [[wait_for_query_response()>https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob;f=src/protocol/pool_process_query.c;h=31c773f91a36db4b4ce362a3708aa04209715669;hb=8f9e4063c9ebc48429809e75e72f385b23d3e44e#l479]] - &size(11){&color(gray){on https://git.postgresql.org/gitweb/?p=pgpool2.git};};
- [[PostgreSQL 9.6.5文書 51.5. メッセージの書式>https://www.postgresql.jp/document/9.6/html/protocol-message-formats.html]] - &size(11){&color(gray){on https://www.postgresql.jp/document/9.6/html/};};
- http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html
- [[UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI>http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/haikikyou-22/ref=nosim/]] - &size(11){&color(gray){on http://www.amazon.co.jp};};


以下は&code(){wait_for_query_response};関数実行時のスタックトレースである。&code(){pool_check_fd};内で&code(){select};を使ってbackendの応答を待つ。

#geshi{{{
  * frame #0: 0x000000010cf0100f pgpool`pool_check_fd(cp=0x000000010d15f078) at pool_process_query.c:627
    frame #1: 0x000000010cf00e53 pgpool`wait_for_query_response(frontend=0x00007f967b817438, backend=0x000000010d15f078, protoVersion=3) at pool_process_query.c:494
    frame #2: 0x000000010cf00cfd pgpool`wait_for_query_response_with_trans_cleanup(frontend=0x00007f967b817438, backend=0x000000010d15f078, protoVersion=3, pid=-2027356160, key=-239764672) at pool_process_query.c:453
    frame #3: 0x000000010cf2c533 pgpool`pool_send_and_wait(query_context=0x00007f967c803038, send_type=1, node_id=0) at pool_query_context.c:817
    frame #4: 0x000000010cf11121 pgpool`SimpleQuery(frontend=0x00007f967b817438, backend=0x00007f967b801648, len=19, contents="select * from foo;") at pool_proto_modules.c:635
    frame #5: 0x000000010cf18cde pgpool`ProcessFrontendResponse(frontend=0x00007f967b817438, backend=0x00007f967b801648) at pool_proto_modules.c:2358
    frame #6: 0x000000010cf00a60 pgpool`read_packets_and_process(frontend=0x00007f967b817438, backend=0x00007f967b801648, reset_request=0, state=0x00007ffee2d2cba4, num_fields=0x00007ffee2d2cbc2, cont="\x01\376) at pool_process_query.c:4731
    frame #7: 0x000000010cefebea pgpool`pool_process_query(frontend=0x00007f967b817438, backend=0x00007f967b801648, reset_request=0) at pool_process_query.c:226
    frame #8: 0x000000010cef85b3 pgpool`do_child(fds=0x00007f967b402af0) at child.c:383
    frame #9: 0x000000010cece480 pgpool`fork_a_child(fds=0x00007f967b402af0, id=0) at pgpool_main.c:607
    frame #10: 0x000000010cecb366 pgpool`PgpoolMain(discard_status='\x01', clear_memcache_oidmaps='\0') at pgpool_main.c:363
    frame #11: 0x000000010cec9838 pgpool`main(argc=9, argv=0x00007ffee2d377f8) at main.c:318
    frame #12: 0x00007fff7502d115 libdyld.dylib`start + 1
    frame #13: 0x00007fff7502d115 libdyld.dylib`start + 1
}}}

&code(){ereport};で、エラーレベル&code(){FRONTEND_ERROR};が指定されているので、ここに到達するとスタックの上流の&code(){PG_CATCH()};に飛び、さらに&code(){PG_RE_THROW()};され&code(){sigsetjmp};の&code(){PG_exception_stack};で指定されたポイントに制御が移る。エラーハンドリング内では、セッションクローズするための処理を行なっている。ソケットのエラーの場合、バックエンドのコネクションは閉じられる。

#geshi{{{
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
  * frame #0: 0x00000001081bf6cb pgpool`pool_send_frontend_exits(backend=0x00007ff5f4801648) at pool_process_query.c:721
    frame #1: 0x00000001081b706f pgpool`backend_cleanup(frontend=0x0000000108330e20, backend=0x00007ff5f4801648, frontend_invalid='\x01') at child.c:491
    frame #2: 0x00000001081b60ec pgpool`do_child(fds=0x00007ff5f4600170) at child.c:241
    frame #3: 0x000000010818c480 pgpool`fork_a_child(fds=0x00007ff5f4600170, id=0) at pgpool_main.c:607
    frame #4: 0x0000000108189366 pgpool`PgpoolMain(discard_status='\x01', clear_memcache_oidmaps='\0') at pgpool_main.c:363
    frame #5: 0x0000000108187838 pgpool`main(argc=9, argv=0x00007ffee7a797f8) at main.c:318
    frame #6: 0x00007fff6523e115 libdyld.dylib`start + 1
    frame #7: 0x00007fff6523e115 libdyld.dylib`start + 1
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = step in
  * frame #0: 0x00000001082090ac pgpool`pool_close(cp=0x000000010841d078) at pool_stream.c:117
    frame #1: 0x00000001081cb59d pgpool`pool_discard_cp(user="guest", database="test", protoMajor=3) at pool_connection_pool.c:214
    frame #2: 0x00000001081b70a2 pgpool`backend_cleanup(frontend=0x0000000108330e20, backend=0x00007ff5f4801648, frontend_invalid='\x01') at child.c:493
    frame #3: 0x00000001081b60ec pgpool`do_child(fds=0x00007ff5f4600170) at child.c:241
    frame #4: 0x000000010818c480 pgpool`fork_a_child(fds=0x00007ff5f4600170, id=0) at pgpool_main.c:607
    frame #5: 0x0000000108189366 pgpool`PgpoolMain(discard_status='\x01', clear_memcache_oidmaps='\0') at pgpool_main.c:363
    frame #6: 0x0000000108187838 pgpool`main(argc=9, argv=0x00007ffee7a797f8) at main.c:318
    frame #7: 0x00007fff6523e115 libdyld.dylib`start + 1
    frame #8: 0x00007fff6523e115 libdyld.dylib`start + 1
(lldb) 
}}}

&label(warn){参考};
- [[protocol/child.c>https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob;f=src/protocol/child.c;h=066b035811c9bc3607ba803a860e72000f5f8d5d;hb=8f9e4063c9ebc48429809e75e72f385b23d3e44e#l215]] - &size(11){&color(gray){on https://git.postgresql.org/gitweb/?p=pgpool2.git};};
- [[backend_cleanup()>https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob;f=src/protocol/child.c;h=066b035811c9bc3607ba803a860e72000f5f8d5d;hb=8f9e4063c9ebc48429809e75e72f385b23d3e44e#l424]] - &size(11){&color(gray){on https://git.postgresql.org/gitweb/?p=pgpool2.git};};


#ref(./pgpool-in-query-processing.png)
* 参考リンク [#gbc912bb]

- ファイルオーバ
-- http://www.pgpool.net/docs/latest/ja/html/runtime-config-failover.html
- コネクションプール
-- http://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html
- ヘルスチェック
-- http://www.pgpool.net/docs/latest/ja/html/runtime-config-health-check.html
- その他ソース
-- [[wait_for_query_response()>https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob;f=src/protocol/pool_process_query.c;h=02f10eab79a339d22194cd4b5aac13d06b5ba60f;hb=refs/tags/V3_7_0#l479]] - &size(11){&color(gray){on https://git.postgresql.org/gitweb/?p=pgpool2.git};};
- [[setjmp>https://linuxjm.osdn.jp/html/LDP_man-pages/man3/setjmp.3.html]] - &size(11){&color(gray){on https://linuxjm.osdn.jp/html/LDP_man-pages/man3/setjmp.3.html};};

PR

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP