log.c static void recover_from_log(void)

トップページ
jupiteroak.hatenablog.com


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

static void recover_from_log(void)
{
  read_head();
  install_trans(); // if committed, copy from log to disk
  log.lh.n = 0;
  write_head(); // clear the log
}

recover_from_log関数は、OSがクラッシュ後から再起動する際に、ログスペースに保存されているブロックをハードディスク上のファイルシステム内に保存します(トランザクション内で管理されていたブロックを復旧させます)。


処理の内容

ハードディスク上にあるログスペースのヘッダーブロックの内容を読み込む

read_head();

read_head関数を呼び出して、ハードディスク上にあるログスペースのヘッダーブロック(ハードディスク上にあるログスペースの先頭ブロック)の内容を、メインメモリ上で管理されているlogheader構造体へ読み込みます。

ハードディスク上にあるログスペースに保存されているブロックをハードディスク上の元の位置に保存する

install_trans();

install_trans関数を呼び出して、ハードディスク上にあるログスペースに保存されているブロックをハードディスク上の元の位置に保存します。
read_head関数で読み込んだヘッダーブロック(logheader構造体)が持つnメンバの値が0の時、この処理は行われません。

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

log.lh.n = 0;

install_trans関数によって、ハードディスク上にあるログスペースに保存されているブロック(トランザクション内で管理されているブロック)の数が0になったので、log.lh.nの値を0で初期化します。

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

write_head();

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