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