Fix 'LruCache' object has no attribute '_on_resize' (#8591)

We need to make sure we are readu for the `set_cache_factor` callback.
This commit is contained in:
Richard van der Hoff 2020-10-19 21:13:50 +01:00 committed by GitHub
parent 34c20493b9
commit 96e7d3c4a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 2 deletions

1
changelog.d/8591.misc Normal file
View File

@ -0,0 +1 @@
Move metric registration code down into `LruCache`.

View File

@ -124,6 +124,10 @@ class LruCache(Generic[KT, VT]):
else: else:
self.max_size = int(max_size) self.max_size = int(max_size)
# register_cache might call our "set_cache_factor" callback; there's nothing to
# do yet when we get resized.
self._on_resize = None # type: Optional[Callable[[],None]]
if cache_name is not None: if cache_name is not None:
metrics = register_cache( metrics = register_cache(
"lru_cache", "lru_cache",
@ -332,7 +336,10 @@ class LruCache(Generic[KT, VT]):
return key in cache return key in cache
self.sentinel = object() self.sentinel = object()
# make sure that we clear out any excess entries after we get resized.
self._on_resize = evict self._on_resize = evict
self.get = cache_get self.get = cache_get
self.set = cache_set self.set = cache_set
self.setdefault = cache_set_default self.setdefault = cache_set_default
@ -383,6 +390,7 @@ class LruCache(Generic[KT, VT]):
new_size = int(self._original_max_size * factor) new_size = int(self._original_max_size * factor)
if new_size != self.max_size: if new_size != self.max_size:
self.max_size = new_size self.max_size = new_size
if self._on_resize:
self._on_resize() self._on_resize()
return True return True
return False return False

View File

@ -19,7 +19,8 @@ from mock import Mock
from synapse.util.caches.lrucache import LruCache from synapse.util.caches.lrucache import LruCache
from synapse.util.caches.treecache import TreeCache from synapse.util.caches.treecache import TreeCache
from .. import unittest from tests import unittest
from tests.unittest import override_config
class LruCacheTestCase(unittest.HomeserverTestCase): class LruCacheTestCase(unittest.HomeserverTestCase):
@ -83,6 +84,11 @@ class LruCacheTestCase(unittest.HomeserverTestCase):
cache.clear() cache.clear()
self.assertEquals(len(cache), 0) self.assertEquals(len(cache), 0)
@override_config({"caches": {"per_cache_factors": {"mycache": 10}}})
def test_special_size(self):
cache = LruCache(10, "mycache")
self.assertEqual(cache.max_size, 100)
class LruCacheCallbacksTestCase(unittest.HomeserverTestCase): class LruCacheCallbacksTestCase(unittest.HomeserverTestCase):
def test_get(self): def test_get(self):