X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6a731b2dd982f3453db9f5b6fcf6350899da48a8..9fe45eb5ae811c48dcf68d344c9583f5c3f74d11:/services/fuse/arvados_fuse/fusefile.py diff --git a/services/fuse/arvados_fuse/fusefile.py b/services/fuse/arvados_fuse/fusefile.py index cedb4fb451..fce6c9b614 100644 --- a/services/fuse/arvados_fuse/fusefile.py +++ b/services/fuse/arvados_fuse/fusefile.py @@ -8,7 +8,7 @@ import logging import re import time -from fresh import FreshBase, convertTime +from .fresh import FreshBase, convertTime _logger = logging.getLogger('arvados.arvados_fuse') @@ -48,11 +48,12 @@ class File(FreshBase): class FuseArvadosFile(File): """Wraps a ArvadosFile.""" - __slots__ = ('arvfile',) + __slots__ = ('arvfile', '_enable_write') - def __init__(self, parent_inode, arvfile, _mtime): + def __init__(self, parent_inode, arvfile, _mtime, enable_write): super(FuseArvadosFile, self).__init__(parent_inode, _mtime) self.arvfile = arvfile + self._enable_write = enable_write def size(self): with llfuse.lock_released: @@ -70,16 +71,24 @@ class FuseArvadosFile(File): return False def writable(self): - return self.arvfile.writable() + return self._enable_write and self.arvfile.writable() def flush(self): with llfuse.lock_released: if self.writable(): self.arvfile.parent.root_collection().save() + def clear(self): + if self.parent_inode is None: + self.arvfile.fuse_entry = None + self.arvfile = None + class StringFile(File): """Wrap a simple string as a file""" + + __slots__ = ("contents",) + def __init__(self, parent_inode, contents, _mtime): super(StringFile, self).__init__(parent_inode, _mtime) self.contents = contents @@ -88,12 +97,14 @@ class StringFile(File): return len(self.contents) def readfrom(self, off, size, num_retries=0): - return self.contents[off:(off+size)] + return bytes(self.contents[off:(off+size)], encoding='utf-8') class ObjectFile(StringFile): """Wrap a dict as a serialized json object.""" + __slots__ = ("object_uuid",) + def __init__(self, parent_inode, obj): super(ObjectFile, self).__init__(parent_inode, "", 0) self.object_uuid = obj['uuid'] @@ -122,6 +133,9 @@ class FuncToJSONFile(StringFile): The function is called at the time the file is read. The result is cached until invalidate() is called. """ + + __slots__ = ("func",) + def __init__(self, parent_inode, func): super(FuncToJSONFile, self).__init__(parent_inode, "", 0) self.func = func