【发布时间】:2018-02-26 07:44:25
【问题描述】:
我正在为远程服务实现 FUSE 文件系统。
当用户打开文件时,我会进行网络调用以获取文件的内容。 It appears 必须通过 GetAttr 报告文件的大小才能打开工作。
为了知道文件的大小,我必须发出网络调用,并且由于在执行ls 时每个条目都会调用GetAttr,所以我担心这种设计(如果用户在目录中执行ls有很多项目,它必须获取所有文件,即使用户不想打开其中任何一个)。
我该如何解决这个问题?我的想法是:
- 使用不依赖于报告大小的较低级别的读取方法?我认为使用
Read而不是Open会有所帮助,但是如果没有尺寸,我就无法使用它。 - 如果我能将来自
Open的GetAttr呼叫与其他呼叫(包括ls)区分开来,我可以仅在需要时发出网络呼叫。
我使用 Go 和 go-fuse,但我认为这无关紧要,因为这是一个通用的 FUSE 问题。
此外,FUSE 文档是非常少的(实际上是缺失的)文档。如果熟悉此事的人能解释一下ls、cd 和cat 的调用流程,那就太好了——按什么顺序调用 FUSE 函数。
比如为什么会有Open和Read。
更新:
我一直在浏览 SSHFS,它被认为是 FUSE 文件系统的规范示例,它似乎也可以通过网络在 getattr 上获取文件:https://github.com/libfuse/sshfs/blob/master/sshfs.c#L3167
你怎么看?
【问题讨论】: