X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/46efb1e7f49d08095a6a49a4c6aff045c5eb6f16..8b90f80efca772efd2697ffc70d7809c32564171:/services/fuse/arvados_fuse/__init__.py diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py index 6559614f40..71c4ee5a2c 100644 --- a/services/fuse/arvados_fuse/__init__.py +++ b/services/fuse/arvados_fuse/__init__.py @@ -65,7 +65,9 @@ class SafeApi(object): def convertTime(t): - '''Parse Arvados timestamp to unix time.''' + """Parse Arvados timestamp to unix time.""" + if not t: + return 0 try: return calendar.timegm(time.strptime(t, "%Y-%m-%dT%H:%M:%SZ")) except (TypeError, ValueError): @@ -282,6 +284,7 @@ class Directory(FreshBase): n.clear() llfuse.invalidate_entry(self.inode, str(n)) self.inodes.del_entry(oldentries[n]) + llfuse.invalidate_inode(self.inode) self.invalidate() def mtime(self): @@ -300,15 +303,26 @@ class CollectionDirectory(Directory): self.collection_object = None if isinstance(collection, dict): self.collection_locator = collection['uuid'] + self._mtime = convertTime(collection.get('modified_at')) else: self.collection_locator = collection + self._mtime = 0 def same(self, i): return i['uuid'] == self.collection_locator or i['portable_data_hash'] == self.collection_locator + # Used by arv-web.py to switch the contents of the CollectionDirectory + def change_collection(self, new_locator): + """Switch the contents of the CollectionDirectory. Must be called with llfuse.lock held.""" + self.collection_locator = new_locator + self.collection_object = None + self.update() + def new_collection(self, new_collection_object, coll_reader): self.collection_object = new_collection_object + self._mtime = convertTime(self.collection_object.get('modified_at')) + if self.collection_object_file is not None: self.collection_object_file.update(self.collection_object) @@ -329,6 +343,10 @@ class CollectionDirectory(Directory): if self.collection_object is not None and portable_data_hash_pattern.match(self.collection_locator): return True + if self.collection_locator is None: + self.fresh() + return True + with llfuse.lock_released: coll_reader = arvados.CollectionReader( self.collection_locator, self.api, self.api.localkeep(), @@ -350,7 +368,7 @@ class CollectionDirectory(Directory): self.fresh() return True - except apiclient.errors.NotFoundError: + except arvados.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) @@ -378,10 +396,6 @@ class CollectionDirectory(Directory): else: return super(CollectionDirectory, self).__contains__(k) - def mtime(self): - self.checkupdate() - return convertTime(self.collection_object["modified_at"]) if self.collection_object is not None and 'modified_at' in self.collection_object else 0 - class MagicDirectory(Directory): '''A special directory that logically contains the set of all extant keep