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