记忆 GC 与配额联动
wesgine 记忆垃圾回收与配额系统的协同设计。
QuotaSink 计数规则
| 操作 | 计数变化 | 条件 |
|---|---|---|
| Save 成功 | RecordMemoryDelta(+1) | 实际插入新行 |
| Delete 成功 | RecordMemoryDelta(-1) | 全部 backend 删除成功 |
| Delete 失败 | 不计数 | 任一 backend 失败返回错误(INV-MEM-33) |
配额校正机制
QuotaGC 每 5 分钟校正一次计数值。
校正前的窗口内可能因虚增而误拒用户写入。
回填持久化防虚增
storeBackoffPersister 固定 ID 反复覆盖写:
SaveUntil先读后写(同值跳过、变更才写)- 清冷却确认 marker 存在才 Delete
- 5 次同值保存仍为 1 行
GC 与配额的关系
GC 触发
├── retentionScore 淘汰
│ └── 删除低分条目
│ └── RecordMemoryDelta(-1) per entry
├── TTL 批淘汰
│ └── gcTTLBatch 单次回收一批
└── 配额超限触发 GC
└── Quotas.MemoryMaxEntries 检查
GC 豁免与配额
GC 豁免条目(IsGCExempt)不被 retentionScore 淘汰。
豁免种类:KindConstraint、KindInstruction、KindEnvironment。
但豁免条目仍占配额。
ClearNamespace 的配额行为
清空命名空间时循环删除至清空(INV-MEM-34):
while hasMore:
batch = list(namespace, limit=500)
for entry in batch:
delete(entry.ID)
RecordMemoryDelta(-1)
带 progressed 判定,删除失败时不空转。
相关不变量
- INV-MEM-33:Delete 失败返回错误不计数
- INV-MEM-34:ClearNamespace 循环至清空
- INV-MEM-26:GC 使用 retentionScore 淘汰
相关文档
- 记忆 GC 详解 →
memory-gc-details.md - Cell 配额 →
cell-quotas.md - 记忆写入管线 →
memory-save-pipeline.md