Skip to content

storage: Meta-managed 模式未调度 Tomb Raider,删除后的 key 索引持续保留 #227

Description

@thweetkomputer

现象

在 main 7b2a3c7 的 4 Data / 2 Group / 3 Meta 测试集群上核对内存额度增长时,发现所有 Data 的 TOMBRAIDER STATUS 均为 mode=off running=0;INFO 的 tomb_raider_rounds 和 tomb_raider_reaped 都为 0。

这是当前代码已有且文档明确写出的限制,不声称是最近的回归:Meta-managed 启动时没有 expiration authority,构造器将 Tomb Raider 设为 OFF,worker 初始化不启动循环,后续取得 Owner authority 也不会自动恢复调度。

实测与排除项

  • 暂停补灌和 SDK 压测后,副本常驻额度在 120 秒观测内保持不变。
  • 在 Group 2 的独立测试 namespace 中,对 10 万个不同 key 执行 SET 128-byte-value; DEL,并读取主副本确认均已不存在。副本 retained 增量约 24.004 MiB,其中 16.25 MiB 可由复制历史块及稀疏索引解释,剩余约 7.754 MiB 与删除后仍保留的 key 索引一致。此差值不是逐类分配器统计,不能单独当作精确 tombstone 字节数。
  • 同一批 key 再写删,增长来自历史缓冲。将该组 repl-backlog-size 临时降至 64 MiB 后,副本立即归还 308.75 MiB 额度;随后对固定 100 个 key 做 6 × 100,000 次 SET/DEL,副本 retained 始终为 7,078,545,464 bytes。两节点 OOM rejection 均为 0。
  • 因此不把这些增长误报为 reservation 泄漏,也不把此前所有 OOM 都归因于 Tomb Raider。正常 backlog 占用和存量数据同样参与额度。实验后容量已恢复原来的 1 GiB,原压测已恢复。

代码依据

  • src/storage/engine/impl.h: 构造器以 options_.expiration_authority_ 决定初始 Tomb Raider mode。
  • src/storage/engine/init.cpp: 仅启动时有 expiration authority 才启动 Tomb Raider loop。
  • src/storage/engine/tomb_raider.cpp: 三阶段扫描证明不再需要后,才 erase tombstone index entry。
  • docs/architecture/04-storage-and-recovery.md、docs/operations/tomb-raider.md: Meta 启动不运行该循环;value 替换为 tombstone 会保留索引槽,真正 erase 后才会收缩。

待解决范围

需要明确并实现 Meta-managed population 的 tombstone 清理调度/生命周期,包括 Owner 获取与撤销、降级、native FULL reset、关闭和副本边界;不能简单启动一个不检查 authority 的永久循环。副本是否允许独立执行本地物理清理,需要单独证明其安全边界。

验收应覆盖持续创建不同 key 后删除时的索引收敛,以及旧磁盘版本不能在重启/角色切换后复活;同时覆盖 FULL/降级过程中正在执行的清理轮次退出。

本地完整证据:lavik-stability/incidents/quota-growth-20260930/(idle samples、probe.jsonl、capped.stdout、源码审计与配置恢复记录)。尚无产品修复 PR。

Activity

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

Metadata

Metadata

Assignees

Labels

needs-triageMaintainer needs to evaluate this issue

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions