Skip to content

Redis status update can overwrite a concurrently committed task spec edit #352

Description

@fkautz

Problem

UpdateTaskStatus reads the whole task and later writes the whole record using SET without checking its version. A task edit committed between that GET and SET is silently overwritten.

Reproduction

Save image:v1 with suspend=false. After UpdateTaskStatus reads its snapshot, commit image:v2 and suspend=true through a separate Redis client. Then let the status write complete.

Observed behavior

Both operations return success, but the stored spec is image:v1 and suspend=false. The committed edit has been lost.

Expected behavior

Updating status must preserve concurrent spec edits, using an atomic field update or optimistic concurrency with retry.

Executable regression test

TestReviewStatusUpdatePreservesConcurrentSpecEdit (includes fixture in the same file).

git clone --branch test/review-regressions https://github.com/fkautz/ax.git ax-review
cd ax-review
git checkout 1dc2613d29e12f306154a7e1183c1825a55d24ed
go test ./internal/store/redis -run '^TestReviewStatusUpdatePreservesConcurrentSpecEdit$' -count=1 -v

Requires the Go toolchain specified by go.mod and redis-server on PATH. The test asserts the desired behavior and fails on the published revision. Production code is unchanged.

The test uses a real isolated Redis server. A client hook commits the edit immediately after the status writer reads its snapshot, establishing the interleaving deterministically without timing races.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions