Skip to content

Commit

Permalink
fix: computing pause periods
Browse files Browse the repository at this point in the history
  • Loading branch information
rangoo94 committed Aug 8, 2024
1 parent 87f29f8 commit 0bde155
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 3 deletions.
46 changes: 46 additions & 0 deletions pkg/api/v1/testkube/model_test_workflow_result_extended.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package testkube

import (
"fmt"
"slices"
"time"

Expand Down Expand Up @@ -157,7 +158,46 @@ func (r *TestWorkflowResult) UpdateStepResult(sig []TestWorkflowSignature, ref s
func (r *TestWorkflowResult) RecomputeDuration() {
if !r.FinishedAt.IsZero() {
r.PausedMs = 0

// Get unique pause periods
pauses := make([]TestWorkflowPause, 0)
loop:
for _, p := range r.Pauses {
// Finalize the pause if it's not
step := r.Steps[p.Ref]
if !step.FinishedAt.IsZero() && p.ResumedAt.IsZero() {
p.ResumedAt = step.FinishedAt
}

for i := range pauses {
// They don't overlap
if p.PausedAt.After(pauses[i].ResumedAt) || p.ResumedAt.Before(pauses[i].PausedAt) {
continue
}

// The existing pause period may take some period before
if pauses[i].PausedAt.After(p.PausedAt) {
pauses[i].PausedAt = p.PausedAt
p.PausedAt = pauses[i].ResumedAt
if p.ResumedAt.Before(p.PausedAt) {
p.ResumedAt = p.PausedAt
}
}

// The existing pause period may take some period after
if pauses[i].ResumedAt.Before(p.ResumedAt) {
pauses[i].ResumedAt = p.ResumedAt
p.ResumedAt = pauses[i].PausedAt
}

// The pause is already enclosed in existing list
continue loop
}

pauses = append(pauses, p)
}

for _, p := range pauses {
resumedAt := p.ResumedAt
if resumedAt.IsZero() {
resumedAt = r.FinishedAt
Expand All @@ -167,6 +207,7 @@ func (r *TestWorkflowResult) RecomputeDuration() {
r.PausedMs += milli
}
}

totalDuration := r.FinishedAt.Sub(r.QueuedAt)
duration := totalDuration - time.Duration(1e3*r.PausedMs)
if totalDuration < 0 {
Expand Down Expand Up @@ -202,8 +243,10 @@ func (r *TestWorkflowResult) HasUnfinishedPause(ref string) bool {

func (r *TestWorkflowResult) PauseStart(sig []TestWorkflowSignature, scheduledAt time.Time, ref string, start time.Time) {
if r.HasPauseAt(ref, start) {
fmt.Println(" Already had a pause")
return
}
fmt.Println(" Added a pause entry")
r.Pauses = append(r.Pauses, TestWorkflowPause{Ref: ref, PausedAt: start})
r.Recompute(sig, scheduledAt)
}
Expand All @@ -213,12 +256,15 @@ func (r *TestWorkflowResult) PauseEnd(sig []TestWorkflowSignature, scheduledAt t
if p.Ref != ref {
continue
}
fmt.Println(" Found pause for ref possibly to resume", ref)
if !p.PausedAt.After(end) && !p.ResumedAt.Before(end) {
// It's already covered by another period
fmt.Println(" It's already covered", p.PausedAt, p.ResumedAt)
return
}
if !p.PausedAt.After(end) && (p.ResumedAt.IsZero() || p.ResumedAt.Equal(end)) {
// It found a period to fulfill
fmt.Println(" Filling the pause from", p.PausedAt)
r.Pauses[i].ResumedAt = end
r.Recompute(sig, scheduledAt)
return
Expand Down
3 changes: 0 additions & 3 deletions pkg/testworkflows/testworkflowcontroller/notifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,9 +343,6 @@ func (n *notifier) Pause(ref string, ts time.Time) {
}

func (n *notifier) Resume(ref string, ts time.Time) {
if n.result.Steps[ref].Status == nil || *n.result.Steps[ref].Status != testkube.PAUSED_TestWorkflowStepStatus {
return
}
n.result.PauseEnd(n.sig, n.scheduledAt, ref, ts)
n.emit()
}
Expand Down

0 comments on commit 0bde155

Please sign in to comment.