X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/66088cabf30c5291ad8894e7009d9c9af466c158..HEAD:/services/fuse/tests/test_inodes.py diff --git a/services/fuse/tests/test_inodes.py b/services/fuse/tests/test_inodes.py index 07e6036d08..cc22f521e0 100644 --- a/services/fuse/tests/test_inodes.py +++ b/services/fuse/tests/test_inodes.py @@ -3,15 +3,21 @@ # SPDX-License-Identifier: AGPL-3.0 import arvados_fuse -import mock import unittest import llfuse import logging +from unittest import mock + class InodeTests(unittest.TestCase): + + # The following tests call next(inodes._counter) because inode 1 + # (the root directory) gets special treatment. + def test_inodes_basic(self): cache = arvados_fuse.InodeCache(1000, 4) inodes = arvados_fuse.Inodes(cache) + next(inodes._counter) # Check that ent1 gets added to inodes ent1 = mock.MagicMock() @@ -27,6 +33,7 @@ class InodeTests(unittest.TestCase): def test_inodes_not_persisted(self): cache = arvados_fuse.InodeCache(1000, 4) inodes = arvados_fuse.Inodes(cache) + next(inodes._counter) ent1 = mock.MagicMock() ent1.in_use.return_value = False @@ -48,6 +55,7 @@ class InodeTests(unittest.TestCase): def test_inode_cleared(self): cache = arvados_fuse.InodeCache(1000, 4) inodes = arvados_fuse.Inodes(cache) + next(inodes._counter) # Check that ent1 gets added to inodes ent1 = mock.MagicMock() @@ -68,25 +76,31 @@ class InodeTests(unittest.TestCase): inodes.add_entry(ent3) # Won't clear anything because min_entries = 4 - self.assertEqual(2, len(cache._entries)) + self.assertEqual(2, len(cache._cache_entries)) self.assertFalse(ent1.clear.called) self.assertEqual(1100, cache.total()) # Change min_entries cache.min_entries = 1 - cache.cap_cache() + ent1.parent_inode = None + inodes.cap_cache() + inodes.wait_remove_queue_empty() self.assertEqual(600, cache.total()) self.assertTrue(ent1.clear.called) # Touching ent1 should cause ent3 to get cleared + ent3.parent_inode = None self.assertFalse(ent3.clear.called) - cache.touch(ent1) + inodes.inode_cache.update_cache_size(ent1) + inodes.touch(ent1) + inodes.wait_remove_queue_empty() self.assertTrue(ent3.clear.called) self.assertEqual(500, cache.total()) def test_clear_in_use(self): cache = arvados_fuse.InodeCache(1000, 4) inodes = arvados_fuse.Inodes(cache) + next(inodes._counter) ent1 = mock.MagicMock() ent1.in_use.return_value = True @@ -109,10 +123,12 @@ class InodeTests(unittest.TestCase): ent3.clear.called = False self.assertFalse(ent1.clear.called) self.assertFalse(ent3.clear.called) - cache.touch(ent3) + inodes.touch(ent3) + inodes.wait_remove_queue_empty() self.assertFalse(ent1.clear.called) self.assertFalse(ent3.clear.called) - self.assertFalse(ent3.kernel_invalidate.called) + # kernel invalidate gets called anyway + self.assertTrue(ent3.kernel_invalidate.called) self.assertEqual(1100, cache.total()) # ent1 still in use, ent3 doesn't have ref, @@ -120,14 +136,17 @@ class InodeTests(unittest.TestCase): ent3.has_ref.return_value = False ent1.clear.called = False ent3.clear.called = False - cache.touch(ent3) + ent3.parent_inode = None + inodes.touch(ent3) + inodes.wait_remove_queue_empty() self.assertFalse(ent1.clear.called) self.assertTrue(ent3.clear.called) self.assertEqual(500, cache.total()) def test_delete(self): - cache = arvados_fuse.InodeCache(1000, 4) + cache = arvados_fuse.InodeCache(1000, 0) inodes = arvados_fuse.Inodes(cache) + next(inodes._counter) ent1 = mock.MagicMock() ent1.in_use.return_value = False @@ -147,6 +166,9 @@ class InodeTests(unittest.TestCase): ent1.ref_count = 0 with llfuse.lock: inodes.del_entry(ent1) + inodes.wait_remove_queue_empty() self.assertEqual(0, cache.total()) - cache.touch(ent3) + + inodes.add_entry(ent3) + inodes.wait_remove_queue_empty() self.assertEqual(600, cache.total())