Replay-回放机制

系统重启时,第一个运行的用户进程之前,内核 (init.c fsinit) 会调用 initlog()

逻辑

  1. 读取 Log Header Block。
  2. 检查 n
  3. 如果 n > 0: 说明上次系统在 Commit 之后、Clean 之前崩溃了。
    • 动作: 执行 install_trans()。把日志里的块重新写一遍到目标地址。
    • 清理: 执行 write_head() 清零 n
  4. 如果 n == 0: 说明上次系统干净退出了,或者在 Commit 之前就挂了。啥也不用做。

幂等性 (Idempotence)

Replay 操作必须是幂等的。也就是:重做一次和重做十次,效果是一样的。 因此,无论我们在 Replay 的过程中崩溃多少次,只要最后一次 Replay 成功,文件系统就是一致的。