[pgpool-general-jp: 107] notice_backend_error(1) in do_child()

Jun Kuriyama kuriyama+ml @ s2factory.co.jp
2007年 4月 13日 (金) 16:40:23 JST


 現在 pgpool-II 1.0.2 を試してみています。

 全部一台のマシン(FreeBSD 6.2R)で試していて、バックエンドをポート番号
を変えて三つ立ち上げています。

 主な設定は以下の状態です。

replication_mode = true
replication_strict = true
load_balance_mode = false
replication_stop_on_mismatch = true


 このとき、バックエンドのうち一台だけがデータが狂ってしまった時を想定
してテストをしていた所、replication_stop_on_mismatch を true にしてい
るので、バックエンドのうちひとつが切り離される、という所までは想定通り
にいきました。

 ところが、切り離されるバックエンドが想定と異なっていました。

 今回、node_id == 2 のデータだけを狂ったものにして、SELECT 文の返り値
が異なるような状態にしています。
 その際、以下のようなログを出しています。

read_kind_from_backend: read kind from 0 th backend D NUM_BACKENDS: 3
read_kind_from_backend: read kind from 1 th backend D NUM_BACKENDS: 3
read_kind_from_backend: read kind from 2 th backend C NUM_BACKENDS: 3
pool_process_query: 2 th kind C does not match with master connection kind D
notice_backend_error: 1 failover request from pid 20707
failover_handler called

 このように、node_id == 2 のバックエンドを切り離そうとしている所はい
いのですが、実際には真ん中の node_id == 1 が切り離されてしまいました。

 ちょっとソースを追ってみたところ、child.c の do_child() で

	/* fatal error occured. just exit myself... */
	case POOL_FATAL:
		notice_backend_error(1);
		child_exit(1);
		break;

という部分を見付けました。ここで notice_backend_error(1) と定数 1 を渡
しているので、毎回 node_id == 1 なバックエンドを切り離してしまっている
ようです。

 この定数 1 の部分に、適切な node_id を渡してやればいいのかな、と思っ
たのですが、mismatch を検出する read_kind_from_backend() から、上記の 
case POOL_FATAL までの経路で、どの node_id のバックエンドが POOL_FATAL 
の原因なのか、を渡すのにどういう形を想定して設計されているのかがわから
なかったので、ここの定数部分をどう変えてやればいいのかわかりませんでし
た。

 適切なバックエンドが切り離されるようにするには、どうしたらいいでしょ
うか?


-- 
Jun Kuriyama <kuriyama @ s2factory.co.jp> // S2 Factory, Inc.
               <kuriyama @ imgsrc.co.jp> // IMG SRC, Inc.
               <kuriyama @ FreeBSD.org> // FreeBSD Project


pgpool-general-jp メーリングリストの案内