80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package util
|
|
|
|
import (
|
|
"time"
|
|
|
|
migration_model "infini.sh/console/plugin/task_manager/model"
|
|
"infini.sh/framework/core/util"
|
|
)
|
|
|
|
/*
|
|
is_repeat: task will repeat for more than 1 time
|
|
run_times: the total number of runs of a repeating task
|
|
repeat_done: task has reached the last repeat
|
|
next_run_time: the time this task will get picked by scheduler to start
|
|
repeat_triggered: the task has been picked by scheduler and started
|
|
*/
|
|
func UpdateRepeatState(repeat *migration_model.Repeat, labels util.MapStr) error {
|
|
if labels == nil {
|
|
return nil
|
|
}
|
|
if repeat == nil {
|
|
labels["repeat_done"] = true
|
|
return nil
|
|
}
|
|
|
|
if repeat.Interval >= time.Minute {
|
|
labels["is_repeat"] = true
|
|
} else {
|
|
labels["repeat_done"] = true
|
|
}
|
|
|
|
runTimes := GetMapIntValue(labels, "run_times")
|
|
runTimes += 1
|
|
labels["run_times"] = runTimes
|
|
|
|
if repeat.TotalRun >= 1 && runTimes >= repeat.TotalRun {
|
|
labels["repeat_done"] = true
|
|
}
|
|
if _, ok := labels["next_run_time"]; !ok {
|
|
if repeat.NextRunTime != nil {
|
|
labels["next_run_time"] = repeat.NextRunTime.UnixMilli()
|
|
}
|
|
} else {
|
|
nextRunTime := GetMapIntValue(labels, "next_run_time")
|
|
labels["next_run_time"] = nextRunTime + repeat.Interval.Milliseconds()
|
|
}
|
|
labels["repeat_triggered"] = false
|
|
return nil
|
|
}
|
|
|
|
func CopyRepeatState(oldLabels, newLabels util.MapStr) {
|
|
newLabels["run_times"] = oldLabels["run_times"]
|
|
newLabels["next_run_time"] = oldLabels["next_run_time"]
|
|
}
|
|
|
|
func IsRepeating(repeat *migration_model.Repeat, labels map[string]interface{}) bool {
|
|
if repeat == nil {
|
|
return false
|
|
}
|
|
if repeat.Interval < time.Minute {
|
|
return false
|
|
}
|
|
if repeat.TotalRun < 1 {
|
|
return true
|
|
}
|
|
if repeat.TotalRun == 1 {
|
|
return false
|
|
}
|
|
nextRunTime := GetMapIntValue(labels, "next_run_time")
|
|
// not started yet
|
|
if nextRunTime == 0 {
|
|
return false
|
|
}
|
|
endTime := time.UnixMilli(nextRunTime).Add(time.Duration(repeat.TotalRun-1) * repeat.Interval)
|
|
if time.Now().Before(endTime) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|