blob: 89e2fc8ebbeaec5c375e3539ee424f562b8d5197 [file] [log] [blame]
package flakes
/*
Find flakily-failed tasks in a time window.
*/
import (
"go.skia.org/infra/task_scheduler/go/types"
)
// Find flakily-failed tasks in the given slice of tasks.
func FindFlakes(tasks []*types.Task) []*types.Task {
tasksMap := map[types.TaskKey][]*types.Task{}
for _, task := range tasks {
if task.Done() {
tasksMap[task.TaskKey] = append(tasksMap[task.TaskKey], task)
}
}
flaky := []*types.Task{}
for _, tasks := range tasksMap {
// If one or more tasks succeeded and failed, then all failures
// are flakes.
success := 0
failure := 0
for _, task := range tasks {
if task.Status == types.TASK_STATUS_SUCCESS {
success++
} else if task.Status == types.TASK_STATUS_FAILURE {
failure++
} else if task.Status == types.TASK_STATUS_MISHAP {
// Mishaps are flakes by definition.
flaky = append(flaky, task)
}
}
if success > 0 && failure > 0 {
for _, task := range tasks {
if task.Status == types.TASK_STATUS_FAILURE {
flaky = append(flaky, task)
}
}
}
}
return flaky
}