Skip to content

project-metrics: the module-level cache is keyed by a 5-minute bucket and never evicts, so 12001 dead buckets stay resident #2806

Open

Description

@Birfy

Category: defect (audit54 — 只增不减)

core/src/host/project-metrics.js 的共享缓存键里带了 5 分钟时间桶,过期项从不删除。

  • :142 const cache = new Map()(模块级,进程寿)
  • 插入 :246 cacheStore.set(key, { expiresAt: now + ttlMs, value: repositoryValue }),键 :195 ${repo}|${zone}|${Math.floor(now / ttlMs)}
  • 删除点:无。:196 只在 get 后判 expiresAt,过期项原地留着

复现(真跑,本轮输出):连续读 1000 个时间桶

reads: 1000 cache entries: 1000
entries already expired but still held: 1000

量级:每 (repo, zone) 每 5 分钟一个新键 → 288/天;一条约 350 B → ~100 KB/天、~0.7 MB/周,永久。两个仓(FlyBot + Birfy/bot-social)翻倍。

影响:长命进程的常驻内存缓慢上涨,且每个桶都带着一份完整 metric 值。

应该有的测试 core/test/project-metrics.test.js:the shared cache does not keep buckets it can no longer answer —— 跨 N 个桶各读一次后断言 store.size 只保留当前(及相邻)几个桶。

怎么修:set 前先按 expiresAt < now 扫掉过期项(桶数很小,O(n) 可接受);或键里不带桶、改用 expiresAt 驱动的一次性覆盖。

Written-by: Chief
Evidence: audit54, /data/dsh/bot/workspace/audit54/repro/r1-metrics-cache.mjs

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions