# 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的时候记录空闲blocks:freeBlocks * 再次被使用的时候减去空闲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 ## 参考文档 * (CockroachDB's Storage Layer)[https://www.cockroachlabs.com/docs/stable/architecture/storage-layer] ## 设计目标 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 ], ... ~~~