[pgpool-general-jp: 423] Re: pgpool 3.4.1のdo_error_commandについて
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp
2008年 3月 19日 (水) 17:42:51 JST
浅羽です。
From: Kenichi Sawada <k @ sawada.cc>
Subject: [pgpool-general-jp: 422] pgpool 3.4.1のdo_error_commandについて
Date: Wed, 19 Mar 2008 10:54:56 +0900 (JST)
> 1. replicate_select = false
> 2. トランザクション内にて、extended modeでMASTERにselectを投げ、errorが返る
> 3. pgpoolのdo_error_commandにて、SECONDARY側にエラーとなるquery
> "send invalid query from pgpool to abort transaction": 通常モード)が
> 投げられる
なるほど、ここで簡易問合せプロトコルでエラーを投げるので、
セカンダリだけ ErrorResponse と ReadyForQuery が届くということですね。
pgpool が ErrorResponse しか読みこまないために、処理していない
ReadyForQuery と
> 4. そのあとMASTERとSECONDARYにSyncが投げられる
ここでも ReadyForQuery が来るというわけですね。
> という状況のようです。そこで、拡張問い合わせの際にはSECONDARYにSyncを
> 投げないようにするパッチを適用してみたところ、手元ではうまく動作している
> ようですが、いかがなものでしょうか。ご意見頂ければ幸いです。
Sync は以下のケースの場合に両方に投げる必要があります。
1. Execute("BEGIN")
2. Execute("SELECT ...") <-- ここでエラー
3. Execute("...") <- アボートしているのでエラー
ここで 2 を実行してエラーが発生し、Sync を送らずにさらに Execute を送
ると、マスタからはエラーが返ってきますが、セカンダリからは何も結果を返
してきません。
http://www.postgresql.jp/document/pg830doc/html/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY
拡張問い合わせメッセージの処理中にエラーが検出されると、バックエンド
はErrorResponseを発行し、Syncが届くまでメッセージを読み、それを破棄
します。
したがって、Sync を両方に送る必要があります。上記のケースのように、
拡張問合せプロトコル内で pgpool が内部的に送るエラークエリを実行
(do_error_command() 関数)したら、ReadyForQuery を一度読んであげる必要
があります。
--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp
pgpool-general-jp メーリングリストの案内