X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6264e41963708efbc19d94a0a4f53e0d53dcb7ad..2dc308e3106090e2a19185e26cff22c6136bb5c4:/services/fuse/arvados_fuse/fusedir.py diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py index a2135b3def..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,6 +335,13 @@ class CollectionDirectory(CollectionDirectoryBase): self.num_retries = num_retries self.collection_record_file = None self.collection_record = None + self._poll = True + try: + 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 + if isinstance(collection_record, dict): self.collection_locator = collection_record['uuid'] self._mtime = convertTime(collection_record.get('modified_at')) @@ -344,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. @@ -435,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 @@ -493,7 +512,8 @@ class TmpCollectionDirectory(CollectionDirectoryBase): def __init__(self, parent_inode, inodes, api_client, num_retries): collection = self.UnsaveableCollection( api_client=api_client, - keep_client=api_client.keep) + keep_client=api_client.keep, + num_retries=num_retries) super(TmpCollectionDirectory, self).__init__( parent_inode, inodes, collection) self.collection_record_file = None @@ -535,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() @@ -603,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 @@ -619,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): @@ -640,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: @@ -668,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: @@ -699,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) @@ -919,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