Más contenido relacionado
La actualidad más candente (20)
Similar a PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japan 2022 発表資料) (20)
Más de NTT DATA Technology & Innovation (20)
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japan 2022 発表資料)
- 1. © 2022 NTT DATA Corporation 1
PostgreSQL Conference Japan 2022
PostgreSQLのバグとの付き合い方
~バグの調査からコミュニティへの報告、修正パッチ投稿まで~
2022年11月11日
株式会社NTTデータ 藤井 雅雄
- 2. © 2022 NTT DATA Corporation 2
自己紹介
藤井 雅雄
Database Technical Lead @ NTTデータ
データベース研究開発
PostgreSQL 技術支援
PostgreSQLコミッタ
レプリケーション
WAL圧縮
バックアップ進捗確認
pg_bigm(全文検索モジュール) コミッタ
fujii_masao
MasaoFujii
v15に対応済!
- 3. © 2022 NTT DATA Corporation 3
本講演について
講演資料は、NTTデータのSlideShareアカウント上で公開予定です。
https://www.slideshare.net/nttdata-tech
本講演では、PostgreSQLドキュメントにあるバグレポートガイドラインに沿いつつ、
一部主観や実例を交えながら、PostgreSQLのバグとの使い方を説明します。
・ バグだと思ったら ・・・ PostgreSQLのバグの確認方法
・ コミュニティに共有しよう ・・・ バグ報告のやり方
・ 修正パッチを書いてみよう ・・・ パッチ提供と議論
(*) バグレポートガイドライン
https://www.postgresql.jp/document/current/html/bug-reporting.html
- 5. © 2022 NTT DATA Corporation 5
PostgreSQLはバグが少ないと言われることがあるが
2011 Coverity Scan Open Source Integrity Report
不具合密度(1000行あたりの不具合の数)が、
「Linux 2.6: 0.62」>「OSS平均: 0.45」>「PostgreSQL 9.1: 0.21」
https://codezine.jp/article/detail/6436
PostgreSQL開発コミュニティの信頼性に対する姿勢
・ PostgreSQLの信頼性に関するFAQ
https://wiki.postgresql.org/wiki/FAQ/ja#.E4.BF.A1.E9.A0.BC.E6.80.A7.28Reliability.29
我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解しています。
十分テストして、安定したコードに対してバグを最小にしてからリリースするように努めてます。
・ バグレポートガイドライン
https://www.postgresql.jp/document/current/html/bug-reporting.html
最大限の注意を払っても、全てのプラットフォーム、全ての環境でPostgreSQLの機能全てが
正常に動くことは保証できません。
- 6. © 2022 NTT DATA Corporation 6
PostgreSQLにおけるバグとは
バグと見なされるのは、ドキュメントなどで謳っている仕様と実際の挙動が異なるケース
・ 各プログラムが、入力に対して間違った(仕様とは異なる)結果を返却する
・ PostgreSQL提供の各プログラムが、セグメンテーションフォルトなどで意図せずクラッシュする ...など
仕様として謳われていないことを問題報告してもバグとは見なされない
・ 仕様にない(まだサポートされていない)機能が利用できない
・ 各プログラムの実行性能が単に低い ...など
最終的には、バグと見なされるかどうかは、コミュニティ内の議論で決まる
- 7. © 2022 NTT DATA Corporation 7
バグと見なされなかった例
pg_stat_statements: rows not updated for CREATE TABLE AS SELECT statements
https://www.postgresql.org/message-id/flat/1584293755198-0.post%40n3.nabble.com
・ v13で、CREATE TABLE AS SELECTなどのユーティリティコマンドが取り扱った行数が、
pg_stat_statementsのrowsカラムにカウントされない
・ ユーティリティコマンドによるrowsカラムのカウントについて、v13ではドキュメントにそのような仕様がなく、
バグではなく機能不足と見なされて、v13では改修されず、v14で新機能として取り込み
=# CREATE TABLE test AS SELECT * FROM pg_class;
SELECT 387
=# SELECT query, calls, rows FROM pg_stat_statements WHERE query LIKE 'CREATE TABLE test%';
-[ RECORD 1 ]--------------------------------------
query | CREATE TABLE test AS SELECT * FROM pg_class
calls | 1
rows | 0
v13以前では、CREATE TABLE AS SELECTで
387行を取り扱ったのに、rowsカラムは0のまま
- 8. © 2022 NTT DATA Corporation 8
コミュニティの賛同でバグ扱いになることも
Speedup of relation deletes during recovery
https://www.postgresql.org/message-
id/flat/CAHGQGwHVQkdfDqtvGVkty%2B19cQakAydXn1etGND3X0PHbZ3%2B6w%40mail.gmail.com
・ v11において、同一トランザクション内で複数のリレーションを削除すると、そのリカバリ性能が大幅に劣化
・ この問題は仕様に反しているわけではないが、既存ユーザへの問題の影響などから、
コミュニティ内の複数の開発者がバグ扱いとすることに賛同して、v11にも問題の改修を取り込み
プライマリ スタンバイ
BEGIN;
DROP TABLE tbl01;
DROP TABLE tbl02;
...
COMMIT;
レプリケーション
リカバリ
リカバリ処理が完全停止したように見えるほど、
リカバリ性能が大幅に劣化することがあった
- 9. © 2022 NTT DATA Corporation 9
バグ修正の取り込み
バグ修正は、サポート対象のバージョン(v11~v15)と現在開発中のバージョン(v16dev)に取り込み
※()内は2022年11月11日時点のバージョン
PostgreSQL開発コミュニティは、メジャーバージョンについて初回リリースから約5年間をサポート
サポート終了した古いバージョン
についてはバグ修正されない!
https://www.postgresql.org/support/versioning/
- 10. © 2022 NTT DATA Corporation 10
バグだと思ったら ・・・
PostgreSQLのバグの確認方法
- 11. © 2022 NTT DATA Corporation 11
問題解決の流れ
問題の検知
問題やトラブル、期待通りでない挙動を検知する。
問題の分析や解決に必要な情報を収集する。
問題の切り分け
問題の原因となる誤り・ミス(操作誤り、設定誤り、ドキュメントの読
み違いなど)がないか確認する。
誤り・ミスの確認
問題の原因となる既知バグがないか確認する。
コミュニティへの問題報告などにより未知バグを確認する。
バグの確認
原因に応じた対策を実施して、問題を解決する。
1
2
3
4
問題の解決
5
問題の発生個所を特定する。
PostgreSQL、エクステンション、アプリケーション、OSなど
繰
り
返
し
- 12. © 2022 NTT DATA Corporation 12
既知バグの確認
PostgreSQL開発コミュニティにはバグ管理システムがない
バグ管理システムから、バグの報告内容や関連する議論、バグの対応ステータス(非バグ、未修正、修正対応中、
修正済など)などを確認できない。
PostgreSQLコミュニティの複数の情報源から既知バグかどうか確認する必要がある
1. 各マイナーバージョンのリリースノート
2. ソースレポジトリのコミットログ
3. PostgreSQL開発コミュニティのML
4. 日本PostgreSQLユーザ会のMLやSlackチャンネル
5. PostgreSQL関連ブログ記事など一般サイト
など
- 13. © 2022 NTT DATA Corporation 13
既知バグの確認例
期待する挙動
=# BEGIN;
=*# SAVEPOINT s1;
=*# CREATE TABLE test (i int);
=*# COMMIT AND CHAIN;
=*# INSERT INTO test VALUES (1);
=*# ROLLBACK;
=# SELECT count(*) FROM test;
count
-------
0
(1 row)
v13.1での挙動
=# BEGIN;
=*# SAVEPOINT s1;
=*# CREATE TABLE test (i int);
=*# COMMIT AND CHAIN;
=# INSERT INTO test VALUES (1);
=# ROLLBACK;
WARNING: there is no transaction in progress
=# SELECT count(*) FROM test;
count
-------
1
(1 row)
・ v13.1において、SAVEPOINTがあるトランザクションでCOMMIT AND CHAINを
実行したとき、次のトランザクションが開始されない
・ COMMIT AND CHAINは、現在のトランザクションをコミットして、そのトランザクションと
同じ特性(トランザクション分離レベルなど)で次のトランザクションをすぐに開始するコマンド
既知バグ
の例
- 14. © 2022 NTT DATA Corporation 14
1. リリースノートからの既知バグの確認例
問題が発生したマイナーバージョンの次のバージョンから、最新のマイナーバージョンまで、リリースノートを見て、
問題の修正が含まれていないか確認する。
各マイナーバージョンのリリースノートは、そのメジャーバージョンのドキュメントに含まれる。
例えば、v13.xのリリースノートは、v13のドキュメントから確認できる。
https://www.postgresql.org/docs/13/release.html
今回の例ではv13.1で問題が発生したため、v13.2以降のリリースノートを確認していく。
v13.3のリリースノートに今回の問題のバグ修正を確認できる。
Fix COMMIT AND CHAIN to work correctly when the current transaction has
live savepoints (Fujii Masao)
https://www.postgresql.org/docs/13/release-13-3.html
バグ修正を確認できたマイナーバージョン(今回はv13.3)以降で問題が再現するか確認し、再現しなければ
既知バグと判断できる。
- 15. © 2022 NTT DATA Corporation 15
2. コミットログからの既知バグの確認例
バグ修正のコミットを特定するための検索キーワードを決めて、①~④の方法で確認する。
今回の例では、「commit and chain」や「savepoints」を検索キーワードにする。
① 手元環境にcloneしたgitソースレポジトリからgitコマンドで確認
$ git clone -b REL_13_STABLE git://git.postgresql.org/git/postgresql.git
$ git log --grep="commit and chain" --grep="savepoints" -i --all-match
② PostgreSQLの公式gitソースレポジトリで検索
https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_13_STABLE
③ GitHubにミラーされているPostgreSQLの
gitソースレポジトリで検索
https://github.com/postgres/postgres
④ pgsql-committersのMLで検索
https://www.postgresql.org/search/?m=1
- 16. © 2022 NTT DATA Corporation 16
ML 説明
pgsql-hackers 新機能の提案やバグ修正、開発課題などについて議論する
pgsql-bugs ユーザからのバグ報告先。報告されたバグやその修正などについて議論する
pgsql-docs ドキュメントやその問題、改修などについて議論する
pgsql-committers コミットされた内容が通知される
3. PostgreSQL開発コミュニティのMLからの既知バグの確認例
PostgreSQL開発コミュニティでのコミュニケーションはMLが基本
・ PostgreSQL公式サイトでコミュニティアカウントを作成することでMLを購読できる。
・ バグ修正について議論されやすいMLは以下。
バグ修正の議論を特定するための検索キーワードを決めて、
MLの過去議論検索ページから確認する。
・ 今回の例では、「commit and chain」と「savepoints」を
検索キーワードにする。
https://www.postgresql.org/search/?m=1
検索ページでは、検索キーワード(Search term)、
検索対象のML(List)、検索対象の期間(Date)、
検索結果の表示順(Sort By)を指定できる
- 17. © 2022 NTT DATA Corporation 17
既知バグを確認する各情報源の特徴
項
番
情報源
修正済かつ
リリース済
修正済かつ
未リリース
未修正
(未リリース)
1
各マイナーバージョンの
リリースノート ○
2
ソースレポジトリの
コミットログ ○ ○
3
PostgreSQL
開発コミュニティのML ○ ○ ○
各情報源から確認できるバグの種類
開発者含む専門的なやりとり
具体的な情報
長大な議論
ユーザ向けの記述
概要レベルの情報
簡潔な説明
- 18. © 2022 NTT DATA Corporation 18
各情報源の対応付け
1. リリースノートのソース
https://github.com/postgres/postgres/blob/REL_13_STABLE/doc/src/sgml/release-13.sgml
<!--
Author: Fujii Masao <fujii@postgresql.org>
Branch: master [8a55cb5ba] 2021-02-19 21:57:52 +0900
Branch: REL_13_STABLE [422012c98] 2021-02-19 21:58:43 +0900
Branch: REL_12_STABLE [fadcc4e81] 2021-02-19 21:59:26 +0900
-->
<para>
Fix <command>COMMIT AND CHAIN</command> to work correctly when the
current transaction has live savepoints (Fujii Masao)
</para>
2. コミットログ
$ git show 422012c98
commit 422012c98f8d929f9aa2b2e706b29512f61544e1
Author: Fujii Masao <fujii@postgresql.org>
Date: Fri Feb 19 21:57:52 2021 +0900
Fix bug in COMMIT AND CHAIN command.
(略)
Reported-by: Arthur Nascimento
Author: Fujii Masao
Reviewed-by: Arthur Nascimento, Vik Fearing
Discussion: https://postgr.es/m/16867-3475744069228158@postgresql.org
リリースノートのソースに記載されている、各改修項目
のコミットIDから、対応するコミットログを特定
コミットログに記載されているURLから、
対応するML上の議論を特定
3. ML上の議論
- 19. © 2022 NTT DATA Corporation 19
既知バグの修正の取り込み
バグが修正されたマイナーバージョン(まだ未リリースであればリリースを待ってから)に
アップデートすることで、バグ修正を取り込み
• 既知バグの修正をすべて取り込めるように最新マイナーバージョンへのアップデートも検討する
• ただし、取り込みたいバグ修正以外にも複数の改修項目がマイナーバージョンに含まれるため、必要に
応じてそれらがシステムやアプリケーションに影響しないか確認する必要がある
• PostgreSQL開発コミュニティは、特定のバグ修正を個別パッチとして取り込む方法を提供しない
- 20. © 2022 NTT DATA Corporation 20
コミュニティに共有しよう ・・・
バグ報告のやり方
- 21. © 2022 NTT DATA Corporation 21
問題解決の流れ
問題の検知
問題やトラブル、期待通りでない挙動を検知する。
問題の分析や解決に必要な情報を収集する。
問題の切り分け
問題の原因となる誤り・ミス(操作誤り、設定誤り、ドキュメントの読
み違いなど)がないか確認する。
誤り・ミスの確認
問題の原因となる既知バグがないか確認する。
コミュニティへの問題報告などにより未知バグを確認す
る。
バグの確認
原因に応じた対策を実施して、問題を解決する。
1
2
3
4
問題の解決
5
問題の発生個所を特定する。
PostgreSQL、エクステンション、アプリケーション、OSなど
繰
り
返
し
- 22. © 2022 NTT DATA Corporation 22
バグ報告にあたり
バグレポートガイドライン
PostgreSQLに関してバグを発見した場合、ぜひ我々に連絡してください。
バグレポートはPostgreSQLをより信頼性の高いものにするために、大変重要になります。
・・・
私たちは、すべてのバグを直ちに修正することを約束することはできません。
そのバグが明確で、重大で、あるいは他の多くのユーザにも影響を与えるものであれば、
誰かがすぐに調査する可能性が高くなるでしょう。
・・・
現在計画中の大きな変更が終了するまで、バグを修正できないと判断する場合もあります。
また、単に修正が非常に困難であり、より重要な他の事項があることもあります。
早急に処置が必要な場合は、商用サポートの購入を検討してください。
https://www.postgresql.jp/document/current/html/bug-reporting.html
- 23. © 2022 NTT DATA Corporation 23
バグ報告先
バグ報告先 説明
pgsql-bugs@lists.postgresql.org バグ報告先のML。報告されたバグやその修正などについて議論される
https://www.postgresql.org/acc
ount/submitbug/
バグ報告用Webフォーム。利用にはPostgreSQLコミュニティサイトへのサ
インインが必要。報告内容はpgsql-bugsのMLに送信される
pgsql-docs@lists.postgresql.org ドキュメントのバグ報告先のML。報告されたバグやその修正などについて議
論される
security@postgresql.org セキュリティ問題のバグ報告先の非公開ML。MLには限られたメンバのみ参
加し、バグやその修正などについて非公開で議論される
報告するバグごとに適切な報告先を選ぶ
注意事項
• セキュリティ問題のバグなど公開が望ましくない報告は、pgsql-bugsやpgsql-docsの公開MLにしないこと
• ユーザ向けML(pgsql-generalなど)や開発者向けML(pgsql-hackers)には、基本的にバグ報告しないこと
• MLはモデレータ付のため、メールの配送が遅延する可能性がある
- 24. © 2022 NTT DATA Corporation 24
バグ報告用Webフォーム
https://www.postgresql.org/
https://www.postgresql.org/account/submitbug/
- 25. © 2022 NTT DATA Corporation 25
報告すべきこと
問題やバグについて、事実のみをありのままに報告すること
① 問題を再現できる明確で具体的な手順
② 問題発生時の出力結果そのもの
SQL実行結果、エラーメッセージ、スタックトレースなど
③ どのような挙動や実行結果を期待していたか
④ プログラムに指定したオプションやデフォルトから変更した設定パラメータ値
⑤ PostgreSQLのバージョン
可能であれば最新マイナーバージョンや最新メジャーバージョンで問題が再現するかの情報
⑥ プラットフォーム情報
OSの種類やバージョンなど
PostgreSQL開発者自身が問題を再現できることが、
バグ修正のための最大の一歩!!
- 26. © 2022 NTT DATA Corporation 26
バグ報告例その1
Fix error message for MERGE foreign tables
https://www.postgresql.org/message-id/flat/af88be42757c90e163fc4e27a2e29e0e%40oss.nttdata.com
外部テーブルへの
直のMERGE実行では
期待通りのエラーメッセージ
パーティションテーブル経由の
外部テーブルへの
MERGE実行では
想定外のエラーメッセージ
パーティションテーブルA
テーブル
A2
外部
テーブル
A1
テーブル
A3
MERGE
- 27. © 2022 NTT DATA Corporation 27
バグ報告例その2
Backup command and functions can cause assertion failure and segmentation fault
https://www.postgresql.org/message-id/flat/3374718f-9fbf-a950-6d66-d973e027f44c%40oss.nttdata.com
問題の概要と
バージョン情報
問題の
再現手順
エラーメッセージと
スタックトレース
- 28. © 2022 NTT DATA Corporation 28
バグ報告へのよくある反応と必要な対応
報告の問題をバグとして取り扱うべき根拠などを見直し、改めて説明する。
これは期待通りの挙動で、
バグではありません!
再現手順やその前提となる条件・設定などに漏れ・誤りがないか見直し、
再現手順を改めて提供する。
私の環境では問題を
再現できませんでした。
可能であれば、最新のマイナーバージョンやメジャーバージョンで問題が
再現するか確認した結果を報告する。
最新バージョンでも
問題は再現しますか?
コミュニティWikiに記載の方法で、
問題発生時のスタックトレースを取得して報告する。
https://wiki.postgresql.org/wiki/Generating_a_stack_trace_of_a_PostgreSQL_backend
問題発生時のスタックトレース
を提供してください。
必要な対応
よくある反応
可能であれば、手元にPostgreSQLの開発環境を用意して、
パッチを適用した版で問題が解消するか確認した結果を報告する。
バグ修正パッチを作成しました。
このパッチで問題が解消します
か?
- 29. © 2022 NTT DATA Corporation 29
報告したバグの修正がコミットされると
バグの報告者として名前が
コミットログに掲載される!
以降、バグ修正されたマイナーバージョンがリリースされたら、アップデートすることでバグ修正を取り込み
- 30. © 2022 NTT DATA Corporation 30
修正パッチを書いてみよう ・・・
パッチ提供と議論
- 31. © 2022 NTT DATA Corporation 31
バグ修正パッチを本当に自分が書くべきか?
基本的に、バグ修正パッチの作成はコミュニティの開発者に任せた方が、バグをいち早く確実に解消できる。
バグ修正に関与したい場合も、ML上での技術的な議論への参加やパッチレビューから始めるのがよい。
参考: 「PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)」
https://www.slideshare.net/nttdata-tech/postgresql-global-development-group-postgresql-conference-japan-2021-nttdata
もし書くとしたら
• バグ報告したが、誰も修正パッチを作成してくれないため
• パッチ作成を通じて、PostgreSQLの実装を学びたいため
• バグ修正者としてリリースノートに自分の名前を載せたい
などあるが・・・
- 32. © 2022 NTT DATA Corporation 32
バグ修正パッチの開発の流れ
開発環境準備
バグ解析
パッチ作成
パッチ投稿
1
2
3
4
レビュー対応
5
繰
り
返
し
コミット
6
パッチを作成、適用、コンパイル、テストできる開発環境を準備する
バグ関連のソースを読み、デバッガで動きを追い、バグやその原因を
実装レベルで解析する
バグを修正するパッチを作成して、パッチにより問題が解消すること
を確認する
コミュニティでパッチをレビューして、パッチの不備を改修する
コミッタがバグ修正パッチをPostgreSQLに取り込む
バグの報告とともに修正パッチをコミュニティに投稿する
- 33. © 2022 NTT DATA Corporation 33
デバッガによるバックエンドプロセスの処理実装の確認
① PostgreSQLをデバッガで追いやすいように、--enable-debugとCFLAGS=-O0を指定してコンパイルする。
$ ./configure --prefix=/opt/pgsql --enable-debug --enable-cassert --enable-tap-tests CFLAGS=-O0
$ make -j 4 install
② PostgreSQLを起動して、psqlからPostgreSQLに接続し、バックエンドプロセスのpidを取得する。
$ initdb -D data --no-locale --encoding=UTF8
$ pg_ctl -D data start
$ psql
=# SELECT pg_backend_pid();
③ gdbを起動して、②で取得したpidを指定してバックエンドプロセスにアタッチする。以下ではEmacs経由でgdb実行。
$ emacs &
Emacs内で M-x gdb コマンドでgdbを起動
(gdb) attach <②で取得のpid>
バグ解析
2
VSCodeでデバッグしたい場合は、
発表資料「VSCodeで作るPostgreSQL開発環境」を参考に。
https://www.slideshare.net/nttdata-tech/postgresql-vscode-
development-environment-pgunconf25-nttdata
- 34. © 2022 NTT DATA Corporation 34
デバッガによるバックエンドプロセスの処理実装の確認
④ PostgreSQL内の関数をブレークポイントに設定する。
例えば、SQL実行の起点となるexec_simple_query関数を設定する。
(gdb) b exec_simple_query
⑤ ②で起動のpsqlから、デバッガで処理を追いたいSQLを実行する。
以下ではCOMMIT AND CHAINの処理実装を確認。
=# COMMIT AND CHAIN;
⑥ デバッガをブレークポイントまで進めて、
以降は、gdbのコマンドを使って、処理を1ステップずつ進めたり、変数の内容を調査するなどして処理実装を追っていく。
(gdb) c
(gdb) ...
バグ解析
2
- 35. © 2022 NTT DATA Corporation 35
バグの原因となったコミットの特定
以前は期待通りの挙動で、いつの間にか問題が発生するようになったバグについては、バグを混入させたコミットを特定す
ることで、バグ解析や修正検討の役に立つ。
例えば、以下では、v13.4以降でバグを混入させたコミットをgit bisectで特定する。
① v13のブランチで、git bisectの探索範囲としてv13.4(REL_13_4)から最新(HEAD)までを指定する。
$ git checkout REL_13_STABLE
$ git bisect start HEAD REL_13_4
② バグを試験するスクリプトを用意して、git bisectでバグを混入させたコミットを探索する。
$ git bisect run /PATH_TO/test_script.sh
...
162ade612f1543389bd105fba82ea7e60c5b82c9 is the first bad commit
commit 162ade612f1543389bd105fba82ea7e60c5b82c9
Author: Fujii Masao <fujii@postgresql.org>
Date: Tue Jul 12 11:53:29 2022 +0900
Fix assertion failure and segmentation fault in backup code.
バグ解析
2
PostgreSQLをコンパイル、起動して、
問題を再現させるSQLなどを実行
- 36. © 2022 NTT DATA Corporation 36
パッチを作成するブランチ
バグ修正パッチは、バグを確認したバージョンのブランチではなく、基本的にmasterブランチに対して作成する。
masterブランチへのパッチのコミット時に、コミッタが、バグが存在する他のバージョンへのバックポートを行う。
① masterブランチでソースを最新化して、バグ修正用のブランチを作成する。
$ git checkout master
$ git pull
$ git checkout -b bugfix
② バグを修正して、その修正内容をコミットする。
$ emacs ...
$ git commit -a -m "Fix bug ..."
③ masterブランチからバグ修正用ブランチへのソース差分をパッチとして作成する。
$ git format-patch master
$ ls *.patch
0001-Fix-bug.patch
パッチ作成
3
- 37. © 2022 NTT DATA Corporation 37
互換性の保証
マイナーバージョン間の互換性を保証するため、基本的に、バグ修正パッチは以下を変更してはならない。
• ユーザインタフェース
例えば、コマンドやオプション、設定パラメータなどの名前を変更すること
• システムカタログ
例えば、システム関数を追加・削除するなどしてpg_procなどのシステムカタログを変更すること
• データレイアウト
例えば、ストレージ上のDBデータやWALの物理レイアウトを変更すること
• 通信プロトコル
例えば、ストリーミングレプリケーションのプライマリからスタンバイへのWAL転送プロトコルを変更すること
• ABI (Application Binary Interface)
例えば、エクステンションなどから参照される可能性があるPostgreSQL内部の関数や構造体、変数などについて
名前や構造を変更すること
パッチ作成
3
- 38. © 2022 NTT DATA Corporation 38
ABIの互換性が保証されないと パッチ作成
3
エクステンション pg_exclusive_backup のソース
https://github.com/MasaoFujii/pg_exclusive_backup/blob/main/pg_exclusive_backup.c
PostgreSQL15のソース
https://github.com/postgres/postgres/blob/REL_15_STABLE/src/include/access/xlog.h
https://github.com/postgres/postgres/blob/REL_15_STABLE/src/backend/access/transam/xlog.c
例えば、PostgreSQLの内部関数 do_pg_backup_start() の名前や引数などが変更
されると、その関数を呼んでいるエクステンション pg_exclusive_backup が動かなくなる。
- 39. © 2022 NTT DATA Corporation 39
COMMIT AND CHAINや
SAVEPOINTを含む
テストしたいSQLを登録
テストするSQLの
あるべき実行結果を登録
テストの追加
将来的に同じバグが再度混入しないように、リグレッションテストにバグのテストを追加する。
https://www.postgresql.jp/document/current/html/regress.html
• テストを追加するには、テストしたいSQLとそのあるべき実行結果を登録する。
• リグレッションテストの実行では、登録されているSQLを実行して、その実行結果が登録されているあるべき実行結果と一致
するか確認する。
以下は、COMMIT AND CHAINとSAVEPOINTのバグ修正で追加されたテスト(の一部)
src/test/regress/sql/transactions.sql
+START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE;
+SHOW transaction_isolation;
+SHOW transaction_read_only;
+SHOW transaction_deferrable;
+SAVEPOINT x;
+COMMIT AND CHAIN; -- TBLOCK_SUBCOMMIT
・・・
src/test/regress/expected/transactions.out
+START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE;
+SHOW transaction_isolation;
+ transaction_isolation
+-----------------------
+ repeatable read
+(1 row)
・・・
パッチ作成
3
- 40. © 2022 NTT DATA Corporation 40
バグ修正パッチの投稿はいつでも
2021年度 2022年度
6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11
CF CF CF CF CF
v15開発
v14開発
v16開発
CF CF
Beta / RC
Beta / RC
Feature
Freeze リリース
リリース
コミュニティサポート
CF
CommitFest
パッチレビューに
集中する期間
パッチ投稿
4
- 41. © 2022 NTT DATA Corporation 41
バグ修正パッチのCommitFestへの登録
コミットまで時間がかかりそうな場合は、バグ修正パッチについてコミュニティが忘れてしまわないように、
直近のCommitFestに登録しておく。
https://commitfest.postgresql.org/
パッチ投稿
4
- 43. © 2022 NTT DATA Corporation 43
困ったときは日本のコミュニティで相談も
例えば、ほぼ月1ペースで開催のアンカンファレンスでバグのLTをするなど
- 44. © 2022 NTT DATA Corporation 44
その他、記載されている会社名、商品名、又はサービス名は、
各社の登録商標又は商標です。