X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/fb95d0d2d09c9537f5bdc503e51cf4f091d02c46..34173202861e94dee58ccd5b189983918813d870:/services/fuse/arvados_fuse/__init__.py diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py index 8b734f2433..cf14a3b67e 100644 --- a/services/fuse/arvados_fuse/__init__.py +++ b/services/fuse/arvados_fuse/__init__.py @@ -15,6 +15,9 @@ import arvados.events import re import apiclient import json +import logging + +_logger = logging.getLogger('arvados.arvados_fuse') from time import time from llfuse import FUSEError @@ -123,7 +126,7 @@ class Directory(FreshBase): try: self.update() except apiclient.errors.HttpError as e: - print e + _logger.debug(e) def __getitem__(self, item): self.checkupdate() @@ -179,21 +182,26 @@ class CollectionDirectory(Directory): self.collection_locator = collection_locator def same(self, i): - return i['uuid'] == self.collection_locator + return i['uuid'] == self.collection_locator or i['portable_data_hash'] == self.collection_locator def update(self): - collection = arvados.CollectionReader(arvados.Keep.get(self.collection_locator)) - for s in collection.all_streams(): - cwd = self - for part in s.name().split('/'): - if part != '' and part != '.': - if part not in cwd._entries: - cwd._entries[part] = self.inodes.add_entry(Directory(cwd.inode)) - cwd = cwd._entries[part] - for k, v in s.files().items(): - cwd._entries[k] = self.inodes.add_entry(StreamReaderFile(cwd.inode, v)) - self.fresh() - + try: + collection = arvados.CollectionReader(self.collection_locator) + for s in collection.all_streams(): + cwd = self + for part in s.name().split('/'): + if part != '' and part != '.': + if part not in cwd._entries: + cwd._entries[part] = self.inodes.add_entry(Directory(cwd.inode)) + cwd = cwd._entries[part] + for k, v in s.files().items(): + cwd._entries[k] = self.inodes.add_entry(StreamReaderFile(cwd.inode, v)) + self.fresh() + return True + except Exception as detail: + _logger.debug("arv-mount %s: error: %s", + self.collection_locator, detail) + return False class MagicDirectory(Directory): '''A special directory that logically contains the set of all extant keep @@ -213,19 +221,21 @@ class MagicDirectory(Directory): if k in self._entries: return True try: - if arvados.Keep.get(k): + e = self.inodes.add_entry(CollectionDirectory(self.inode, self.inodes, k)) + if e.update(): + self._entries[k] = e return True else: return False except Exception as e: - #print 'exception keep', e + _logger.debug('arv-mount exception keep %s', e) return False def __getitem__(self, item): - if item not in self._entries: - self._entries[item] = self.inodes.add_entry(CollectionDirectory(self.inode, self.inodes, item)) - return self._entries[item] - + if item in self: + return self._entries[item] + else: + raise KeyError("No collection with id " + item) class TagsDirectory(Directory): '''A special directory that contains as subdirectories all tags visible to the user.''' @@ -248,10 +258,11 @@ class TagsDirectory(Directory): def update(self): tags = self.api.links().list(filters=[['link_class', '=', 'tag']], select=['name'], distinct = True).execute() - self.merge(tags['items'], - lambda i: i['name'], - lambda a, i: a.tag == i, - lambda i: TagDirectory(self.inode, self.inodes, self.api, i['name'], poll=self._poll, poll_time=self._poll_time)) + if "items" in tags: + self.merge(tags['items'], + lambda i: i['name'], + lambda a, i: a.tag == i, + lambda i: TagDirectory(self.inode, self.inodes, self.api, i['name'], poll=self._poll, poll_time=self._poll_time)) class TagDirectory(Directory): '''A special directory that contains as subdirectories all collections visible @@ -297,7 +308,8 @@ class GroupsDirectory(Directory): self._entries[a].invalidate() def update(self): - groups = self.api.groups().list().execute() + groups = self.api.groups().list( + filters=[['group_class','=','project']]).execute() self.merge(groups['items'], lambda i: i['uuid'], lambda a, i: a.uuid == i['uuid'], @@ -467,7 +479,8 @@ class Operations(llfuse.Operations): return entry def lookup(self, parent_inode, name): - #print "lookup: parent_inode", parent_inode, "name", name + _logger.debug("arv-mount lookup: parent_inode %i name %s", + parent_inode, name) inode = None if name == '.': @@ -503,7 +516,7 @@ class Operations(llfuse.Operations): return fh def read(self, fh, off, size): - #print "read", fh, off, size + _logger.debug("arv-mount read %i %i %i", fh, off, size) if fh in self._filehandles: handle = self._filehandles[fh] else: @@ -520,7 +533,7 @@ class Operations(llfuse.Operations): del self._filehandles[fh] def opendir(self, inode): - #print "opendir: inode", inode + _logger.debug("arv-mount opendir: inode %i", inode) if inode in self.inodes: p = self.inodes[inode] @@ -541,14 +554,14 @@ class Operations(llfuse.Operations): return fh def readdir(self, fh, off): - #print "readdir: fh", fh, "off", off + _logger.debug("arv-mount readdir: fh %i off %i", fh, off) if fh in self._filehandles: handle = self._filehandles[fh] else: raise llfuse.FUSEError(errno.EBADF) - #print "handle.entry", handle.entry + _logger.debug("arv-mount handle.entry %s", handle.entry) e = off while e < len(handle.entry):