关于虚拟文件系统的一些新想法

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

云风反思 Ant 引擎虚拟文件系统(vfs)设计,质疑“运行时不变快照”约束的必要性。他提出新方案:vfs 为纯内存动态树,叶节点存 hash 值,可增删改;hash 绑定内存块或本地文件,本地启动时递归计算目录 hash 并绑定,联网时向服务器请求 hash 及内容并缓存。这样 vfs 只负责内存结构,不涉及网络同步。

🔎

延伸解读

从不变快照到动态树:设计约束的反思

云风质疑了vfs必须保持运行时不变快照的约束。原设计借鉴git的Merkle树,用hash代表快照,便于网络同步,但为支持编辑器动态修改而打了补丁。新方案允许vfs在运行时动态增删改,仅存在于内存中,叶节点存储hash值。这消除了不变快照的假设,使vfs更灵活,同时保留了通过hash绑定内容的能力。

hash绑定与本地启动:简化数据管理

新方案中,hash值可绑定内存数据块或本地文件(带时间戳),且同一hash只需绑定一次。本地启动时,递归计算目录hash并绑定,替换根hash即可。联网时,向服务器请求hash及内容并缓存。这样vfs模块只管理内存数据结构,不涉及网络同步,与外部数据存储方式解耦,降低了模块间的耦合度。

潜在优势与待验证问题

新方案使vfs专注于内存树管理,网络同步和本地存储由其他模块处理,可能简化实现并提高灵活性。但文章未讨论动态修改对hash一致性的影响、并发访问控制以及性能开销。这些是实际应用中需要进一步验证和解决的问题。

❓

Q&A

云风对Ant引擎虚拟文件系统(vfs)的原有设计提出了什么质疑?

云风质疑原有设计中“在游戏运行时,游戏程序看到的vfs是一个树结构的不变快照”这一约束是否必要,认为可能不需要这个约束也能用简单方案实现所有功能。

云风提出的vfs新方案中,vfs树结构是如何组织的?

vfs是一个在运行时可以动态增删的树结构,只存在于内存中,不需要持久化。每个叶节点都是一个hash值,可以设置路径path为特定的hash值,如果子目录不存在则自动创建,如果文件已存在则覆盖。

在新方案中,hash值如何与内容绑定?

可以把vfs树中任意一个hash值绑定内容,内容可以是内存数据块或本地文件(加上时间戳)。hash值是数据内容的sha1,所以同一个hash值只可以(也只需要)绑定一次。

程序在本地启动且不连接文件服务器时,vfs如何初始化?

在启动时,递归计算本地文件目录的hash(包括所有文件及子目录),生成一张表,然后用相关api把相关hash全部绑定,再将vfs的根替换为计算好的root hash即可。

如果连接文件服务器,vfs如何获取和缓存数据?

可以向文件服务器请求当前任意path的hash,以及任意hash对应的内容,并在本地cache hash的内容。这个环节和现在已有的实现完全相同。

新方案相比现有方案,vfs模块的职责发生了什么变化?

vfs模块变成了管理一个纯内存数据结构,而不涉及网络同步,和外部数据如何存放于本地文件系统中无关。

🏷️

标签

➡️

继续阅读