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

Aperta
#121 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
74/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
go, grpc
Ambito
api, backend

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.
Lingua principale
Go
Stelle
71
Fork
17
Merge medio
21h 36m
PR unite (30g)
19

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di agent-substrate/env

Tutte le issue di agent-substrate/env

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.