X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/499d871d59a5c05cf1034580e7c10ba37cefef4a..fea4d2ba4ab741daff3fd17d910b72539a50a447:/services/fuse/arvados_fuse/fusefile.py diff --git a/services/fuse/arvados_fuse/fusefile.py b/services/fuse/arvados_fuse/fusefile.py index 9af341f231..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 @@ -21,12 +22,20 @@ class File(FreshBase): 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 FuseArvadosFile(File): """Wraps a ArvadosFile.""" @@ -39,11 +48,24 @@ class FuseArvadosFile(File): return self.arvfile.size() def readfrom(self, off, size, num_retries=0): - return self.arvfile.readfrom(off, size, num_retries) + 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""" @@ -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