Frangipani

frangipani是一种分布式的文件系统

缓存一致性

Frangipani使用锁的机制实现缓存一致性:

使得能立即见到修改

当一个节点要缓冲或者修改一个文件时,需要向锁服务器获得锁

image-20220811160506923

而一个节点自身又维护着锁的状态

  • BUSY:锁在忙
  • IDEL: 锁空闲

image-20220811160626997

依靠4种单向消息交付:

  • REQUEST: 请求锁

    • 无人持有该锁,则授予锁
    • 有人持有锁,则对其发送REVOKE等待其释放
  • GRANT:授予锁

  • REVOKE:请求释放锁

    • 当BUSY时,等待处理完再释放
    • 当IDEL时,提交修改的缓冲,然后释放锁
  • RELEASE:释放锁

原子性

Frangipani使用分布式事务来解决原子性

使得不能立即见到修改

在执行一个事务时:

  1. 先获得该事务所需的所有锁
  2. 执行事务
  3. 释放所有锁

Crash Recovery

比较糟糕的情况就是一个节点带着一系列锁崩溃

Frangipani使用预写式日志(WAL: Write ahead log)解决此问题

Frangipani的每个节点都维护一个log,而petal也对每个节点维护一个log

该log使用循环队列,能使用之前无用的空间

在提交一个事务时,节点会将所有相关的操作log写到petal,然后再对具体文件进行修改,WAL为后续其他节点继续完成该事务提供了足够信息

image-20220811174904783

节点在一定时间超时之后,会判定log失败,对完整的log(校验码)重新提交

在恢复提交时不需要持有锁,由版本号来判定(其实就是悲观锁)

Q.E.D.