backend/access/transam/README
PostgresのコードではWALのサブシステムのことをXLOGと呼ぶ。
WALの基本的な前提は、そのログが記述しているデータページの変更の前に
そのログエントリを永続ストレージに記録させること。
WALによってログをその終わりまで再実行することで、部分的に実行されている
トランザクションが存在しないような一貫性のある状態にすることを保証する。
これを保証するために各データページ(ヒープや、インデックス)はそのページに
適用した最新のXLOGレコードのLSN(log sequence number --- LSN=WALファイルの
オフセットでもある)と共にマークされる。
ページにマークされているLSNのことをpageLSNと呼ぶ。
バッファマネージャがあるダーティページを書き出す前には、少なくとも
そのページのpageLSNまでxlogがフラッシュされていなければならない。
WALの再実行している間、現在のログエントリに記録された変化が既にページに
適用されているかどうかを検出するために、そのページのpageLSNをチェックする。
https://www.sraoss.co.jp/PostgreSQL/Manual/document/9.4/html/runtime-config-wal.html
-
backend/access/transam/
-
xact.c
-
xlog.c
-
xlogfuncs.c
-
xlogreader.c
-
xlogutils.c
-
include/access/
-
xact.h
-
xlog.h
-
xlog_fn.h
-
xlogreader.h
-
xlogutils.h
-
xlogdefs.h
-
xlog_internal.h
backend/access/transam/xlog.c
- ログレコードをWALバッファへ挿入する関数:XLogInsert
- WALバッファの中身をWALファイルへ書き込む関数:XLogFlush(XLogWrite)
- XLogInsertが何回か呼ばれてログレコードがWALバッファに溜められる
- XLogFlush(XLogRecPtr record)で与えられたレコードの位置までWALファイルにフラッシュする
- XLogFlush内部から実際にログレコードを書き込むXLogWrite(XLogwrtRqst WriteRqst, bool flexible)が呼ばれる。XLogFlushはリクエストを作成してこの関数に渡している。
トランザクションログはpg_xlog/に保存される。
コミットログはpg_clog/に保存される。
一つのWALファイルに相当。 pg_xlog/以下に保存される。
一つのファイルサイズはXLOG_SEG_SZで指定される
XLOG_SEG_SZは ./configureにより作成(デフォルトで16MB)
複数のXLOG Blockの集合でできている。
トランザクションログ書き出しの最小単位。LOG_BLCKSZで指定される。
LOG_SEG_SZは./configureにより作成(デフォルトで8KB)
先頭にXLogPageHeaderData(xlog_internal.h)構造体を含む。
XLogPageHeaderDataは実際のレコードのサイズのtotal lenなどを含む。