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);