mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 19:07:30 +00:00
fix(cleanup): cleanup all stuck states (#7145)
* fix(setup): unmarshal of failed step * fix(cleanup): cleanup all stuck states * use lastRun for repeatable steps * typo --------- Co-authored-by: Livio Spring <livio.a@gmail.com>
This commit is contained in:
85
internal/migration/step.go
Normal file
85
internal/migration/step.go
Normal file
@@ -0,0 +1,85 @@
|
||||
package migration
|
||||
|
||||
import "github.com/zitadel/zitadel/internal/eventstore"
|
||||
|
||||
var _ eventstore.QueryReducer = (*StepStates)(nil)
|
||||
|
||||
type Step struct {
|
||||
*SetupStep
|
||||
|
||||
state StepState
|
||||
}
|
||||
|
||||
type StepStates struct {
|
||||
eventstore.ReadModel
|
||||
Steps []*Step
|
||||
}
|
||||
|
||||
// Query implements eventstore.QueryReducer.
|
||||
func (*StepStates) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(aggregateType).
|
||||
AggregateIDs(aggregateID).
|
||||
EventTypes(StartedType, doneType, repeatableDoneType, failedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
// Reduce implements eventstore.QueryReducer.
|
||||
func (s *StepStates) Reduce() error {
|
||||
for _, event := range s.Events {
|
||||
step := event.(*SetupStep)
|
||||
state := s.byName(step.Name)
|
||||
if state == nil {
|
||||
state = new(Step)
|
||||
s.Steps = append(s.Steps, state)
|
||||
}
|
||||
state.SetupStep = step
|
||||
switch step.EventType {
|
||||
case StartedType:
|
||||
state.state = StepStarted
|
||||
case doneType:
|
||||
state.state = StepDone
|
||||
case repeatableDoneType:
|
||||
state.state = StepDone
|
||||
case failedType:
|
||||
state.state = StepFailed
|
||||
}
|
||||
}
|
||||
return s.ReadModel.Reduce()
|
||||
}
|
||||
|
||||
func (s *StepStates) byName(name string) *Step {
|
||||
for _, step := range s.Steps {
|
||||
if step.Name == name {
|
||||
return step
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *StepStates) lastByState(stepState StepState) (step *Step) {
|
||||
for _, state := range s.Steps {
|
||||
if state.state != stepState {
|
||||
continue
|
||||
}
|
||||
if step == nil {
|
||||
step = state
|
||||
continue
|
||||
}
|
||||
if step.CreatedAt().After(state.CreatedAt()) {
|
||||
continue
|
||||
}
|
||||
|
||||
step = state
|
||||
}
|
||||
return step
|
||||
}
|
||||
|
||||
type StepState int32
|
||||
|
||||
const (
|
||||
StepStarted StepState = iota
|
||||
StepDone
|
||||
StepFailed
|
||||
)
|
Reference in New Issue
Block a user