[Bug Bash] Guest operations (read/write/shell/MCP) on a deleted or non-existent environment fail with Unimplemented instead of NotFound

Abierto
#121 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
74/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
go, grpc
Área
api, backend

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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
  1. In internal/apiservice/wakeretry.go:80-89, ensureAwake probes the guest via atenet-router and assumes any error code other than codes.Unavailable came 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)
    
  2. When an actor does not exist (or has finished deleting), atenet-router responds with a plain HTTP 404 Not Found (actor <atespace>/<id> not found) without a grpc-status trailer.
  3. Per the gRPC over HTTP/2 specification, grpc-go maps an HTTP 404 response without grpc-status to codes.Unimplemented (12), not codes.Unavailable or codes.NotFound.
  4. Because status.Code(err) == codes.Unimplemented != codes.Unavailable, ensureAwake returns nil immediately without calling s.actorState(ctx, atespace, id) (whose doc comment at :122-124 explicitly notes: "A deleted environment surfaces here as NotFound (through toGRPCError), which is the right answer to a caller still holding its handle").
  5. The caller's subsequent RPC (ReadFile, WriteFile, StartProcess) then hits the same HTTP 404 from atenet-router and surfaces raw codes.Unimplemented to the client.

Versions

  • agent-substrate/env: 40a6c63 (also present on main @ 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

  1. In ensureAwake (internal/apiservice/wakeretry.go:80-89), do not treat codes.Unimplemented from the wake probe as a live guest response (since atenet-router returns HTTP 404 -> codes.Unimplemented when the target actor is unknown, and GetProcess is implemented by ate-env-guest), or fall through to s.actorState(ctx, atespace, id) so a missing/deleted actor surfaces as codes.NotFound.
  2. In ensureAwake (internal/apiservice/wakeretry.go:90-92), also fail fast when state == ateapipb.ActorState_ACTOR_STATE_DELETING instead of polling until DefaultWakeBudget (2m) expires.
Lenguaje dominante
Go
Estrellas
71
Forks
17
Merge medio
21 h 36 min
PR fusionados (30 d)
19

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de agent-substrate/env

Todos los issues de agent-substrate/env

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.