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がクラッシュ後から再起動する際に、ログスペースに保存されているブロックをハードディスク上のファイルシステム内に保存します(トランザクション内で管理されていたブロックを復旧させます)。
処理の内容
- ハードディスク上にあるログスペースのヘッダーブロックの内容を読み込む
- ハードディスク上にあるログスペースに保存されているブロックをハードディスク上の元の位置に保存する
- メインメモリ上で管理されているlogheader構造体のnメンバを0で初期化する
- ハードディスク上にあるログスペースのヘッダーブロックを最新の状態にする
ハードディスク上にあるログスペースのヘッダーブロックの内容を読み込む
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関数を呼び出します。