Skip to content

Conversation

@sauerdaniel
Copy link
Contributor

@sauerdaniel sauerdaniel commented Jan 17, 2026

Summary

Add a bounded LRU (Least Recently Used) cache utility with eviction callbacks to prevent unbounded memory growth.

Fixes #9143

Problem

Several places in the codebase use unbounded Map objects for caching:

  • Instance cache in project/instance.ts
  • Provider SDK cache in provider/provider.ts

These can grow without limit in long-running processes or when handling many directories/providers.

Solution

Add a reusable createLruCache utility that:

  • Limits cache size with maxEntries option
  • Evicts least-recently-used entries when full
  • Provides onEvict callback for cleanup logic
  • Maintains Map-like interface for easy adoption

Changes

  • packages/opencode/src/util/cache.ts - New LRU cache utility with:
    • maxEntries limit (default: Infinity for backward compatibility)
    • onEvict callback for disposal logic
    • LRU tracking via lastAccess timestamp
    • Iterator support for for...of loops

Testing

  • TypeScript compilation passes (bun turbo typecheck)
  • Unit tests pass (725 tests, 0 failures)
  • Cache utility has 36% line coverage from existing tests

Note: Manual memory testing (monitoring heap growth over time) was not performed.

Add createLruCache() function with:
- Configurable maxEntries limit to prevent unbounded growth
- Optional onEvict callback for cleanup when entries are removed
- Full Map-like interface (get/set/has/delete/clear/size)
- Iterator support for iterating over entries
@github-actions
Copy link
Contributor

The following comment was made by an LLM, it may be inaccurate:

Based on my search results, I found one potentially related PR:

Related PR:

The current PR (9141) itself appears in the search results as expected. The other results (#1163 on TUI performance, #8535 on pagination, #7036 on tool caching) are less directly related to the LRU cache utility feature.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Memory leak: LSP client diagnostics and files maps not cleared on shutdown

1 participant