现象
在 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。
现象
在 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 也不会自动恢复调度。
实测与排除项
SET 128-byte-value; DEL,并读取主副本确认均已不存在。副本 retained 增量约 24.004 MiB,其中 16.25 MiB 可由复制历史块及稀疏索引解释,剩余约 7.754 MiB 与删除后仍保留的 key 索引一致。此差值不是逐类分配器统计,不能单独当作精确 tombstone 字节数。repl-backlog-size临时降至 64 MiB 后,副本立即归还 308.75 MiB 额度;随后对固定 100 个 key 做 6 × 100,000 次 SET/DEL,副本 retained 始终为 7,078,545,464 bytes。两节点 OOM rejection 均为 0。代码依据
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。