WALの書き方
(1)START_CRIT_SECTIONを実行
(2)ページを更新
(3)ログレコードのデータを作成する
例:
XLogRecDataのdataに更新したデータを設定、lenにdataの長さを設定する。
bufに更新したページを設定、buffer_stdをtrueにする。
(4)XLogInsertでログレコードを書き出す
(5)PageSetLSN, PageSetTLIでページの情報を更新
(6)END_CRIT_SECTIONを実行
(7)write buffer
リカバリ時のreplay処理も作る。
memo
_bt_check_unique
curitemid->lp_flags |= LP_DELETE; SetBufferCommitInfoNeedsSave(buf);
SetBufferCommitInfoNeedsSaveの引数がbufでは正しくないケースがないか?
最初はbufでいいが、次のページ以降をチェックするときはnbufにチェック中のページがセットされるので以下のようにするべきではないか。後で検証すること。
if (nbuf == InvalidBuffer) SetBufferCommitInfoNeedsSave(buf); else SetBufferCommitInfoNeedsSave(nbuf);