log.c static void commit()

トップページ
jupiteroak.hatenablog.com


log.c
https://github.com/mit-pdos/xv6-public/blob/master/log.c#L192

static void commit()
{
  if (log.lh.n > 0) {
    write_log();     // Write modified blocks from cache to log
    write_head();    // Write header to disk -- the real commit
    install_trans(); // Now install writes to home locations
    log.lh.n = 0;
    write_head();    // Erase the transaction from the log
  }
}

commit関数は、ロギングにおけるトランザクションの完了となるコミット処理を行います。


処理の内容

トランザクションの完了となるコミット処理を行う

if (log.lh.n > 0) {
    ...
  }

メインメモリ上で管理されているlogheader構造体のnメンバの値は、トランザクション内で管理されているブロックの数を示しています。
log.lh.nが真となる場合→トランザクション内で管理されているブロックがない場合は、コミット処理を行いません。

トランザクション内で管理されているブロックをハードディスク上のログスペースに保存する

write_log();

write_log関数を呼び出して、トランザクション内で管理されているブロックをハードディスク上のログスペースに保存します。

メインメモリ上で管理されているlogheader構造体の値をハードディスク上にあるログスペースのヘッダーブロックに書き出す

write_head();

write_head関数を呼び出して、メインメモリ上で管理されているlogheader構造体に保存されているデータを、ハードディスク上にあるログスペースのヘッダーブロック(ハードディスク上にあるログスペースの先頭セクタ)に書き出します。
この時点で、トランザクションは実質的に完了しています。

トランザクション内で管理されているブロックをハードディスク上の元の位置に保存する

install_trans();

install_trans関数を呼び出して、トランザクション内で管理されているブロックをハードディスク上の元の位置に保存します。

メインメモリ上で管理されているlogheader構造体のnメンバを0にする

log.lh.n = 0;

トランザクションで管理中になっているブロックがなくなったので、log.lh.nの値を0にします。

ハードディスク上にあるログスペースのヘッダーブロックを最新の状態にする

write_head();

log.lh.nの値を更新したので、ハードディスク上にあるログスペースのヘッダーブロックを最新の状態にするために、write_head関数を呼び出します。