X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b73a5d296669ae58c8cd5a7d2e1aedd19f0c0029..2dc308e3106090e2a19185e26cff22c6136bb5c4:/services/fuse/arvados_fuse/fusedir.py diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py index 093657e71c..3f2bcd5ec2 100644 --- a/services/fuse/arvados_fuse/fusedir.py +++ b/services/fuse/arvados_fuse/fusedir.py @@ -184,6 +184,9 @@ class Directory(FreshBase): def flush(self): pass + def want_event_subscribe(self): + raise NotImplementedError() + def create(self, name): raise NotImplementedError() @@ -317,6 +320,11 @@ class CollectionDirectoryBase(Directory): self.flush() src.flush() + def clear(self, force=False): + r = super(CollectionDirectoryBase, self).clear(force) + self.collection = None + return r + class CollectionDirectory(CollectionDirectoryBase): """Represents the root of a directory tree representing a collection.""" @@ -327,12 +335,12 @@ class CollectionDirectory(CollectionDirectoryBase): self.num_retries = num_retries self.collection_record_file = None self.collection_record = None - self.poll = True + self._poll = True try: - self.poll_time = (api._rootDesc.get('blobSignatureTtl', 60*60*2)/2) + self._poll_time = (api._rootDesc.get('blobSignatureTtl', 60*60*2)/2) except: _logger.debug("Error getting blobSignatureTtl from discovery document: %s", sys.exc_info()[0]) - self.poll_time = 60*60 + self._poll_time = 60*60 if isinstance(collection_record, dict): self.collection_locator = collection_record['uuid'] @@ -351,6 +359,9 @@ class CollectionDirectory(CollectionDirectoryBase): def writable(self): return self.collection.writable() if self.collection is not None else self._writable + def want_event_subscribe(self): + return (uuid_pattern.match(self.collection_locator) is not None) + # Used by arv-web.py to switch the contents of the CollectionDirectory def change_collection(self, new_locator): """Switch the contents of the CollectionDirectory. @@ -442,6 +453,7 @@ class CollectionDirectory(CollectionDirectoryBase): _logger.exception("arv-mount %s: error", self.collection_locator) if self.collection_record is not None and "manifest_text" in self.collection_record: _logger.error("arv-mount manifest_text is: %s", self.collection_record["manifest_text"]) + self.invalidate() return False @use_counter @@ -543,6 +555,9 @@ class TmpCollectionDirectory(CollectionDirectoryBase): def writable(self): return True + def want_event_subscribe(self): + return False + def finalize(self): self.collection.stop_threads() @@ -611,10 +626,11 @@ will appear if it exists. self.inodes.del_entry(e) return True else: + self.inodes.invalidate_entry(self.inode, k) self.inodes.del_entry(e) return False - except Exception as e: - _logger.debug('arv-mount exception keep %s', e) + except Exception as ex: + _logger.debug('arv-mount exception keep %s', ex) self.inodes.del_entry(e) return False @@ -627,6 +643,9 @@ will appear if it exists. def clear(self, force=False): pass + def want_event_subscribe(self): + return not self.pdh_only + class RecursiveInvalidateDirectory(Directory): def invalidate(self): @@ -648,6 +667,9 @@ class TagsDirectory(RecursiveInvalidateDirectory): self._poll = True self._poll_time = poll_time + def want_event_subscribe(self): + return True + @use_counter def update(self): with llfuse.lock_released: @@ -676,6 +698,9 @@ class TagDirectory(Directory): self._poll = poll self._poll_time = poll_time + def want_event_subscribe(self): + return True + @use_counter def update(self): with llfuse.lock_released: @@ -707,6 +732,9 @@ class ProjectDirectory(Directory): self._updating_lock = threading.Lock() self._current_user = None + def want_event_subscribe(self): + return True + def createDirectory(self, i): if collection_uuid_pattern.match(i['uuid']): return CollectionDirectory(self.inode, self.inodes, self.api, self.num_retries, i) @@ -927,3 +955,6 @@ class SharedDirectory(Directory): lambda i: ProjectDirectory(self.inode, self.inodes, self.api, self.num_retries, i[1], poll=self._poll, poll_time=self._poll_time)) except Exception: _logger.exception() + + def want_event_subscribe(self): + return True