Merge branch '10584-fuse-stop-threads' refs #10584
authorPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 7 Jul 2017 15:27:07 +0000 (11:27 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 7 Jul 2017 15:27:12 +0000 (11:27 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curoverse.com>

1  2 
services/fuse/arvados_fuse/fusedir.py

index 13998223033c2f139085d745cedf067e2137d764,11d26adfb8c61bf01d6f984ca986e5534e977182..30ae6b40e0ae95c751ccaa1b3c0760b623d793c5
@@@ -511,6 -511,8 +511,8 @@@ class CollectionDirectory(CollectionDir
              self.collection.stop_threads()
  
      def clear(self):
+         if self.collection is not None:
+             self.collection.stop_threads()
          super(CollectionDirectory, self).clear()
          self._manifest_size = 0
  
@@@ -677,7 -679,6 +679,7 @@@ class TagsDirectory(Directory)
          self.num_retries = num_retries
          self._poll = True
          self._poll_time = poll_time
 +        self._extra = set()
  
      def want_event_subscribe(self):
          return True
      def update(self):
          with llfuse.lock_released:
              tags = self.api.links().list(
 -                filters=[['link_class', '=', 'tag']],
 -                select=['name'], distinct=True
 +                filters=[['link_class', '=', 'tag'], ["name", "!=", ""]],
 +                select=['name'], distinct=True, limit=1000
                  ).execute(num_retries=self.num_retries)
          if "items" in tags:
 -            self.merge(tags['items'],
 +            self.merge(tags['items']+[{"name": n} for n in self._extra],
                         lambda i: i['name'],
                         lambda a, i: a.tag == i['name'],
                         lambda i: TagDirectory(self.inode, self.inodes, self.api, self.num_retries, i['name'], poll=self._poll, poll_time=self._poll_time))
  
 +    @use_counter
 +    @check_update
 +    def __getitem__(self, item):
 +        if super(TagsDirectory, self).__contains__(item):
 +            return super(TagsDirectory, self).__getitem__(item)
 +        with llfuse.lock_released:
 +            tags = self.api.links().list(
 +                filters=[['link_class', '=', 'tag'], ['name', '=', item]], limit=1
 +            ).execute(num_retries=self.num_retries)
 +        if tags["items"]:
 +            self._extra.add(item)
 +            self.update()
 +        return super(TagsDirectory, self).__getitem__(item)
 +
 +    @use_counter
 +    @check_update
 +    def __contains__(self, k):
 +        if super(TagsDirectory, self).__contains__(k):
 +            return True
 +        try:
 +            self[k]
 +            return True
 +        except KeyError:
 +            pass
 +        return False
 +
  
  class TagDirectory(Directory):
      """A special directory that contains as subdirectories all collections visible