Files
waf-platform/EdgeNode/internal/utils/bfs/DESIGN.md

2.3 KiB
Raw Blame History

BFS设计

TODO

  • block对指定内容可以压缩比如text/html, text/plain
  • block offset信息可以自动合并
  • 实现bfs/下的所有TODO
  • 系统退出(quit/terminate/kill)时自动关闭文件
  • compact的时候同时compact .b和.m两个文件
  • 实现对可缓存文件尺寸的限制
  • 提前为文件扩展出空间: mFile, bFile
  • FileReader可以重用使用完之后放入Pool但要考虑到数据可能已经变更
    • 读的时候不允许修改相应区域
    • 在compact的时候尤其注意不修改正在Read的区域
  • 记录写入和读取速度,然后下次启动的时候根据写入和读取速度调整相关参数
  • 可以实现缓存数据加密功能
  • 校验mFile可以在文件末尾写入一个特殊标记比如$$$END$$$,下次读取的时候检查此标记是否仍然存在?可能导致写入性能较低
  • IMPORTANT
    • 实现空余空间重复利用:需要保证此块区域没有正在被读
      • 策略单个文件内容写入时先写入最大的Gap写满之后再写入到尾部防止太过零碎
      • delete file的时候记录空闲blocksfreeBlocks
        • 再次被使用的时候减去空闲blocks
    • 实现bFile和mFile的compact、定时器
    • bFile和mFile的corruption检测
      • 增加End Block
    • 增加 openWriter options
    • 增加 opnReader options
    • 在 MetaFile 中实现 HeaderBlocks和BodyBlocks 合并操作
    • 考虑 BlocksFile.Close()中是否要sync()还是简单的close即可这需要corruption检测支持
    • fs.BFilesMap分区管理减少锁
    • 思考把打开BFile和关闭BFile移出锁
    • 完全避免 check status failed: the file closed
      • 增加重试功能?
    • limiter使用fsutils.Limiter

参考文档

设计目标

1亿个文件20TiB文件内容。

目录结构

00/
  a.b - 文件内容
  a.m - 元数据
01/
  ...  

数据结构

文件内容:

block1, block2, ...

元数据:

hash
  modifiedAt
  expiresAt
  status
  fileSize
  headerSize
  bodySize
  [header blocks info]
  [body blocks info]

元数据要点:

  • 单个文件可以放入512个文件

block info:

[fromOffset1, toOffset1 ], [fromOffset2, toOffset2 ], ...