Skip to content

0-kvspace/2-runtime: 句柄缓存(kvspaceResolveRef/GetByRef/SetPartByRef + block_id + forwarding tombstone + 帧级失效) #268

Description

@miaobyte

背景

resolve_path 快速路径(已提交 kvspace-c 639d16c,resolve=1 从 ~12× art_search 降到 1×)之后,稳态每次 key 访问的理论地板已是 1× art_search + 1× DecodeHead(定位 + 验非指针 + 取值)。要再降,只能跳过 root→node 的树下降本身,即缓存句柄。

三判据裁决(profile + art 结构调研已定)

判据 结论 约束
覆盖写迁移? 叶子变量 a 不新增子节点→不 grow,block_id 稳定;但 box 写路径每次 free+alloc,box_offset 会变 可缓存 block_id,不能缓存 box_offset,命中后从节点重读
复用/epoch? 无 epoch/version;block_id 永不复用(不张冠李戴)但 grow 遗弃旧块→静默 stale 必须自建失效,不能靠引擎信号
key 稳定? ✓ 循环内 /vthread/vt0/[d]/a 逐轮字节相同 命中率≈100%,值得做

block_id 换算是乘加两步、位置无关、跨进程/重启有效 → 缓存 block_id 跨 SHM 安全。

设计

新 ABI(不透明句柄):

kvspaceResolveRef(kv, key) -> ref{ block_id, gen }   # 走一次完整下降,建缓存
kvspaceGetByRef(kv, ref, key_fallback, ...)          # 命中: block_id→ptr 一次乘加
kvspaceSetPartByRef(kv, ref, key_fallback, off, ...) #       读 has_value+box_offset,直取

命中校验(无 epoch,用 forwarding tombstone):

  • node grow 搬迁时,旧块写 moved 标记 + 新 block_id;
  • ByRef 命中旧块见 moved → 跟随 forwarding + 刷新 ref;见 has_value=0(被删)→ miss 回退 key;
  • box_offset 不进 ref,命中节点后重读。

kvlang 侧:解析缓存键 = (frame_root, name),帧退出时失效(不能挂帧无关共享 inst,递归会串帧读错值);首次 miss 填 ref,之后直取。

收益:每次访问从「1× art_search + 全下降」→「一次 block_id 乘加 + 读 box_offset」。

风险 / 落地

中高:forwarding tombstone + 帧级失效 + 跨仓 ABI(kvspace-c / kvspace / kvspace-durable / kvlang runtime 四处)。建议先完成 #267再评估此增量收益是否值这个复杂度。

关联 #212#204#203(PC/帧寻址)、kvspace-c #16

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