mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-19 06:45:50 +00:00
fix: 为 cacheWarningStateBySource Map 设置上限防止内存泄漏
Map 以 querySource 为 key 存储每个来源的缓存命中率历史状态, 但 querySource 类型为 `any`,长时间会话中可能产生大量唯一值, Map 持续增长永不清理。 新增 MAX_SOURCE_ENTRIES = 50 上限,新增条目时若达到上限则 逐出最早插入的条目(Map 按插入顺序迭代)。 同时也新增 _resetCacheWarningStateForTest() 用于测试隔离。 Co-Authored-By: deepseek-v4-pro[1m] <deepseek-ai@claude-code-best.win>
This commit is contained in:
@@ -24,6 +24,12 @@ interface CacheWarningState {
|
|||||||
// 模块级状态,每个 querySource 独立跟踪
|
// 模块级状态,每个 querySource 独立跟踪
|
||||||
const cacheWarningStateBySource = new Map<string, CacheWarningState>()
|
const cacheWarningStateBySource = new Map<string, CacheWarningState>()
|
||||||
|
|
||||||
|
// Limit the number of tracked sources to prevent unbounded Map growth.
|
||||||
|
// querySource strings are effectively unbounded (typed as `any`), so a
|
||||||
|
// long-running session that spawns many subagents could leak memory.
|
||||||
|
// Evict the oldest entry (by insertion order) when the limit is exceeded.
|
||||||
|
const MAX_SOURCE_ENTRIES = 50
|
||||||
|
|
||||||
const DEFAULT_CACHE_THRESHOLD = 80
|
const DEFAULT_CACHE_THRESHOLD = 80
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -81,6 +87,13 @@ export function shouldShowCacheWarning(
|
|||||||
let state = cacheWarningStateBySource.get(querySource)
|
let state = cacheWarningStateBySource.get(querySource)
|
||||||
if (!state) {
|
if (!state) {
|
||||||
state = { lastHitRate: null, lastTimestamp: null }
|
state = { lastHitRate: null, lastTimestamp: null }
|
||||||
|
// Evict oldest entry when at capacity so the Map stays bounded
|
||||||
|
if (cacheWarningStateBySource.size >= MAX_SOURCE_ENTRIES) {
|
||||||
|
const oldestKey = cacheWarningStateBySource.keys().next().value
|
||||||
|
if (oldestKey !== undefined) {
|
||||||
|
cacheWarningStateBySource.delete(oldestKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
cacheWarningStateBySource.set(querySource, state)
|
cacheWarningStateBySource.set(querySource, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,3 +145,10 @@ export function createCacheWarningMessage(info: CacheHitRateInfo): Message {
|
|||||||
isMeta: false,
|
isMeta: false,
|
||||||
} as Message
|
} as Message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the per-source tracking state — only used in tests.
|
||||||
|
*/
|
||||||
|
export function _resetCacheWarningStateForTest(): void {
|
||||||
|
cacheWarningStateBySource.clear()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user