父 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")
args:stringkeymap,成员 ·[0]、·[1] … 每个一条 arg([]char/utf32),首成员=可执行文件。
envs:stringkeymap,每成员一条 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.rs,std::process::Command;uint8 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/[?,?]uint8 走 ResolveRead 只拿首元素,且 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 键(执行器循环需要):
stringkeymap 恒 ndim≥1、成员名必须是坐标段 [s0,...](ERR_MAP_COORD);确认 vid 可作 ·[vid] 存取、vthread·*vid 动态键解引用可用。
- layout:kindexpr 类型位若对 base kind 做白名单校验,需放行
@<class>。
子 issue(用到再拆分挂载)
背景
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 部署的控制面清单。@开头。@语义:该 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 下):
vthreadstrkeymap 成员·[{vid}]是指向/vthread/{vid}的*指针(vthread 树本体位置不变,仍是单一事实源)。派活方只需写指针 + notify。天然支持跨机器分布式执行。首个具体 rwir:
internet/proc·exec(args, envs) -> (exitcode)同步执行一条命令到结束、返回退出码。不登记
/internet(进程运行完即消失,无持久 handle 需求)。REGS:("internet/proc·exec", 2, 1, "stringkeymap\nstringkeymap\nint64")args:stringkeymap,成员·[0]、·[1]… 每个一条 arg([]char/utf32),首成员=可执行文件。envs:stringkeymap,每成员一条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 无转码。实现要点:
rwir/internet.rs,std::process::Command;uint8body 本就是&[u8],用std::os::unix::ffi::OsStrExt::from_bytes(row) → OsStr喂.arg()/.env(),全程不碰String/UTF-8 校验,非法字节无损。args/envs是 ndarray,须用 rwext 整块读路径(resolve_read对数组只返首元素),不能用read0;按第一维切成若干&[u8]行。set_kv_int64:现有set_kv只编 char/utf32,而 exec 要写int64写槽——用kvspaceTlvEncode("int64", 8B LE, dims=[])。char/utf32,要变成[?,?]uint8需 utf32→utf8 字节(发生在语言内部 lower 期,对合法 Unicode 无损,非 OS 边界)。用法(拟):
类型定案:
args/envs= stringkeymap,成员 = 原生字符串[]char/utf32(·[i]每成员一条),非单个 ragged ndarray。原因:native rwir 想整块读参数,只有容器(stringkeymap/object)可行——read0返回容器路径后list_kv+get_tlv逐成员读;裸[]uint8/[?,?]uint8走ResolveRead只拿首元素,且 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 无损;CLIdisplay显示为→locator:@proc。(exec 不写 handle,暂不阻塞 exec。)kvspaceWatch(key,target,tick)是"阻塞到Get==target"轮询,不适合"成员增删就唤醒";仅 shm 后端kvspaceShmWatch+kvspaceShmNotify(condvar)接近"等下一次变更"。新增变更通知 ABI,泛化到 durable/fs/redis(一期可先只 shm)。stringkeymap恒ndim≥1、成员名必须是坐标段[s0,...](ERR_MAP_COORD);确认 vid 可作·[vid]存取、vthread·*vid动态键解引用可用。@<class>。子 issue(用到再拆分挂载)
6-internetruntime-rsinternet/proc·exec(args,envs)->(exitcode):容器读循环(read0→path→list_kv→逐成员 get_tlv→utf32→utf8→OsStr::from_bytes)+ engineset_kv_int64(首个,先做;MVP 零 layout/kvspace 改动)6-internet(保真档,可选,暂缓)string·bytes(s)->[]uint8编码 rwir,使成员落为[]uint8支持非 UTF-8 任意字节ragged—— 调研判定过度工程,除非未来别处需通用 ragged ndarray[?,?]uint8kvspace 存储 /ResolveReadPath/ 2D 打包6-internetruntime-rs 执行器循环:启动自注册 + watch vthread strkeymap(取代旧 vthread 指针设计)0-kvspacewatch 系列增加变更通知 ABI(一期 shm,后泛化 durable/redis)0-kvspacestrkeymap 以 vid 作坐标段键·[vid]的存取与动态键解引用验证0-kvspace@kindexpr TLV round-trip + CLI display1-layoutkindexpr 类型位放行@<class>3-tutorial15-internet回归用例