【问题标题】:How do I prevent caching of my FUSE file?如何防止缓存我的 FUSE 文件?
【发布时间】:2015-12-18 14:25:29
【问题描述】:

如何防止操作系统(或任何正在执行此操作的系统)在我的 FUSE 文件系统中缓存文件的大小/内容?

我制作了一个小型的复制示例,它使用单个文件/foo 创建了一个文件系统。 /foo 的内容每 5 秒更改一次。这是我的 FUSE 文件系统 (sample.py):

import sys
import time
import errno
from stat import S_IFDIR, S_IFREG
from fuse import FUSE, LoggingMixIn, Operations, FuseOSError


class MyFS(LoggingMixIn, Operations):

    now = time.time()

    def getattr(self, path, fh=None):
        if path == '/':
            return dict(st_mode=(S_IFDIR | 0755),
                        st_ctime=self.now,
                        st_mtime=self.now,
                        st_atime=self.now,
                        st_nlink=2)
        elif path == '/foo':
            contents = self.fooContents()
            now = time.time()
            return dict(st_mode=S_IFREG,
                        st_nlink=1,
                        st_size=len(contents),
                        st_ctime=now,
                        st_mtime=now,
                        st_atime=now)
        else:
            raise FuseOSError(errno.ENOENT)

    def readdir(self, path, fh):
        if path == '/':
            return ['.', '..', 'foo']
        else:
            raise FuseOSError(errno.ENOENT)

    def open(self, path, flags):
        return 0

    def read(self, path, size, offset, fh):
        if path == '/foo':
            return self.fooContents()[offset:offset+size]

    def fooContents(self):
        t = int(time.time())
        size = (t / 5) % 10 + 1
        ret = ''
        for i in xrange(size):
            ret += str(i % 10)
        return ret + '\n'


if __name__ == '__main__':
    mountpoint = sys.argv[1]
    FUSE(MyFS(), mountpoint, foreground=True)

如果我每秒cat 内容持续 10 秒,我预计会看到 2 或 3 个不同的内容打印出来,但我会看到相同的内容 10 次:

$ for i in $(seq 1 10); do
>   cat /tmp/dump/foo
>   sleep 1
> done
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789

如果我在捕获文件之前ls -al,我会得到我所期望的:

$ for i in $(seq 1 10); do
>   ls -al /tmp/dump >> /dev/null
>   cat /tmp/dump/foo
>   sleep 1
> done
01234567
01234567
01234567
01234567
012345678
012345678
012345678
012345678
012345678
0123456789

如何在运行第一个 shell 命令时获得第二个 shell 命令的输出?

【问题讨论】:

  • 看起来将direct_io=True 传递给FUSE( 调用会阻止缓存。它似乎可以普遍防止缓存。如果能够防止逐个文件缓存,那就太好了。

标签: python fuse


【解决方案1】:

只要把程序打开这些行

st = fuse.FuseFileInfo()
accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
if (flags & accmode) != os.O_RDONLY:
  return -errno.EACCES
setattr(st,'direct_io',True)
#setattr(st,keep,False)
return st

如果您不需要缓存文件 - 将 direct_io 切换为 True。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2020-11-18
    • 1970-01-01
    相关资源
    最近更新 更多