[pgpool-general-jp: 432] Re: pgpool 3.4.1のdo_error_commandについて
Kenichi Sawada
k @ sawada.cc
2008年 4月 14日 (月) 19:36:07 JST
浅羽様:
澤田です。
> もし、片方にだけ Sync を出してしまいますと、INSERT などが失敗した場合
> に、
>
> master: Execute(INSERT ..) secondary: Execute(INSERT ...)
> master: Sync
> master: Execute(...) secondary: Execute(...)
>
> の場合に、セカンダリからは結果が返ってこないので、ハングアップしてしま
> う可能性があります。
>
> つまり拡張問合せでエラーが発生したら、拡張問合せで意図的にエラーを発生
> させるようにする必要があります。
すみません、私の理解が甘いのだと思いますが、
本件について
- replicate_selectがfalseの場合で
- transaction中のselectがmasterでエラーとなった場合に
secondaryにもエラーを引き起こすためにのみdo_error_commandが発行され、
このときmasterへのselectが拡張問い合わせだったときに限り
(select_in_transaction == 1 かつ extended_select == 1のとき)
masterにのみSyncを送る(secondaryは既にReadyForQuery状態なので)
そうでなければmaster, secondary双方にSyncを送る
という処理になるかと思いますので、
御指摘のケースにはあてはまらないかと想定しておりますが、
いかがでしょうか?
--澤田 研一
--k @ sawada.cc
From: Yoshiyuki Asaba <y-asaba @ sraoss.co.jp>
Date: Mon, 14 Apr 2008 19:13:51 +0900 (JST)
> 浅羽です。
>
> From: Kenichi Sawada <k @ sawada.cc>
> Subject: [pgpool-general-jp: 430] Re: pgpool 3.4.1のdo_error_commandについて
> Date: Mon, 14 Apr 2008 14:35:08 +0900 (JST)
>
> > > Sync は以下のケースの場合に両方に投げる必要があります。
> > >
> > > 1. Execute("BEGIN")
> > > 2. Execute("SELECT ...") <-- ここでエラー
> > > 3. Execute("...") <- アボートしているのでエラー
> > >
> > > ここで 2 を実行してエラーが発生し、Sync を送らずにさらに Execute を送
> > > ると、マスタからはエラーが返ってきますが、セカンダリからは何も結果を返
> > > してきません。
> >
> > 本件については、2. でエラーが返った際すぐにdo_error_commandが呼ばれるため、
> > セカンダリでもエラーとなり、ABORTになるのではないかと想定しておりますが、
> > いかがでしょうか?
>
> 簡易問合せと拡張問合せのエラー時のプロトコルが微妙に異なります。
>
> 2. でエラーが発生するとマスタでは
>
> ErrorResponse
>
> が返ってきます。しかし、do_error_command() は簡易問合せプロトコルでエ
> ラーを発生させているため、
>
> ErrorResponse -> ReadyForQuery(tstate = 'E')
>
> というエラーが返ってきます。今回のハングアップの原因は、簡易問合せプロ
> トコルの ReadyForQuery が余計に飛んでくることでした。
>
> 澤田さんに作成していただいたパッチではマスタにだけ Sync を出すようにし
> ています。postgres が Sync を受けとるまでは、拡張問合せでエラーが発生
> すると、クライアントからの要求をすべてスルーします。
>
> postgresql-8.3.1/src/backend/tcop/postgres.c:PostgresMain()
> ...
> /*
> * (6) process the command. But ignore it if we're skipping till
> * Sync.
> */
> if (ignore_till_sync && firstchar != EOF)
> continue;
> ...
>
>
> もし、片方にだけ Sync を出してしまいますと、INSERT などが失敗した場合
> に、
>
> master: Execute(INSERT ..) secondary: Execute(INSERT ...)
> master: Sync
> master: Execute(...) secondary: Execute(...)
>
> の場合に、セカンダリからは結果が返ってこないので、ハングアップしてしま
> う可能性があります。
>
> つまり拡張問合せでエラーが発生したら、拡張問合せで意図的にエラーを発生
> させるようにする必要があります。
>
> pgpool-II 2.x では修正してみましたが、申し訳ありませんが、ちょっと最近
> 手がまわらないのでなかなか pgpool の修正ができていません…。
>
> http://cvs.pgfoundry.org/cgi-bin/cvsweb.cgi/pgpool/pgpool-II/pool_process_query.c.diff?r1=1.106&r2=1.107
>
> --
> Yoshiyuki Asaba
> y-asaba @ sraoss.co.jp
> _______________________________________________
> pgpool-general-jp mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
>
pgpool-general-jp メーリングリストの案内