X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0ecbb08536d02433272e62cf1878edd7927f66e1..f53484e4d86933cefdca5ca967658f8ffba200d6:/services/fuse/arvados_fuse/__init__.py diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py index b2a3b2e7a1..b68574c53d 100644 --- a/services/fuse/arvados_fuse/__init__.py +++ b/services/fuse/arvados_fuse/__init__.py @@ -304,18 +304,14 @@ class CollectionDirectory(Directory): def same(self, i): return i['uuid'] == self.collection_locator or i['portable_data_hash'] == self.collection_locator - def new_collection(self, new_collection_object): + def new_collection(self, new_collection_object, coll_reader): self.collection_object = new_collection_object if self.collection_object_file is not None: self.collection_object_file.update(self.collection_object) self.clear() - collection = arvados.CollectionReader( - self.collection_object["manifest_text"], self.api, - self.api.localkeep(), num_retries=self.num_retries) - collection.normalize() - for s in collection.all_streams(): + for s in coll_reader.all_streams(): cwd = self for part in s.name().split('/'): if part != '' and part != '.': @@ -332,33 +328,36 @@ class CollectionDirectory(Directory): return True with llfuse.lock_released: - new_collection_object = self.api.collections().get( - uuid=self.collection_locator - ).execute(num_retries=self.num_retries) + coll_reader = arvados.CollectionReader( + self.collection_locator, self.api, self.api.localkeep(), + num_retries=self.num_retries) + new_collection_object = coll_reader.api_response() or {} + # If the Collection only exists in Keep, there will be no API + # response. Fill in the fields we need. + if 'uuid' not in new_collection_object: + new_collection_object['uuid'] = self.collection_locator if "portable_data_hash" not in new_collection_object: new_collection_object["portable_data_hash"] = new_collection_object["uuid"] + if 'manifest_text' not in new_collection_object: + new_collection_object['manifest_text'] = coll_reader.manifest_text() + coll_reader.normalize() # end with llfuse.lock_released, re-acquire lock if self.collection_object is None or self.collection_object["portable_data_hash"] != new_collection_object["portable_data_hash"]: - self.new_collection(new_collection_object) + self.new_collection(new_collection_object, coll_reader) self.fresh() return True - except apiclient.errors.HttpError as e: - if e.resp.status == 404: - _logger.warn("arv-mount %s: not found", self.collection_locator) - else: - _logger.error("arv-mount %s: error", self.collection_locator) - _logger.exception(detail) + except apiclient.errors.NotFoundError: + _logger.exception("arv-mount %s: error", self.collection_locator) except arvados.errors.ArgumentError as detail: _logger.warning("arv-mount %s: error %s", self.collection_locator, detail) if self.collection_object is not None and "manifest_text" in self.collection_object: _logger.warning("arv-mount manifest_text is: %s", self.collection_object["manifest_text"]) - except Exception as detail: - _logger.error("arv-mount %s: error", self.collection_locator) + except Exception: + _logger.exception("arv-mount %s: error", self.collection_locator) if self.collection_object is not None and "manifest_text" in self.collection_object: _logger.error("arv-mount manifest_text is: %s", self.collection_object["manifest_text"]) - _logger.exception(detail) return False def __getitem__(self, item): @@ -455,8 +454,8 @@ class RecursiveInvalidateDirectory(Directory): super(RecursiveInvalidateDirectory, self).invalidate() for a in self._entries: self._entries[a].invalidate() - except Exception as e: - _logger.exception(e) + except Exception: + _logger.exception() finally: if self.inode == llfuse.ROOT_INODE: llfuse.lock.release() @@ -527,6 +526,8 @@ class ProjectDirectory(Directory): self.project_object = project_object self.project_object_file = None self.uuid = project_object['uuid'] + self._poll = poll + self._poll_time = poll_time def createDirectory(self, i): if collection_uuid_pattern.match(i['uuid']): @@ -674,8 +675,8 @@ class SharedDirectory(Directory): lambda i: i[0], lambda a, i: a.uuid == i[1]['uuid'], lambda i: ProjectDirectory(self.inode, self.inodes, self.api, self.num_retries, i[1], poll=self._poll, poll_time=self._poll_time)) - except Exception as e: - _logger.exception(e) + except Exception: + _logger.exception() class FileHandle(object): @@ -767,6 +768,8 @@ 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_IXUSR | stat.S_IXGRP | stat.S_IXOTH | stat.S_IFDIR + elif isinstance(e, StreamReaderFile): + entry.st_mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | stat.S_IFREG else: entry.st_mode |= stat.S_IFREG @@ -839,8 +842,8 @@ class Operations(llfuse.Operations): except arvados.errors.NotFoundError as e: _logger.warning("Block not found: " + str(e)) raise llfuse.FUSEError(errno.EIO) - except Exception as e: - _logger.exception(e) + except Exception: + _logger.exception() raise llfuse.FUSEError(errno.EIO) def release(self, fh):