Fuse driver works for mounting collections and reading files. Tested with jlake...
authorpeter <peter@peter.shell.qr1hi.arvadosapi.com>
Tue, 18 Feb 2014 21:07:37 +0000 (21:07 +0000)
committerpeter <peter@peter.shell.qr1hi.arvadosapi.com>
Tue, 18 Feb 2014 21:07:37 +0000 (21:07 +0000)
sdk/python/arvados/keep.py
sdk/python/bin/arv-mount2

index 5f9a6d916b7839f17e1d3e76a9dd43b3a4c5b1fe..fe62eb79cd6c5b589ee4a7ef19c4809e51ee1463 100644 (file)
@@ -146,15 +146,17 @@ class KeepClient(object):
     def shuffled_service_roots(self, hash):
         if self.service_roots == None:
             self.lock.acquire()
-            keep_disks = api().keep_disks().list().execute()['items']
-            roots = (("http%s://%s:%d/" %
-                      ('s' if f['service_ssl_flag'] else '',
-                       f['service_host'],
-                       f['service_port']))
-                     for f in keep_disks)
-            self.service_roots = sorted(set(roots))
-            logging.debug(str(self.service_roots))
-            self.lock.release()
+            try:
+                keep_disks = api().keep_disks().list().execute()['items']
+                roots = (("http%s://%s:%d/" %
+                          ('s' if f['service_ssl_flag'] else '',
+                           f['service_host'],
+                           f['service_port']))
+                         for f in keep_disks)
+                self.service_roots = sorted(set(roots))
+                logging.debug(str(self.service_roots))
+            finally:
+                self.lock.release()
         seed = hash
         pool = self.service_roots[:]
         pseq = []
index 74683afe0d3a92f006ea0f20d33af068138bceee..c349bdba412fc85b57edc2905a55a5cd19ab1b71 100755 (executable)
@@ -51,13 +51,18 @@ class FileHandle(object):
 
 class Operations(llfuse.Operations):
 
-    def __init__(self, collection):
+    def __init__(self, collection, uid, gid):
         super(Operations, self).__init__()
         #self.api = arvados.api('v1')
 
         # dict of inodes to collection entry
         self._inodes = {}
 
+        self.uid = uid
+        self.gid = gid
+        
+        #print "root_parent", root_parent, "llfuse.ROOT_INODE", llfuse.ROOT_INODE
+
         i = llfuse.ROOT_INODE
         self.root = Directory(i, i)
         self._inodes[i] = self.root
@@ -94,19 +99,21 @@ class Operations(llfuse.Operations):
 
         entry.st_mode = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH
         if isinstance(e, Directory):
-            entry.st_mode |= stat.S_IFDIR
+            entry.st_mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | stat.S_IFDIR
         else:
             entry.st_mode |= stat.S_IFREG
 
         entry.st_nlink = 1
-        entry.st_uid = 0
-        entry.st_gid = 0
+        entry.st_uid = self.uid
+        entry.st_gid = self.gid
         entry.st_rdev = 0
 
         entry.st_size = e.size()
 
-        entry.st_blksize = 512
-        entry.st_blocks = 1
+        entry.st_blksize = 1024
+        entry.st_blocks = e.size()/1024
+        if e.size()/1024 != 0:
+            entry.st_blocks += 1
         entry.st_atime = 0
         entry.st_mtime = 0
         entry.st_ctime = 0
@@ -147,19 +154,21 @@ class Operations(llfuse.Operations):
         return fh
 
     def read(self, fh, off, size):
+        #print "read", fh, off, size
         if fh in self._filehandles:
             handle = self._filehandles[fh]
         else:
             raise llfuse.FUSEError(errno.EBADF)
 
-        with llfuse.lock_released:
-            try:
+        try:
+            with llfuse.lock_released:
                 return handle.entry.reader.readfrom(off, size)
-            except:
-                raise llfuse.FUSEError(errno.EIO)
+        except:
+            raise llfuse.FUSEError(errno.EIO)
 
     def release(self, fh):
-        del self._filehandles[fh]
+        if fh in self._filehandles:
+            del self._filehandles[fh]
 
     def opendir(self, inode):
         #print "opendir: inode", inode
@@ -174,7 +183,11 @@ class Operations(llfuse.Operations):
 
         fh = self._filehandles_counter
         self._filehandles_counter += 1
-        self._filehandles[fh] = FileHandle(fh, [('.', p), ('..', self._inodes[p.parent])] + list(p.entries.items()))
+        if p.parent in self._inodes:
+            parent = self._inodes[p.parent]
+        else:
+            parent = None
+        self._filehandles[fh] = FileHandle(fh, [('.', p), ('..', parent)] + list(p.entries.items()))
         return fh
 
     def readdir(self, fh, off):
@@ -199,22 +212,23 @@ if __name__ == '__main__':
 
     parser = argparse.ArgumentParser(
         description='Mount Keep data under the local filesystem.')
-    parser.add_argument('mountpoint', type=str,
-                        help="""Mount point.""")
-
-    parser.add_argument('--collection', type=str, action='append',
-                        help="""Collection locator""")
+    parser.add_argument('mountpoint', type=str, help="""Mount point.""")
+    parser.add_argument('--collection', type=str, required=True, help="""Collection locator""")
+    parser.add_argument('--debug', action='store_true', help="""Debug mode""")
 
     args = parser.parse_args()
 
     # for testing only!
-    manifest = open('/home/peter/work/arvados/sdk/python/testdata/jlake_manifest').read()
-    
-    operations = Operations(arvados.CollectionReader(manifest))
+    #manifest = open('/home/peter/arvados/sdk/python/testdata/jlake_manifest').read()
+    #operations = Operations(arvados.CollectionReader(manifest), os.getuid(), os.getgid())
 
-    #operations = Operations(arvados.CollectionReader(arvados.Keep.get(args.collection)))
+    operations = Operations(arvados.CollectionReader(arvados.Keep.get(args.collection)), os.getuid(), os.getgid())
     
-    llfuse.init(operations, args.mountpoint, [ b'fsname=keepfuse', 'debug' ])
+    opts = []
+    if args.debug:
+        opts += ['debug']
+
+    llfuse.init(operations, args.mountpoint, opts)
     
     try:
         llfuse.main()