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