[pgpool-general-jp: 1136] pgool-II 3.2.3 released
Nozomi Anzai
anzai @ sraoss.co.jp
2013年 2月 18日 (月) 14:55:13 JST
安齋です。
pgpool-II 3.2.3 をリリースしましたのでお知らせします。
これはおもに、先日リリースした 3.2.2 のヘルスチェックに関する致命的な問題を
修正するものです。
フェイルオーバ発生時に pgpool のメインプロセスが消滅して pgpool-II へのクラ
イアントの接続がすべてハングする、という事象で、以下の条件がすべて満たされ
たときに発生します。また、その状態から復帰するには、pgpool の子プロセスを手
動で kill し、pgpool-II を再起動するしかありませんでした。
- ヘルスチェックが有効である。
- PostgreSQL への接続を、UNIX ドメインソケットではなく TCP/IP で行なって
いる(※ pgpool.conf のバックエンドノード設定において "backend_hostnameN"
が空欄でない)。
以下からダウンロードすることができます。
http://www.pgpool.net/download.php?f=pgpool-II-3.2.3.tar.gz
===========================================================================
pgpool-II 3.2.3
http://www.pgpool.net/docs/pgpool-II-3.2.3/pgpool-ja.html#release3.2.3
===========================================================================
- 3.2.2 で入り込んだ connect_inet_domain_socket_by_port() の バグを修正しま
した。 (Tatsuo Ishii)
接続において non blocking の connect() が EINPROGRESS や EALREADY という
結果を返したときには、 select(2) を呼んで read / write ファイルディスクリ
プタの準備されるまで待つようにしました。
本来は select() が 0 以上を返したときにそうするべきところを、0 を返したと
きだけになっていました。 その結果、connect_inet_domain_socket_by_port()
が実際には失敗しているのに 成功していたと誤って返していました。
またさらに、これによって health_check() がバックエンドが生きているものと
誤認し、 バックエンドソケットに書き込みを行なおうとし、失敗していました。
これをトリガに notice_backend_error() が呼ばれ、SIGUSR1 シグナルが pgpool
のメインプロセスの 親プロセスに送られます。 その結果、pgpool をシェルから
起動していれば、シェルを kill する、ということになります。
pgpool をバックグラウンドで起動していれば #1 プロセスを kill します。これ
は、pgpool を root として起動していなければ問題ありません。 もっとも root
として起動していても、SIGUSR1 を受け取って /dev/initctl を再度 open する
だけなので、 実際に問題はありません。
これらの困った問題は pgpool が誕生した時点から存在していましたが、
connect_inet_domain_socket_by_port() のバグによって表面化しました。 修正
には、notice_backend_error() と child_exit() を変更し、 pgpool のメインプ
ロセス自体から呼ばれたときには、自分自身を kill しないように、何も行なわ
ないようにしました。
- 設定パラメータの一覧を表示する "SHOW pool_status" で pool_passwd が表示さ
れていないのを修正しました。(Yugo Nagata)
- configure.in にある configure のヘルプの typo を修正しました。 (Yugo
Nagata)
===========================================================================
--
Nozomi Anzai
SRA OSS, Inc. Japan
pgpool-general-jp メーリングリストの案内