# erofs + fscache TODO - 共享域(同一个 blob 在多个 erofs 文件系统中共享) + page cache 共享(相同 page cache 在多个 erofs inode 间共享) - 多daemon (目前单 daemon 导致 nfs 和 ondemand 模式无法同时使用) - daemon less - failover - cache 空间管理 - fscache 分发请求 公平,防止饿死 ## 共享域 本质上是让多个 erofs 文件系统共享同一个 volume。因而在 erofs 内部维护一个 volume 的池子。此时 erofs 可以增加一个 -o share_domain=… 挂载参数,每个 share domain 维护一个 volume 池子,在同一个 share domain 内可以共享 bootstrap/blob ## daemon less 1. 一开始所有的 bootstrap/blob 就已经ready 了,所以一开始就不需要 daemon 2. 开始是需要 daemon 的,等到整个 blob 下载完成的时候,daemon 退出 方案: 1. for case 1: 先启动 daemon,只进行一些配置操作,然后马上 kill daemon 2. for case 2: 先启动 daemon,待所有 blob 下载完成的时候,kill daemon 要求:kill daemon 的时候,对应的 cookie 仍然可用,即仍然能够访问对应的缓存文件 现状:在 erofs 实例仍在挂载着的时候,杀掉 daemon,此时该 erofs 的任何 IO 访问都会返回 -ENOBUFS 错误 ``` fscache_begin_operation fscache_begin_cookie_access # if !fscache_cache_is_live(cookie->volume->cache) return false return -ENOBUFS ``` 改造:当 blob 已经完全下载 (CACHEFILES_CONTENT_ALL) 的时候,跳过该检查 ``` fscache_begin_operation fscache_begin_cookie_access # if (!fscache_cache_is_live(cookie->volume->cache) || CACHEFILES_CONTENT_ALL) return false return -ENOBUFS ``` 问题:如何设置 CACHEFILES_CONTENT_ALL choice 1: 用户态设置。daemon 在用户态维护 blob 的缓存状态,全部下载完成的时候,通知内核态设置上 CACHEFILES_CONTENT_ALL choice 2: 内核态设置。内核态在每次将数据写入 blob 的时候,检查 blob 是否已经全部下载,从而设置上 CACHEFILES_CONTENT_ALL