Retrying an interrupted CreateTag never completes the Tag

Abierto
#3,386 1 comentario 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
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
57/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 with TagActorSnapshot in cmd/ateapi/internal/controlapi/workflow_tag.go:52-55 and trace the CreateTag retry path for a Tag left in SNAPSHOT_STORAGE_STATE_PENDING. Check the existing CreateTag, GetTag, and DeleteTag behavior, then add or run coverage for retrying after the deadline expires during snapshot copy. Done means the retry converges to a usable completed Tag, with the behavior for an already completed Tag matching the expected response.

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

Descripción

area/api area/api-machinery kind/bug
What happened?

A CreateTag call whose deadline expires during the snapshot copy leaves the Tag in SNAPSHOT_STORAGE_STATE_PENDING. Retrying the same request returns AlreadyExists. The Tag stays PENDING until someone deletes it.

TagActorSnapshot documents this (cmd/ateapi/internal/controlapi/workflow_tag.go:52-55): the create is not idempotent, and the retry path is DeleteTag then CreateTag. DeleteTag followed by CreateTag does produce a COMPLETED Tag.

This causes three problems:

  • Clients that retry DeadlineExceeded or Unavailable with the same request never converge. They get AlreadyExists for a Tag they can't use.
  • A Tag left by a failed create looks the same as one still being created. Both are PENDING, so a client can't tell whether to wait or delete. Nothing cleans up the failed one.
Expected Behavior

Retrying the same CreateTag returns the finished Tag, or AlreadyExists for a COMPLETED Tag. No PENDING Tag is left behind.

Steps to Reproduce
  1. Deploy the counter demo: go run ./cmd/ate-setup deploy demo counter.
  2. Create an actor from the counter template. It starts SUSPENDED.
  3. Call CreateTag with source_actor set to that actor and a 20ms gRPC deadline. It returns DeadlineExceeded.
  4. GetTag shows the Tag at version 2 in SNAPSHOT_STORAGE_STATE_PENDING.
  5. Send the same CreateTag with no deadline. It returns AlreadyExists: Tag ate-demo-counter/bb-s1-short-tag already exists; delete it and create it again to retry.
  6. GetTag still shows PENDING. CreateActor with this Tag as source_tag returns FailedPrecondition: source Tag is still being created or failed creation.

kubectl ate can't send a short enough deadline to hit this. A Go client with context.WithTimeout can.

Lenguaje dominante
Go
Estrellas
5.9k
Forks
637
Merge medio
2 d 2 h
PR fusionados (30 d)
528

Preparar el entorno

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/substrate

Todos los issues de agent-substrate/substrate

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.