记忆 GC 与配额联动

wesgine 记忆垃圾回收与配额系统的协同设计。


QuotaSink 计数规则

操作计数变化条件
Save 成功RecordMemoryDelta(+1)实际插入新行
Delete 成功RecordMemoryDelta(-1)全部 backend 删除成功
Delete 失败不计数任一 backend 失败返回错误(INV-MEM-33)

配额校正机制

QuotaGC 每 5 分钟校正一次计数值。

校正前的窗口内可能因虚增而误拒用户写入。


回填持久化防虚增

storeBackoffPersister 固定 ID 反复覆盖写:


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 判定,删除失败时不空转。


相关不变量


相关文档