10117: Tweak behavior of has_ref(). Fix naming of CacheTest.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 22 Sep 2016 15:38:21 +0000 (11:38 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 22 Sep 2016 15:38:21 +0000 (11:38 -0400)
services/fuse/arvados_fuse/__init__.py
services/fuse/arvados_fuse/fresh.py
services/fuse/arvados_fuse/fusedir.py
services/fuse/tests/test_cache.py
services/fuse/tests/test_inodes.py

index 463a5f7de02759b51813da156a11d7e5429af21e..527e02728bdd711c2deb6ef19573d223c9101e0a 100644 (file)
@@ -146,7 +146,7 @@ class InodeCache(object):
             if obj.in_use():
                 _logger.debug("InodeCache cannot clear inode %i, in use", obj.inode)
                 return
-            if obj.has_ref(only_children=True):
+            if obj.has_ref(True):
                 obj.kernel_invalidate()
                 _logger.debug("InodeCache sent kernel invalidate inode %i", obj.inode)
                 return
index 43f53c9b1d390b95b208fa6a737315fe40e8db5f..e7e91db4279a895cffa23641ef97becc8ca9ffc8 100644 (file)
@@ -115,8 +115,17 @@ class FreshBase(object):
         self.ref_count -= n
         return self.ref_count
 
-    def has_ref(self, only_children=False):
-        return self.ref_count > 0
+    def has_ref(self, only_children):
+        """Determine if there are any kernel references to this
+        object or its children.
+
+        If only_children is True, ignore refcount of self and only consider
+        children.
+        """
+        if only_children:
+            return False
+        else:
+            return self.ref_count > 0
 
     def objsize(self):
         return 0
index 15f75645b9730543e372f6464c7dddff0f89672f..76530844b5724867f1f7c0895c765de63e503460 100644 (file)
@@ -164,11 +164,11 @@ class Directory(FreshBase):
                 return True
         return False
 
-    def has_ref(self, only_children=False):
-        if not only_children and super(Directory, self).has_ref():
+    def has_ref(self, only_children):
+        if super(Directory, self).has_ref(only_children):
             return True
         for v in self._entries.itervalues():
-            if v.has_ref():
+            if v.has_ref(False):
                 return True
         return False
 
index f90c5b0bb89c7a811048bf03a6c73f8f903cfb75..745c6f7b31e744546c5268e9f429283cbcf31eac 100644 (file)
@@ -11,7 +11,7 @@ import unittest
 from .integration_test import IntegrationTest
 from .mount_test_base import MountTestBase
 
-class TmpCollectionTest(IntegrationTest):
+class CacheTest(IntegrationTest):
     mnt_args = ["--by-id", "--directory-cache=0"]
 
     @IntegrationTest.mount(argv=mnt_args)
index 15bd8a9f6b120ec26378fa9f3f46d6cc9594ca43..f9d73b6ef73369d8b5ec956f4714a84d66a6c179 100644 (file)
@@ -108,6 +108,7 @@ class InodeTests(unittest.TestCase):
         cache.touch(ent3)
         self.assertFalse(ent1.clear.called)
         self.assertFalse(ent3.clear.called)
+        self.assertTrue(ent3.kernel_invalidate.called)
         self.assertEqual(1100, cache.total())
 
         # ent1 still in use, ent3 doesn't have ref,