[pgpool-general-jp: 431] Re: pgpool 3.4.1のdo_error_commandについて
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp
2008年 4月 14日 (月) 19:13:51 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 メーリングリストの案内