part 5 修复 2:默认 dispatch 在只读 /app 下建不了 worktree——workspace 绑定 /app/work
RETEST4 新发现 2:make_worktree 把 worktree 建在 HERE/work/ host-worktrees,单元内 HERE=/app 而 /app 是 --bind-ro,带 repo 的默认 dispatch 撞 OSError Errno 30(--no-worktree 的同任务 越过此关、跑到真实 turn)。 二选一取 (a) 给 worktree 一条单元内可写路径:客机 workspace 下的 .chv-worktrees 以可写 --bind 挂到单元内 /app/work 上 (build_nspawn_argv 新增 worktrees_dir 参数,默认 WORKTREE_DIR=/home/chv/workspace/.chv-worktrees;run_cell 起 单元前 _ensure_bind_source 建好该目录并 chown 回 chv)。 取舍: - 不选 (b) 执行器默认 dispatch 带 --no-worktree:worktree 隔离就丢了——任务改动直接落进 repo 本身,多任务同仓互撞, merge/discard/seed-dir 语义全坏;且只修 dispatch,goal/fork 同样调 make_worktree,照样撞 Errno 30。 - (a) 内不选可写 tmpfs:tmpfs 随单元退出即丢 worktree,跨 cell 的 run/merge 续跑找不着工作区;workspace 绑定随客机 磁盘持久化,worktree 语义、隔离与落盘位置(仍是 /app/work/host-worktrees/<任务>)全都不变,也不碰 P2 的 /usr 只读约束。 - bind 必须排在 --bind-ro=/app 之后(nspawn 按顺序挂载,后挂 的才盖住只读子树下的子路径),单测钉住该顺序。 未决(须 RETEST5 真机验证):nspawn 对 --bind 目的路径的 处理(目的不存在时是否自动建挂载点)与挂载叠加顺序只能在 真机上验证,单测只能钉住 argv 形状;本轮不建镜像、不跑真机。 新测试 cloud/tests/test_chv_muse_p2.py::CellPart5WorktreeTest (4 项):可写 bind 在位且在 workspace 下、顺序在 --bind-ro=/app 之后、自定义目录参数生效。
This commit is contained in:
1 parent
39084ce2bf
commit
adc7bf6666
2 files changed
+65
-3
No files matched your search
@@ -854,6 +854,39 @@ class CellPart4ArgvTest(unittest.TestCase):
|
||||
self.assertEqual(net.subnet, "10.200.0.0/24")
|
||||
|
||||
|
||||
class CellPart5WorktreeTest(unittest.TestCase):
|
||||
"""part 5 修复 2(RETEST4 新发现 2):/app/work 以可写 bind
|
||||
盖住只读 /app——默认 dispatch 的 make_worktree 才写得进。"""
|
||||
|
||||
def test_worktree_bind_is_writable_under_workspace(self):
|
||||
argv = CELL.build_nspawn_argv(["true"])
|
||||
self.assertIn(
|
||||
"--bind=/home/chv/workspace/.chv-worktrees:/app/work",
|
||||
argv)
|
||||
# 必须是可写 bind,不是只读绑。
|
||||
self.assertNotIn(
|
||||
"--bind-ro=/home/chv/workspace/.chv-worktrees:/app/work",
|
||||
argv)
|
||||
|
||||
def test_worktree_bind_stacks_after_readonly_app(self):
|
||||
# nspawn 按顺序挂载:work bind 必须在 --bind-ro=/app 之后,
|
||||
# 才能盖住只读子树下的 /app/work。
|
||||
argv = CELL.build_nspawn_argv(["true"])
|
||||
self.assertLess(
|
||||
argv.index("--bind-ro=/app"),
|
||||
argv.index(
|
||||
"--bind=/home/chv/workspace/.chv-worktrees:/app/work"))
|
||||
|
||||
def test_worktree_bind_custom_dir(self):
|
||||
argv = CELL.build_nspawn_argv(["true"],
|
||||
worktrees_dir="/tmp/wt")
|
||||
self.assertIn("--bind=/tmp/wt:/app/work", argv)
|
||||
|
||||
def test_worktree_dir_constant_under_workspace(self):
|
||||
self.assertTrue(
|
||||
CELL.WORKTREE_DIR.startswith(CELL.WORKSPACE + "/"))
|
||||
|
||||
|
||||
class CellFilesTest(unittest.TestCase):
|
||||
"""part 4:单元专属 resolv.conf/hosts 生成。"""
|
||||
|
||||
|
||||
Reference in new issue
Block a user