fix(eventstore): treat later Started as a new setup attempt

IsStepDone no longer keeps a sticky Failed flag. Started → Failed →
Started is an unterminated retry, not OFFSET mode.

Co-authored-by: s2s4gq4jby <s2s4gq4jby@privaterelay.appleid.com>
This commit is contained in:
Cursor Agentands2s4gq4jby committed 2026-10-09 08:38:02 +00:00
1 parent 3abe7f5be8
commit fd307630e1
2 files changed
+46

No files matched your search

+4
View File
@@ -26,10 +26,14 @@ func (s *stepDoneCheck) AppendEvents(events ...eventstore.Event) {
switch event.Type() {
case StartedType:
s.started = true
s.done = false
s.failed = false
case DoneType:
s.done = true
s.failed = false
case failedType:
s.failed = true
s.done = false
}
}
}
+42
View File
@@ -80,6 +80,48 @@ func TestIsStepDone(t *testing.T) {
assert.False(t, done)
})
t.Run("started after failed is stuck", func(t *testing.T) {
es := &stubEventQuerier{
events: []eventstore.Event{
&eventstore.BaseEvent{EventType: StartedType},
&eventstore.BaseEvent{EventType: failedType},
&eventstore.BaseEvent{EventType: StartedType},
},
}
done, err := IsStepDone(t.Context(), es, EventstorePositionClockTimestampStep)
require.Error(t, err)
assert.Contains(t, err.Error(), "started without a done or failed event")
assert.False(t, done)
})
t.Run("started after failed then done is stored", func(t *testing.T) {
es := &stubEventQuerier{
events: []eventstore.Event{
&eventstore.BaseEvent{EventType: StartedType},
&eventstore.BaseEvent{EventType: failedType},
&eventstore.BaseEvent{EventType: StartedType},
&eventstore.BaseEvent{EventType: DoneType},
},
}
done, err := IsStepDone(t.Context(), es, EventstorePositionClockTimestampStep)
require.NoError(t, err)
assert.True(t, done)
})
t.Run("started after failed then failed is not done", func(t *testing.T) {
es := &stubEventQuerier{
events: []eventstore.Event{
&eventstore.BaseEvent{EventType: StartedType},
&eventstore.BaseEvent{EventType: failedType},
&eventstore.BaseEvent{EventType: StartedType},
&eventstore.BaseEvent{EventType: failedType},
},
}
done, err := IsStepDone(t.Context(), es, EventstorePositionClockTimestampStep)
require.NoError(t, err)
assert.False(t, done)
})
t.Run("undefined table is not done", func(t *testing.T) {
es := &stubEventQuerier{
err: &pgconn.PgError{Code: "42P01"},