[Bug Bash] Guest operations (read/write/shell/MCP) on a deleted or non-existent environment fail with Unimplemented instead of NotFound
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
调研方向
Start in internal/apiservice/wakeretry.go, especially ensureAwake around lines 80–92, and trace how the wake probe handles gRPC status codes and deleting actor state. Reproduce with a deleted or non-existent environment using read, write, shell, or MCP tools/call; finish when these requests report NotFound and deleting actors fail without waiting for the full wake budget.
由索引模型根据 Issue 内容生成。
描述
Summary & Root Cause
Running read, write, shell, or MCP tools/call against a deleted or non-existent environment fails with gRPC code Unimplemented (ate-env: env: rpc error: code = Unimplemented desc = actor ate-env/<id> not found) instead of NotFound (ate-env: env: not found: ...).
Root Cause
- In
internal/apiservice/wakeretry.go:80-89,ensureAwakeprobes the guest viaatenet-routerand assumes any error code other thancodes.Unavailablecame from a live guest:_, err := probe.GetProcess(ctx, &ateenvv1alpha.GetProcessRequest{ProcessId: "ate-env-wake-probe"}) if status.Code(err) != codes.Unavailable { // Anything else, NotFound for the probe id included, came from // the guest itself. return nil } state, serr := s.actorState(ctx, atespace, id) - When an actor does not exist (or has finished deleting),
atenet-routerresponds with a plain HTTP404 Not Found(actor <atespace>/<id> not found) without agrpc-statustrailer. - Per the gRPC over HTTP/2 specification,
grpc-gomaps an HTTP404response withoutgrpc-statustocodes.Unimplemented(12), notcodes.Unavailableorcodes.NotFound. - Because
status.Code(err) == codes.Unimplemented != codes.Unavailable,ensureAwakereturnsnilimmediately without callings.actorState(ctx, atespace, id)(whose doc comment at:122-124explicitly notes: "A deleted environment surfaces here as NotFound (through toGRPCError), which is the right answer to a caller still holding its handle"). - The caller's subsequent RPC (
ReadFile,WriteFile,StartProcess) then hits the same HTTP404fromatenet-routerand surfaces rawcodes.Unimplementedto the client.
Versions
agent-substrate/env:40a6c63(also present onmain@d579fd0)agent-substrate/substrate:ddb46651
Steps to Reproduce
Test Case 1: Read from a deleted environment (Bug Bash Flow — Step 9: Delete)
ate-env create $USER
echo "hello $(date)" | ate-env $USER write /data/note.txt
# Step 9 from the bug bash doc:
ate-env delete $USER
ate-env $USER read /data/note.txt
- Expected: Fails with
NotFound:ate-env: env: not found: environment "chenyiwang" not found - Actual: Fails with
codes.Unimplemented(exit code 1):ate-env: env: rpc error: code = Unimplemented desc = actor ate-env/chenyiwang not found
Test Case 2: Run read, write, or shell on a non-existent environment (Bad Inputs)
ate-env does-not-exist read /data/note.txt
echo "hi" | ate-env does-not-exist write /data/note.txt
ate-env does-not-exist shell 'echo hi'
- Expected: All three commands fail with
NotFound(ate-env: env: not found: ...). - Actual: All three commands fail with
codes.Unimplemented(exit code 1):ate-env: env: rpc error: code = Unimplemented desc = actor ate-env/does-not-exist not found
Test Case 3: Call MCP tools/call on a deleted or non-existent environment
curl -s http://localhost:7777/v1alpha/envs/does-not-exist/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"shell","arguments":{"command":"echo hi"}}}'
- Expected: Error message indicates the environment was not found (
not found). - Actual: Tool result reports
code = Unimplemented:{"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"env: rpc error: code = Unimplemented desc = actor ate-env/does-not-exist not found"}],"isError":true}}
Suggested Fix
- In
ensureAwake(internal/apiservice/wakeretry.go:80-89), do not treatcodes.Unimplementedfrom the wake probe as a live guest response (sinceatenet-routerreturns HTTP 404 ->codes.Unimplementedwhen the target actor is unknown, andGetProcessis implemented byate-env-guest), or fall through tos.actorState(ctx, atespace, id)so a missing/deleted actor surfaces ascodes.NotFound. - In
ensureAwake(internal/apiservice/wakeretry.go:90-92), also fail fast whenstate == ateapipb.ActorState_ACTOR_STATE_DELETINGinstead of polling untilDefaultWakeBudget(2m) expires.
- 主要语言
- Go
- 星标
- 71
- 派生
- 17
- 平均合并
- 21 小时 36 分钟
- 30 天内合并 PR
- 19
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
agent-substrate/env 的其他 Issue
-
难度 4/5 3-5 天 新手友好度 42/100
agent-substrate/env#123 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 42/100
agent-substrate/env#119 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 55/100
agent-substrate/env#118 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 57/100
agent-substrate/env#117 ·
维护者通常 1 天内回复
-
bug substrate
难度 4/5 3-5 天 新手友好度 35/100
agent-substrate/env#115 ·
维护者通常 1 天内回复
查看 agent-substrate/env 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
bug os:ios
难度 2/5 1-3 小时 新手友好度 72/100
hajimehoshi/ebiten#4039 · 2 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 69/100
open-telemetry/opentelemetry-go-compile-instrumentation#1713 ·
维护者通常 2 天内回复
-
难度 2/5 1-3 小时 新手友好度 74/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 77/100
JakeChampion/lang#14392 ·
维护者通常 1 天内回复