Browse Source

Don't explode if memory has been twiddled

Erik Johnston 3 years ago
parent
commit
bcf8858b67
2 changed files with 16 additions and 6 deletions
  1. 13 0
      synapse/util/caches/__init__.py
  2. 3 6
      synapse/util/caches/lrucache.py

+ 13 - 0
synapse/util/caches/__init__.py

@@ -73,6 +73,19 @@ class CacheMetric:
     def inc_evictions(self, size=1):
         self.evicted_size += size
 
+    def inc_memory_usage(self, memory: int):
+        if self.memory_usage is None:
+            self.memory_usage = 0
+
+        self.memory_usage += memory
+
+    def dec_memory_usage(self, memory: int):
+        self.memory_usage -= memory
+
+    def clear_memory_usage(self, memory: int):
+        if self.memory_usage is not None:
+            self.memory_usage = 0
+
     def describe(self):
         return []
 

+ 3 - 6
synapse/util/caches/lrucache.py

@@ -172,9 +172,6 @@ class LruCache(Generic[KT, VT]):
                 self,
                 collect_callback=metrics_collection_callback,
             )  # type: Optional[CacheMetric]
-
-            if TRACK_MEMORY_USAGE and metrics:
-                metrics.memory_usage = 0
         else:
             metrics = None
 
@@ -228,7 +225,7 @@ class LruCache(Generic[KT, VT]):
                 cached_cache_len[0] += size_callback(node.value)
 
             if TRACK_MEMORY_USAGE and metrics:
-                metrics.memory_usage += node.memory
+                metrics.inc_memory_usage(node.memory)
 
         def move_node_to_front(node):
             prev_node = node.prev_node
@@ -258,7 +255,7 @@ class LruCache(Generic[KT, VT]):
             node.callbacks.clear()
 
             if TRACK_MEMORY_USAGE and metrics:
-                metrics.memory_usage -= node.memory
+                metrics.dec_memory_usage(node.memory)
 
             return deleted_len
 
@@ -379,7 +376,7 @@ class LruCache(Generic[KT, VT]):
                 cached_cache_len[0] = 0
 
             if TRACK_MEMORY_USAGE and metrics:
-                metrics.memory_usage = 0
+                metrics.clear_memory_usage()
 
         @synchronized
         def cache_contains(key: KT) -> bool: