Retrying an interrupted CreateTag never completes the Tag

オープン
#3,386 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
57/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
go, grpc
領域
api, backend

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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.

主要言語
Go
スター
5.9k
フォーク
637
平均マージ
2日 1時間
マージ済み PR(30日)
523

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

agent-substrate/substrate のほかの issue

agent-substrate/substrate の issue をすべて見る

似ている issue

Go の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。