diff --git a/pkg/server/web/admin.go b/pkg/server/web/admin.go
index aace3d9e..f54ac9e5 100644
--- a/pkg/server/web/admin.go
+++ b/pkg/server/web/admin.go
@@ -16,6 +16,7 @@ package web
import (
"bytes"
+ context2 "context"
"encoding/json"
"fmt"
"net/http"
@@ -378,10 +379,10 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
taskname := req.Form.Get("taskname")
if taskname != "" {
if t, ok := task.AdminTaskList[taskname]; ok {
- if err := t.Run(); err != nil {
+ if err := t.Run(nil); err != nil {
data["Message"] = []string{"error", template.HTMLEscapeString(fmt.Sprintf("%s", err))}
}
- data["Message"] = []string{"success", template.HTMLEscapeString(fmt.Sprintf("%s run success,Now the Status is
%s", taskname, t.GetStatus()))}
+ data["Message"] = []string{"success", template.HTMLEscapeString(fmt.Sprintf("%s run success,Now the Status is
%s", taskname, t.GetStatus(nil)))}
} else {
data["Message"] = []string{"warning", template.HTMLEscapeString(fmt.Sprintf("there's no task which named: %s", taskname))}
}
@@ -400,9 +401,9 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
for tname, tk := range task.AdminTaskList {
result := []string{
template.HTMLEscapeString(tname),
- template.HTMLEscapeString(tk.GetSpec()),
- template.HTMLEscapeString(tk.GetStatus()),
- template.HTMLEscapeString(tk.GetPrev().String()),
+ template.HTMLEscapeString(tk.GetSpec(nil)),
+ template.HTMLEscapeString(tk.GetStatus(nil)),
+ template.HTMLEscapeString(tk.GetPrev(context2.Background()).String()),
}
*resultList = append(*resultList, result)
}
diff --git a/pkg/task/task.go b/pkg/task/task.go
index 04185d8e..e2962000 100644
--- a/pkg/task/task.go
+++ b/pkg/task/task.go
@@ -15,6 +15,7 @@
package task
import (
+ "context"
"log"
"math"
"sort"
@@ -86,13 +87,13 @@ type TaskFunc func() error
// Tasker task interface
type Tasker interface {
- GetSpec() string
- GetStatus() string
- Run() error
- SetNext(time.Time)
- GetNext() time.Time
- SetPrev(time.Time)
- GetPrev() time.Time
+ GetSpec(ctx context.Context) string
+ GetStatus(ctx context.Context) string
+ Run(ctx context.Context) error
+ SetNext(context.Context, time.Time)
+ GetNext(ctx context.Context) time.Time
+ SetPrev(context.Context, time.Time)
+ GetPrev(ctx context.Context) time.Time
}
// task error
@@ -133,12 +134,12 @@ func NewTask(tname string, spec string, f TaskFunc) *Task {
}
// GetSpec get spec string
-func (t *Task) GetSpec() string {
+func (t *Task) GetSpec(context.Context) string {
return t.SpecStr
}
// GetStatus get current task status
-func (t *Task) GetStatus() string {
+func (t *Task) GetStatus(context.Context) string {
var str string
for _, v := range t.Errlist {
str += v.t.String() + ":" + v.errinfo + "
"
@@ -147,7 +148,7 @@ func (t *Task) GetStatus() string {
}
// Run run all tasks
-func (t *Task) Run() error {
+func (t *Task) Run(context.Context) error {
err := t.DoFunc()
if err != nil {
index := t.errCnt % t.ErrLimit
@@ -158,22 +159,22 @@ func (t *Task) Run() error {
}
// SetNext set next time for this task
-func (t *Task) SetNext(now time.Time) {
+func (t *Task) SetNext(ctx context.Context, now time.Time) {
t.Next = t.Spec.Next(now)
}
// GetNext get the next call time of this task
-func (t *Task) GetNext() time.Time {
+func (t *Task) GetNext(context.Context) time.Time {
return t.Next
}
// SetPrev set prev time of this task
-func (t *Task) SetPrev(now time.Time) {
+func (t *Task) SetPrev(ctx context.Context, now time.Time) {
t.Prev = now
}
// GetPrev get prev time of this task
-func (t *Task) GetPrev() time.Time {
+func (t *Task) GetPrev(context.Context) time.Time {
return t.Prev
}
@@ -410,7 +411,7 @@ func StartTask() {
func run() {
now := time.Now().Local()
for _, t := range AdminTaskList {
- t.SetNext(now)
+ t.SetNext(nil, now)
}
for {
@@ -420,30 +421,30 @@ func run() {
taskLock.RUnlock()
sortList.Sort()
var effective time.Time
- if len(AdminTaskList) == 0 || sortList.Vals[0].GetNext().IsZero() {
+ if len(AdminTaskList) == 0 || sortList.Vals[0].GetNext(context.Background()).IsZero() {
// If there are no entries yet, just sleep - it still handles new entries
// and stop requests.
effective = now.AddDate(10, 0, 0)
} else {
- effective = sortList.Vals[0].GetNext()
+ effective = sortList.Vals[0].GetNext(context.Background())
}
select {
case now = <-time.After(effective.Sub(now)):
// Run every entry whose next time was this effective time.
for _, e := range sortList.Vals {
- if e.GetNext() != effective {
+ if e.GetNext(context.Background()) != effective {
break
}
- go e.Run()
- e.SetPrev(e.GetNext())
- e.SetNext(effective)
+ go e.Run(nil)
+ e.SetPrev(context.Background(), e.GetNext(context.Background()))
+ e.SetNext(nil, effective)
}
continue
case <-changed:
now = time.Now().Local()
taskLock.Lock()
for _, t := range AdminTaskList {
- t.SetNext(now)
+ t.SetNext(nil, now)
}
taskLock.Unlock()
continue
@@ -468,7 +469,7 @@ func StopTask() {
func AddTask(taskname string, t Tasker) {
taskLock.Lock()
defer taskLock.Unlock()
- t.SetNext(time.Now().Local())
+ t.SetNext(nil, time.Now().Local())
AdminTaskList[taskname] = t
if isstart {
changed <- true
@@ -511,13 +512,13 @@ func (ms *MapSorter) Sort() {
func (ms *MapSorter) Len() int { return len(ms.Keys) }
func (ms *MapSorter) Less(i, j int) bool {
- if ms.Vals[i].GetNext().IsZero() {
+ if ms.Vals[i].GetNext(context.Background()).IsZero() {
return false
}
- if ms.Vals[j].GetNext().IsZero() {
+ if ms.Vals[j].GetNext(context.Background()).IsZero() {
return true
}
- return ms.Vals[i].GetNext().Before(ms.Vals[j].GetNext())
+ return ms.Vals[i].GetNext(context.Background()).Before(ms.Vals[j].GetNext(context.Background()))
}
func (ms *MapSorter) Swap(i, j int) {
ms.Vals[i], ms.Vals[j] = ms.Vals[j], ms.Vals[i]
diff --git a/pkg/task/task_test.go b/pkg/task/task_test.go
index c7360b39..9f73ce46 100644
--- a/pkg/task/task_test.go
+++ b/pkg/task/task_test.go
@@ -26,7 +26,7 @@ import (
func TestParse(t *testing.T) {
tk := NewTask("taska", "0/30 * * * * *", func() error { fmt.Println("hello world"); return nil })
- err := tk.Run()
+ err := tk.Run(nil)
if err != nil {
t.Fatal(err)
}
@@ -65,7 +65,7 @@ func TestTask_Run(t *testing.T) {
}
tk := NewTask("taska", "0/30 * * * * *", task)
for i := 0; i < 200; i++ {
- e := tk.Run()
+ e := tk.Run(nil)
assert.NotNil(t, e)
}