[pgpool-general-jp: 1242] pgpool-II 3.3.2 released

Nozomi Anzai anzai @ sraoss.co.jp
2013年 11月 29日 (金) 15:22:40 JST


安齋です。

pgpool-II 3.3.2 をリリースしましたのでお知らせいたします。
また、インストーラ、RPM が PostgreSQL 9.2 用しかありませんでしたが、
PostgreSQL 9.3 用もリリースしました。

以下からダウンロードすることができます。
http://pgpool.net/mediawiki/index.php/Downloads

リリースノート(英語):
http://www.pgpool.net/docs/pgpool-II-3.3.2/NEWS.txt
リリースノート(日本語):
http://www.pgpool.net/docs/pgpool-II-3.3.2/doc/pgpool-ja.html#release3.3.2

===========================================================================
pgpool-II 3.3.2 (2013/11/29)
===========================================================================

* レプリケーションモード稼働時、一部のタイムゾーンでタイムスタンプの書き換
えが誤っていました。(Tatsuo Ishii)

タイムスタンプの書き換え処理では、現在日時を取得するあめに "SELECT now()"
を実行します。 しかし一部のタイムゾーンにおいては、"02:30" のような場合に現
在日時のためのバッファの大きさが 十分ではありませんでした。"0900" のように
30 分刻みでのタイムゾーンでないときは、この問題は発生しません。 そのため、
これまでこの不具合が報告されたことはありませんでした。

この不具合は [pgpool-general: 2113] で報告され、Sean Hogan さんによって修正
が提供されました。
http://www.sraoss.jp/pipermail/pgpool-general/2013-September/002156.html

* installer: redhat/rpm_installer/getsources.sh での pgpoolAdmin の バー
ジョン指定方法を修正しました。 (Yugo Nagata)

* Makefile: Makefiles 内の pg_config を $(PG_CONFIG) に置き換えました。 し
たがって、PostgreSQL のメジャーバージョンが異なる場合には、コンパイル中で上
書きされるようになります。(Tatsuo Ishii)
パッチは Christoph Berg さんから提供されました。([pgpool-general: 2127])
http://www.sraoss.jp/pipermail/pgpool-general/2013-September/002156.html

* watchdog: -Werror=format-security をつけてコンパイルしたときの、
warning/error を修正しました。(Tatsuo Ishii)
パッチは Christoph Berg さんから提供されました。([pgpool-general: 2127])
http://www.sraoss.jp/pipermail/pgpool-general/2013-September/002156.html

* configure: FreeBSD で問題があったため、-lcompat を削除しました。(Tatsuo
Ishii)
bug#15 で報告されました。
http://www.pgpool.net/mantisbt/view.php?id=15

* pgpool.conf で log_standby_delay を設定してないときに segfault していたの
を修正しました。(Tatsuo Ishii)

これは、pool_config.l での log_standby_delay の初期化が誤っていたためです。
bug#74 として報告されました。
http://www.pgpool.net/mantisbt/view.php?id=74

* doc: パラレルモードの制限事項を追記しました。VALUES 句を使った複数行の
INSERT はパラレルモードではサポートされていません。(Yugo Nagata) 

* スタンバイノードがダウンしようとしているときに
find_primary_node_repeatedly() が 呼ばれないようにしました。(Tatsuo Ishii)

これによってフェイルオーバの所要時間が短くなります。 bug#75 として報告さ
れ、 パッチを Tatsuo Ishii が編集しました。 
http://www.pgpool.net/mantisbt/view.php?id=75

* レプリケーションモードと拡張プロトコルを組み合わせた場合に、 データ不整合
があったのでこれを修正しました。(Tatsuo Ishii)

JDBC ドライバを使った同時 INSERT で、ノード間でのデータ不整合があるという報
告がありました。 この事象は以下の条件で必ず発生します。

1 レプリケーションモードを使用している
2 拡張プロトコルを使用している
3 parse で作成された portal が bind で再利用される
4 autocommit が on である
5 SERIAL(シーケンス)を使用している

pgpool-II の parse 関数は、クライアントが INSERT (+ 5 の状態)を発行する
と、対象テーブルをロックされていることを 認識しています。しかし、bind 関数
はそれを認識していませんでした。 一度 parse / bind / execute が完了すると、
pgpool は 4 の理由により parse で獲得したロックを解放します。 そして JDBC
は portal を再利用しようとし、ロックを獲得しないまま bind からのサイクルを
開始してしまいます。 その結果、ロックのない INSERT がノード間でのデータ不整
合を引き起こします。 この解決方法としては、bind でテーブルをロックするよう
にしました。

この問題は、たいていのユーザは JDBC を autocommit = off で使っているため
に、 今まで報告されることがありませんでした。off であれば、ユーザが
commit / rollback を発行するまで、 parse によるロックが残存するためです。

この不具合は Steve Kuekes さんにより、[pgpool-general: 2142] で報告されまし
た。
http://www.sraoss.jp/pipermail/pgpool-general/2013-September/002171.html

* クエリキャッシュにおけるメモリ確保サイズの不具合を修正しました。(Tatsuo
Ishii)
execute() において、メモリ確保サイズが一部の場合において小さすぎました。

* クエリキャッシュ + 拡張プロトコルの組み合わせで使っている場合に、
segfault する可能性があったのを 修正しました。(Tatsuo Ishii)

クエリが "cache safe" でないときに、bind_msg->param_offset が Bind() でセッ
トされていませんでした。 しかし Execute() では無条件に
bind_msg->param_offset を使おうとしていました。

この不具合は bug#76 で報告されました。
http://www.pgpool.net/mantisbt/view.php?id=76

* クエリキャッシュの hash index エントリがいっぱいにならないようにしまし
た。(Tatsuo Ishii)

hash index エントリがいっぱいになると、pgpool-II は hash index の残りが少な
くとも 1 つはある前提だったため、 古いキャッシュエントリを再利用できません
でした。 これを改善するために、hash index エントリがいっぱいになったら、再
利用できるキャッシュブロックを 探すようにしました。

この不具合は bug#70 で報告されました。
http://www.pgpool.net/mantisbt/view.php?id=70

* installer: checkEnv() が何もせず必ず 0(成功)を返していました。(Nozomi
Anzai)

* clock hand の不適切なサイズの共有メモリ確保を修正しました。(Tatsuo Ishii)

clock hand のメモリは、sizeof(pool_fsmm_clock_hand) 分確保されており、 この
変数が「static int *pool_fsmm_clock_hand」と定義されていることから、8 バイ
トでした。
しかしこれは誤りで、実際に必要なのは「sizeof(*pool_fsmm_clock_hand)」での
4 バイトでした。

これは Coverity "1111476 Wrong sizeof argument" で発見されました。

* "show pool_status" で memqcache_auto_cache_invalidation が常に 0 と表示さ
れていました。 (Tatsuo Ishii)
この不具合は bug#80 で報告されました。
http://www.pgpool.net/mantisbt/view.php?id=80

* read_password_packet() のエラーメッセージを修正しました。(Tatsuo Ishii)

* watchdog: 一部関数で、引数を指定するのに大きな値そのものを渡さず、そのポ
インタを渡すようにしました。 (Yugo Nagata)

* SSL 要求でのメモリリークを修正しました。(Tatsuo Ishii)

SSL での要求があったとき、pgpool 子プロセスは start up packet の読み込みを
リトライしていました。 しかし子プロセスは、以前の start up packet のメモリ
を解放していませんでした。

これは Coverity "1111443 Resource" で発見されました。

* do_query() がタイムスタンプの書き換えに失敗したとき、メモリリークしていま
した。(Tatsuo Ishii)
この修正のために、free_select_result() で NULL 引数を受け取れるようにしました。
これは Coverity "1111454, 1111455 Resource leak" で発見されました。

* レプリケーションモードでのロードバランスにおける不具合を修正しました。
(Tatsuo Ishii)
load_balance_mode = off のとき、書き込みを関数を使った SELECT はすべての
DB ノードに送られるべきでした。

これは [pgpool-general: 2221] で報告されました。 また、この不具合は 3.3.1
で混入しました。
http://www.sraoss.jp/pipermail/pgpool-general/2013-October/002250.html

* watchdog: ping 結果を格納する文字列で、終端に NULL 文字を追加しました。
(Yugo Nagata)

* "DEALLOCATE portal|statement" 実行時の対象ノードの選定ロジックを修正しま
した。(Tatsuo Ishii)

"DEALLOCATE portal|statement" 実行時、最後の prepared statement や portal
が見つからない場合に、 対象ノード選定マップがセットされていませんでした。
おそらく、そうした場合はエラーなので、実際には問題ありません。

これは Coverity "1111491 Structurally dead code" で発見されました。

* MAX_NUM_BACKENDS の範囲チェックにおける不具合を修正しました。 (Tatsuo Ishii)

MAX_NUM_BACKENDS は DB ノードの最大数が限界値でした(現時点では 128)。 実
際には 128 の DB ノードで試す人がいなかったために、発見されなかった不具合の
ようです。

これは Coverity "1111429, 1111430 and 1111431 Out-of-bounds write" で発見さ
れました。

* フロントエンド接続情報を、すでに無効なバックエンドについて set/unset しな
いようにしました。(Tatsuo Ishii)
この不具合は bug#82 で報告されました。
http://www.pgpool.net/mantisbt/view.php?id=82

* pgpool_catalog への public access を許可していませんでした。

これは、pgpool_catalog がレプリケーションモードで作成されている場合に、
ユーザテーブルにデータを INSERT すると発生します。

この不具合は [pgpool-general-jp: 1229] で報告されました。
http://www.sraoss.jp/pipermail/pgpool-general-jp/2013-November/001228.htm

* doc: trusted_servers に複数のサーバを指定すべきであることを記述しまし
た。 (Yugo Nagata)

* pool_do_auth() のエラーケースで変数を初期化していませんでした。 (Tatsuo Ishii)
有効なバックエンドがいないとき、pgpool は認証フェーズのフロントエンドにご
みの pid を返していました。 実際に、有効なバックエンドがいないために、フロ
ントエンドは認証後に接続することができません。 もちろんこれは問題あるもので
はありません。

これは Coverity "1127331 Uninitialized scalar variable" で発見されました。

* ノード ID を使ったエラーメッセージの発行時に、ノード ID の範囲チェックを
するようにしました。 (Tatsuo Ishii) 
これは Coverity "1111433 "Out-of-bounds read" で発見されました。

* parse_copy_data() でのバッファオーバーランとリソースリークを修正しまし
た。 (Tatsuo Ishii)
これは Coverity "1111427 Out-of-bounds write"、"1111453 Resource leak" で発
見されました。

* CopyDataRaws() で segfault する可能性があったのを修正しました。(Tatsuo
Ishii)
pool_get_id() がエラーを返した場合に VALID_BACKEND が配列外にアクセスしよ
うとしていました。
これは Coverity "1111433 Out-of-bounds read" で発見されました。

* クエリキャッシュ有効 + プロトコルバージョン = 2 の組み合わせでの処理を修
正しました。(Tatsuo Ishii)

プロトコルバージョンが 2 のとき、セッション状態が "idle" である前提でした
が、 実際にはそうではありませんでした。 プロトコルバージョンが 2 の場合はク
エリキャッシュを使用しないことをおすすめします。

これは Coverity "1111488 Uninitialized scalar variable" で発見されました。

* pool_pools() での strftime() の用法を修正しました。(Tatsuo Ishii)

バッファが第 2 引数で期待する値にたいして十分な大きさではありませんでし
た。 実際にはそのような長い値がわたることはなく、問題ないものです。
これは Coverity "1111426 Out-of-bounds access" で発見されました。

* RPM: spec ファイルで、pgpool-II と PostgreSQL のバージョンを指定できるよ
うにしました。(Nozomi Anzai)

* make_persistent_db_connection のリソースリークを修正しました。(Tatsuo
Ishii)

この修正ののために、新しく free_persisten_db_connection_memory 関数を追加し
ました。
これは Coverity #1111468 で発見されました。

* watchdog: RTT が非常に短いときに trusted servers への コネクションチェッ
クに失敗する不具合をを、修正しました。(Yugo Nagata)

* Coverity で見つかったさまざまな不具合を修正しました。(Tatsuo Ishii)


-- 
Nozomi Anzai 


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