[ARVADOS] updated: c2459c6593b1508ad01f64c4a6f91b70b3d80c89
git at public.curoverse.com
git at public.curoverse.com
Mon Feb 17 22:05:16 EST 2014
Summary of changes:
sdk/python/bin/arv-mount2 | 242 +++++++++++++++++++++++++++------------------
1 files changed, 144 insertions(+), 98 deletions(-)
via c2459c6593b1508ad01f64c4a6f91b70b3d80c89 (commit)
from f6fa860739496e94d0e08d21ba19a17c0fbea95a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit c2459c6593b1508ad01f64c4a6f91b70b3d80c89
Author: Peter Amstutz <tetron at cosmos>
Date: Mon Feb 17 22:05:43 2014 -0500
Directory browsing works, working on error handling for file reading.
diff --git a/sdk/python/bin/arv-mount2 b/sdk/python/bin/arv-mount2
index 1030e2b..c0bdbd2 100755
--- a/sdk/python/bin/arv-mount2
+++ b/sdk/python/bin/arv-mount2
@@ -35,6 +35,15 @@ class Directory(object):
def size(self):
return 0
+class File(object):
+ def __init__(self, inode, parent, reader):
+ self.inode = inode
+ self.parent = parent
+ self.reader = reader
+
+ def size(self):
+ return self.reader.size()
+
class FileHandle(object):
def __init__(self, fh, entry):
self.fh = fh
@@ -42,7 +51,7 @@ class FileHandle(object):
class Operations(llfuse.Operations):
- def __init__(self, collection):
+ def __init__(self, collection):
super(Operations, self).__init__()
#self.api = arvados.api('v1')
@@ -56,15 +65,15 @@ class Operations(llfuse.Operations):
for s in collection.all_streams():
cwd = self.root
for part in s.name().split('/'):
- if part != '':
+ if part != '' and part != '.':
if part not in cwd:
i += 1
- cwd[part] = Directory(cwd.inode, i)
+ cwd[part] = Directory(i, cwd.inode)
self._inodes[i] = cwd[part]
cwd = cwd[part]
for k, v in s.files().items():
i += 1
- cwd[k] = v
+ cwd[k] = File(i, cwd.inode, v)
self._inodes[i] = cwd[k]
# dict of inode to filehandle
@@ -72,100 +81,137 @@ class Operations(llfuse.Operations):
self._filehandles_lock = threading.Lock()
self._filehandles_counter = 1
- def access(self, inode, mode, ctx):
- return True
+ def access(self, inode, mode, ctx):
+ return True
- def getattr(self, inode):
- entry = self._inodes[inode]
-
- entry = llfuse.EntryAttributes()
- entry.st_ino = inode
- entry.generation = 0
- entry.entry_timeout = 300
- entry.attr_timeout = 300
-
- entry.st_mode = 0444
- entry.st_nlink = 0
- entry.st_uid = 0
- entry.st_gid = 0
- entry.st_rdev = 0
-
- entry.st_size = entry.size()
-
- entry.st_blksize = 512
- entry.st_blocks = 1
- entry.st_atime = 0
- entry.st_mtime = 0
- entry.st_ctime = 0
-
- return entry
-
- def lookup(self, parent_inode, name):
- inode = None
-
- if name == '.':
- inode = parent_inode
- else:
- if parent_inode in self._inodes:
- p = self._inodes[parent_inode]
- if name == '..':
- inode = p.parent
- elif name in p:
- inode = p[name].inode
-
- if inode != None:
- return self.getattr(inode)
- else:
- raise llfuse.FUSEError(errno.ENOENT)
+ def getattr(self, inode):
+ e = self._inodes[inode]
+
+ entry = llfuse.EntryAttributes()
+ entry.st_ino = inode
+ entry.generation = 0
+ entry.entry_timeout = 300
+ entry.attr_timeout = 300
+
+ entry.st_mode = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH
+ if isinstance(e, Directory):
+ entry.st_mode |= stat.S_IFDIR
+ else:
+ entry.st_mode |= stat.S_IFREG
+
+ entry.st_nlink = 1
+ entry.st_uid = 0
+ entry.st_gid = 0
+ entry.st_rdev = 0
+
+ entry.st_size = e.size()
+
+ entry.st_blksize = 512
+ entry.st_blocks = 1
+ entry.st_atime = 0
+ entry.st_mtime = 0
+ entry.st_ctime = 0
+
+ return entry
+
+ def lookup(self, parent_inode, name):
+ #print "lookup: parent_inode", parent_inode, "name", name
+ inode = None
+
+ if name == '.':
+ inode = parent_inode
+ else:
+ if parent_inode in self._inodes:
+ p = self._inodes[parent_inode]
+ if name == '..':
+ inode = p.parent
+ elif name in p:
+ inode = p[name].inode
+
+ if inode != None:
+ return self.getattr(inode)
+ else:
+ raise llfuse.FUSEError(errno.ENOENT)
-
- def forget(self, inode_list):
- pass
-
-
- def open(self, inode, flags):
- pass
-
- def read(self, fh, off, size):
- pass
-
- def release(self, fh):
- pass
-
- def opendir(self, inode):
- if inode in self._inodes:
- p = self._inodes[inode]
- else:
- raise llfuse.FUSEError(errno.ENOENT)
-
- self._filehandles_lock.lock()
- try:
- fh = self._filehandles_counter
- self._filehandles_counter += 1
- self._filehandles[fh] = FileHandle(fh, p)
- return fh
- finally:
- self._filehandles_lock.unlock()
-
- def readdir(self, fh, off):
- self._filehandles_lock.lock()
- try:
- handle = self._filehandles[fh]
- finally:
- self._filehandles_lock.unlock()
-
- ent = list(handle.entry.entries.items())
- e = off
- while e < len(ent):
- e += 1
- yield (ent[e][0], self.getattr(ent[e][1].inode), e)
-
- def releasedir(self, fh):
- self._filehandles_lock.lock()
- try:
- del self._filehandles[fh]
- finally:
- self._filehandles_lock.unlock()
+ def open(self, inode, flags):
+ if inode in self._inodes:
+ p = self._inodes[inode]
+ else:
+ raise llfuse.FUSEError(errno.ENOENT)
+
+ self._filehandles_lock.acquire()
+ try:
+ fh = self._filehandles_counter
+ self._filehandles_counter += 1
+ self._filehandles[fh] = FileHandle(fh, p)
+ return fh
+ finally:
+ self._filehandles_lock.release()
+
+ def read(self, fh, off, size):
+ self._filehandles_lock.acquire()
+ try:
+ if fh in self._filehandles:
+ handle = self._filehandles[fh]
+ else:
+ raise llfuse.FUSEError(errno.EBADF)
+ finally:
+ self._filehandles_lock.release()
+
+ try:
+ return handle.entry.reader.readfrom(off, size)
+ except:
+ raise llfuse.FUSEError(errno.EPIPE)
+
+ def release(self, fh):
+ self._filehandles_lock.acquire()
+ try:
+ del self._filehandles[fh]
+ finally:
+ self._filehandles_lock.release()
+
+ def opendir(self, inode):
+ #print "opendir: inode", inode
+
+ if inode in self._inodes:
+ p = self._inodes[inode]
+ else:
+ raise llfuse.FUSEError(errno.ENOENT)
+
+ self._filehandles_lock.acquire()
+ try:
+ fh = self._filehandles_counter
+ self._filehandles_counter += 1
+ self._filehandles[fh] = FileHandle(fh, list(p.entries.items()))
+ return fh
+ finally:
+ self._filehandles_lock.release()
+
+ def readdir(self, fh, off):
+ #print "readdir: fh", fh, "off", off
+
+ self._filehandles_lock.acquire()
+ try:
+ if fh in self._filehandles:
+ handle = self._filehandles[fh]
+ else:
+ raise llfuse.FUSEError(errno.EBADF)
+ finally:
+ self._filehandles_lock.release()
+
+ #print "handle.entry", handle.entry
+
+ e = off
+ while e < len(handle.entry):
+ yield (handle.entry[e][0], self.getattr(handle.entry[e][1].inode), e+1)
+ e += 1
+
+ def releasedir(self, fh):
+ self._filehandles_lock.acquire()
+ try:
+ del self._filehandles[fh]
+ finally:
+ self._filehandles_lock.release()
if __name__ == '__main__':
@@ -180,7 +226,7 @@ if __name__ == '__main__':
args = parser.parse_args()
# for testing only!
- manifest = open('/home/peter/work/arvados/sdk/python/testdata/jlake_manifest').read()
+ manifest = open('/home/tetron/work/arvados/sdk/python/testdata/jlake_manifest').read()
operations = Operations(arvados.CollectionReader(manifest))
@@ -191,7 +237,7 @@ if __name__ == '__main__':
try:
llfuse.main()
except:
- llfuse.close(unmount=False)
+ llfuse.close(unmount=True)
raise
llfuse.close()
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list