Try   HackMD

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