From b67c8598d6d4fcc62a8bd921a070cc055cc8e9bb Mon Sep 17 00:00:00 2001 From: Will Miao Date: Thu, 27 Nov 2025 20:04:38 +0800 Subject: [PATCH] feat(metadata): clear stale cache entries when metadata is empty Update metadata registry to remove cache entries when node metadata becomes empty instead of keeping stale data. This prevents accumulation of unused cache entries and ensures cache only contains valid metadata. Added test case to verify cache behavior when LoRA configurations are removed. --- py/metadata_collector/metadata_registry.py | 4 +- .../test_metadata_collector.py | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/py/metadata_collector/metadata_registry.py b/py/metadata_collector/metadata_registry.py index 6e33e806..528f996a 100644 --- a/py/metadata_collector/metadata_registry.py +++ b/py/metadata_collector/metadata_registry.py @@ -196,9 +196,11 @@ class MetadataRegistry: node_metadata[category] = {} node_metadata[category][node_id] = current_metadata[category][node_id] - # Save to cache if we have any metadata for this node + # Save new metadata or clear stale cache entries when metadata is empty if any(node_metadata.values()): self.node_cache[cache_key] = node_metadata + else: + self.node_cache.pop(cache_key, None) def clear_unused_cache(self): """Clean up node_cache entries that are no longer in use""" diff --git a/tests/metadata_collector/test_metadata_collector.py b/tests/metadata_collector/test_metadata_collector.py index 3663f2a9..d53b1a40 100644 --- a/tests/metadata_collector/test_metadata_collector.py +++ b/tests/metadata_collector/test_metadata_collector.py @@ -124,3 +124,40 @@ def test_metadata_registry_caches_and_rehydrates(populated_registry): registry.clear_metadata("promptA") assert "promptA" not in registry.prompt_metadata + + +def test_lora_manager_cache_updates_when_loras_removed(metadata_registry): + import nodes + + class LoraManagerLoader: # type: ignore[too-many-ancestors] + __name__ = "LoraManagerLoader" + + nodes.NODE_CLASS_MAPPINGS["LoraManagerLoader"] = LoraManagerLoader + + prompt_graph = { + "lora_node": {"class_type": "LoraManagerLoader", "inputs": {}}, + } + prompt = SimpleNamespace(original_prompt=prompt_graph) + cache_key = "lora_node:LoraManagerLoader" + + metadata_registry.start_collection("prompt1") + metadata_registry.set_current_prompt(prompt) + metadata_registry.record_node_execution( + "lora_node", + "LoraManagerLoader", + {"loras": [[{"name": "foo", "strength": 0.8, "active": True}]]}, + None, + ) + assert cache_key in metadata_registry.node_cache + + metadata_registry.start_collection("prompt2") + metadata_registry.set_current_prompt(prompt) + metadata_registry.record_node_execution("lora_node", "LoraManagerLoader", {"loras": [[]]}, None) + + assert cache_key not in metadata_registry.node_cache + + metadata_registry.start_collection("prompt3") + metadata_registry.set_current_prompt(prompt) + metadata = metadata_registry.get_metadata("prompt3") + + assert "lora_node" not in metadata[LORAS]