X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c59093180fd92f0d7c6607a49458446212ebd058..fea4d2ba4ab741daff3fd17d910b72539a50a447:/services/fuse/arvados_fuse/fusefile.py diff --git a/services/fuse/arvados_fuse/fusefile.py b/services/fuse/arvados_fuse/fusefile.py index efe31c387c..d09b1f007c 100644 --- a/services/fuse/arvados_fuse/fusefile.py +++ b/services/fuse/arvados_fuse/fusefile.py @@ -1,6 +1,7 @@ import logging import re import json +import llfuse from fresh import FreshBase, convertTime @@ -18,32 +19,53 @@ class File(FreshBase): def size(self): return 0 - def readfrom(self, off, size): + def readfrom(self, off, size, num_retries=0): return '' + def writeto(self, off, size, num_retries=0): + raise Exception("Not writable") + def mtime(self): return self._mtime def clear(self, force=False): return True + def writable(self): + return False + + def flush(self): + pass -class StreamReaderFile(File): - """Wraps a StreamFileReader as a file.""" +class FuseArvadosFile(File): + """Wraps a ArvadosFile.""" - def __init__(self, parent_inode, reader, _mtime): - super(StreamReaderFile, self).__init__(parent_inode, _mtime) - self.reader = reader + def __init__(self, parent_inode, arvfile, _mtime): + super(FuseArvadosFile, self).__init__(parent_inode, _mtime) + self.arvfile = arvfile def size(self): - return self.reader.size() + return self.arvfile.size() - def readfrom(self, off, size): - return self.reader.readfrom(off, size) + def readfrom(self, off, size, num_retries=0): + with llfuse.lock_released: + return self.arvfile.readfrom(off, size, num_retries, exact=True) + + def writeto(self, off, buf, num_retries=0): + with llfuse.lock_released: + return self.arvfile.writeto(off, buf, num_retries) def stale(self): return False + def writable(self): + return self.arvfile.writable() + + def flush(self): + with llfuse.lock_released: + if self.writable(): + self.arvfile.parent.root_collection().save() + class StringFile(File): """Wrap a simple string as a file""" @@ -54,7 +76,7 @@ class StringFile(File): def size(self): return len(self.contents) - def readfrom(self, off, size): + def readfrom(self, off, size, num_retries=0): return self.contents[off:(off+size)] @@ -63,9 +85,15 @@ class ObjectFile(StringFile): def __init__(self, parent_inode, obj): super(ObjectFile, self).__init__(parent_inode, "", 0) - self.uuid = obj['uuid'] + self.object_uuid = obj['uuid'] self.update(obj) - def update(self, obj): + def uuid(self): + return self.object_uuid + + def update(self, obj=None): self._mtime = convertTime(obj['modified_at']) if 'modified_at' in obj else 0 self.contents = json.dumps(obj, indent=4, sort_keys=True) + "\n" + + def persisted(self): + return True