Skip to content

6-internet/lib:internet 及 proc/fs(父 issue,持续迭代) #170

Description

@miaobyte

父 issue,持续迭代。rwir/rwfunc 用到什么设计什么,不一次性铺开;子任务陆续拆分挂载,进度在本页勾选。

背景

kvspace 里目前只有 vthread(kvlang 虚拟线程,靠 kvlangruntime 解释执行)。真实机器的 proc / fs / exec 无从表示。本大类引入根路径 /internet,把真实机器映射进 KV 树,并让 runtime-rs 从"跑单函数"升级为"vthread 执行器守护进程"。

架构(三层)

1. /internet 命名空间 = kvspace 世界的机器名册

  • 不是 /proc 镜像,只登记参与 kvspace 世界的进程/文件(kvspace 后端 server、deepx op 执行器、op-gpu worker、被 kvlang spawn 的子进程、backing 扩展存储的 tensordata 文件等)。是分布式 kvspace 部署的控制面清单。
  • 路径 schema:
    /internet/{ip}                  @host   locator = ip
    /internet/{ip}/proc/{pid}       @proc   locator = "{ip}/{pid}"
    /internet/{ip}/fs/{path...}     @file / @dir   locator = "{ip}:{path}"
    
  • head 的 kindexpr 一律以 @ 开头。@ 语义:该 key 的真实 xvalue 不属于 kvspace 元存储(kvspace 世界),而在扩展世界(文件系统的文件、GPU 的 tensordata 都不直接存进 kvspace,只存一条元信息)。parse_kindexpr 已把 @ref=2(与 *ref=1 指针并列),本大类为其补明确语义。
  • @ 节点是叶子 handle:body 只存定位串,kvspace 零解析;活数据靠 rwir 实时查询、以文本返回。

2. /lib/internet + internet/proc + internet/fs = runtime-rs 实现的 OS 工具箱

rwir 能力 名册范围:工具能操作任意 proc / 目录,/internet 只登记其中纳入 kvspace 世界的子集。这些 rwir/rwfunc 用到才加,不预先铺一大张表。整个 internet lib 在 runtime-rs(不按 http-纯净 / shell-byteseek 拆分)。

3. runtime-rs = vthread 执行器守护进程

取代旧设计(把 runtime-rs 所有 rwir 的 vthread 指针指向首个 rwir 下):

启动:  self-register /internet/{ip}/proc/{pid} (@proc)
      → 建 /internet/{ip}/proc/{pid}/vthread (stringkeymap, 空)
      → watch /internet/{ip}/proc/{pid}/vthread   ← 唯一驱动源
循环:  watch 命中 → 枚举成员 ·[vid] → 解引用 /vthread/{vid} → 跑 pc 循环 → 完则移除 [vid] → 回到 watch

vthread strkeymap 成员 ·[{vid}] 是指向 /vthread/{vid}* 指针(vthread 树本体位置不变,仍是单一事实源)。派活方只需写指针 + notify。天然支持跨机器分布式执行。

首个具体 rwir:internet/proc·exec(args, envs) -> (exitcode)

同步执行一条命令到结束、返回退出码。不登记 /internet(进程运行完即消失,无持久 handle 需求)。

类型定案(调研后)[?,?]uint8 单个 ragged XValue 三层皆不可实现(详见 调研评论),改为 stringkeymap,成员 = kvlang 原生字符串 []char/utf32(MVP 档)。{..} 字面量零改动直接可用,kvspace/layout 零改动。

  • REGS("internet/proc·exec", 2, 1, "stringkeymap\nstringkeymap\nint64")
  • argsstringkeymap,成员 ·[0]·[1] … 每个一条 arg([]char/utf32),首成员=可执行文件。
  • envsstringkeymap,每成员一条 K=V[]char/utf32);空=继承父进程环境。
  • exitcode:子进程退出码 int64;被信号终止返回 128+signo(对齐 shell 约定),spawn 失败返回 -1

编码:裸字节、和操作系统对齐、零转换(关键)。Linux execve 的 argv/envp 是以 \0 结尾的裸字节数组,内核不施加编码(唯一约束:单 arg 内不含 \0;文件名亦可能非 UTF-8)。故用 uint8(纯字节,不带 char/文本语义)而非 char/utf32(码点)或 char/utf8——最彻底地对齐 OS 字节语义。OS 边界(kvspace→execve)按字节直传,body 即字节,一次 memcpy 无转码。

实现要点:

  • runtime-rs rwir/internet.rsstd::process::Commanduint8 body 本就是 &[u8],用 std::os::unix::ffi::OsStrExt::from_bytes(row) → OsStr.arg()/.env()全程不碰 String/UTF-8 校验,非法字节无损。
  • 整块读args/envs 是 ndarray,须用 rwext 整块读路径(resolve_read 对数组只返首元素),不能用 read0;按第一维切成若干 &[u8] 行。
  • engine 需补 set_kv_int64:现有 set_kv 只编 char/utf32,而 exec 要写 int64 写槽——用 kvspaceTlvEncode("int64", 8B LE, dims=[])
  • 残留转换在调用侧:kvlang 字符串字面量恒 char/utf32,要变成 [?,?]uint8 需 utf32→utf8 字节(发生在语言内部 lower 期,对合法 Unicode 无损,非 OS 边界)。

用法(拟):

rwfunc main() -> () {
    internet/proc·exec({"ls", "-la", "/tmp"}, {}) -> exitcode
    println("exit =", exitcode)
}
main()

类型定案args/envs = stringkeymap,成员 = 原生字符串 []char/utf32·[i] 每成员一条),非单个 ragged ndarray。原因:native rwir 想整块读参数,只有容器(stringkeymap/object)可行——read0 返回容器路径后 list_kv+get_tlv 逐成员读;裸 []uint8/[?,?]uint8ResolveRead 只拿首元素,且 kvspace body 严格矩形、无 ragged offset 表、无 ResolveReadPath{..} 本就 lower 成 stringkeymap 且成员即 []char/utf32零构造缺口;exec 在 Rust 内把成员 utf32 码点无损转 utf8 字节喂 execve(合法 Unicode 无损;非 UTF-8 文件名等边角留待日后保真档 []uint8+string·bytes)。

前置依赖(自底向上,随用到再补)

  • @ kindexpr:确认 @proc 等在 durable/c 的 TLV round-trip 无损;CLI display 显示为 →locator:@proc。(exec 不写 handle,暂不阻塞 exec。)
  • watch 系列增加 ABI(执行器循环需要,exec 不需要):现有 kvspaceWatch(key,target,tick) 是"阻塞到 Get==target"轮询,不适合"成员增删就唤醒";仅 shm 后端 kvspaceShmWatch+kvspaceShmNotify(condvar)接近"等下一次变更"。新增变更通知 ABI,泛化到 durable/fs/redis(一期可先只 shm)。
  • strkeymap 键(执行器循环需要):stringkeymapndim≥1、成员名必须是坐标段 [s0,...]ERR_MAP_COORD);确认 vid 可作 ·[vid] 存取、vthread·*vid 动态键解引用可用。
  • layout:kindexpr 类型位若对 base kind 做白名单校验,需放行 @<class>

子 issue(用到再拆分挂载)

  • 6-internet runtime-rs internet/proc·exec(args,envs)->(exitcode):容器读循环(read0→path→list_kv→逐成员 get_tlv→utf32→utf8→OsStr::from_bytes)+ engine set_kv_int64首个,先做;MVP 零 layout/kvspace 改动)
  • 6-internet(保真档,可选,暂缓)string·bytes(s)->[]uint8 编码 rwir,使成员落为 []uint8 支持非 UTF-8 任意字节
  • ragged [?,?]uint8 kvspace 存储 / ResolveReadPath / 2D 打包 —— 调研判定过度工程,除非未来别处需通用 ragged ndarray
  • 6-internet runtime-rs 执行器循环:启动自注册 + watch vthread strkeymap(取代旧 vthread 指针设计)
  • 0-kvspace watch 系列增加变更通知 ABI(一期 shm,后泛化 durable/redis)
  • 0-kvspace strkeymap 以 vid 作坐标段键 ·[vid] 的存取与动态键解引用验证
  • 0-kvspace @ kindexpr TLV round-trip + CLI display
  • 1-layout kindexpr 类型位放行 @<class>
  • 3-tutorial 15-internet 回归用例

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