diff --git a/python/sglang/srt/mem_cache/mamba_radix_cache.py b/python/sglang/srt/mem_cache/mamba_radix_cache.py index 81d421613..3ca653872 100644 --- a/python/sglang/srt/mem_cache/mamba_radix_cache.py +++ b/python/sglang/srt/mem_cache/mamba_radix_cache.py @@ -204,6 +204,9 @@ class LRUList: setattr( getattr(node, self.nxt), self.prv, getattr(node, self.prv) ) # node.next.prev = node.prev + # Clear self pointers to break reference cycles among evicted nodes. + setattr(node, self.prv, None) + setattr(node, self.nxt, None) def _get_lru(self) -> Optional[TreeNode]: """ diff --git a/python/sglang/srt/mem_cache/swa_radix_cache.py b/python/sglang/srt/mem_cache/swa_radix_cache.py index 4aa5edc0e..dd76ad37d 100644 --- a/python/sglang/srt/mem_cache/swa_radix_cache.py +++ b/python/sglang/srt/mem_cache/swa_radix_cache.py @@ -157,6 +157,9 @@ class LRUList: setattr( getattr(node, self.nxt), self.prv, getattr(node, self.prv) ) # node.next.prev = node.prev + # Clear self pointers to break reference cycles among evicted nodes. + setattr(node, self.prv, None) + setattr(node, self.nxt, None) def _get_lru(self) -> Optional[TreeNode]: """ diff --git a/python/sglang/srt/mem_cache/unified_radix_cache.py b/python/sglang/srt/mem_cache/unified_radix_cache.py index 2fb7d45f9..d16b41603 100644 --- a/python/sglang/srt/mem_cache/unified_radix_cache.py +++ b/python/sglang/srt/mem_cache/unified_radix_cache.py @@ -124,6 +124,9 @@ class UnifiedLRUList: pt = self._pt node.lru_prev[pt].lru_next[pt] = node.lru_next[pt] node.lru_next[pt].lru_prev[pt] = node.lru_prev[pt] + # Clear self pointers to break reference cycles among evicted nodes. + node.lru_prev[pt] = None + node.lru_next[pt] = None def insert_mru(self, node: UnifiedTreeNode): assert node.id not in self.cache