mirror of
https://github.com/OpenListTeam/OpenList.git
synced 2026-10-10 04:53:09 +08:00
feat(task): persist task timestamps across restarts (#2914)
Co-authored-by: OpenAI Codex <noreply@openai.com>
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
package fs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/OpenListTeam/OpenList/v4/internal/conf"
|
||||||
|
"github.com/OpenListTeam/tache"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMigratedCopyTaskRecoversNativeFields(t *testing.T) {
|
||||||
|
previousConf := conf.Conf
|
||||||
|
conf.Conf = &conf.Config{}
|
||||||
|
t.Cleanup(func() { conf.Conf = previousConf })
|
||||||
|
|
||||||
|
raw := []byte(`{
|
||||||
|
"id":"task-one",
|
||||||
|
"state":0,
|
||||||
|
"retry":0,
|
||||||
|
"max_retry":0,
|
||||||
|
"Creator":{"id":1,"username":"admin","password":"","base_path":"/","role":2,"disabled":false,"permission":511,"sso_id":"","allow_ldap":true},
|
||||||
|
"start_time":"2026-08-11T01:00:00Z",
|
||||||
|
"end_time":"2026-08-11T01:01:00Z",
|
||||||
|
"TotalBytes":42,
|
||||||
|
"ApiUrl":"http://openlist.test:5244",
|
||||||
|
"src_path":"/folder/file",
|
||||||
|
"dst_path":"/backup",
|
||||||
|
"src_storage_mp":"/source",
|
||||||
|
"dst_storage_mp":"/target",
|
||||||
|
"TaskType":0
|
||||||
|
}`)
|
||||||
|
|
||||||
|
var task FileTransferTask
|
||||||
|
if err := json.Unmarshal(raw, &task); err != nil {
|
||||||
|
t.Fatalf("unmarshal migrated task: %v", err)
|
||||||
|
}
|
||||||
|
if task.GetID() != "task-one" || task.GetState() != tache.StatePending {
|
||||||
|
t.Fatalf("unexpected base fields: id=%q state=%d", task.GetID(), task.GetState())
|
||||||
|
}
|
||||||
|
if task.GetCreator() == nil || task.GetCreator().Username != "admin" {
|
||||||
|
t.Fatal("creator was not recovered")
|
||||||
|
}
|
||||||
|
if task.GetStartTime() == nil || task.GetEndTime() == nil {
|
||||||
|
t.Fatal("task timestamps were not recovered")
|
||||||
|
}
|
||||||
|
if task.TaskType != copy {
|
||||||
|
t.Fatalf("unexpected task type: %d", task.TaskType)
|
||||||
|
}
|
||||||
|
if task.SrcActualPath != "/folder/file" || task.DstActualPath != "/backup" {
|
||||||
|
t.Fatal("copy paths were not recovered")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, maxRetry := task.GetRetry()
|
||||||
|
if maxRetry != 0 {
|
||||||
|
t.Fatalf("migration must defer retry initialization, got %d", maxRetry)
|
||||||
|
}
|
||||||
|
task.SetRetry(0, 2)
|
||||||
|
_, maxRetry = task.GetRetry()
|
||||||
|
if maxRetry != 2 {
|
||||||
|
t.Fatalf("retry initialization failed, got %d", maxRetry)
|
||||||
|
}
|
||||||
|
if task.groupID != "/target/backup" {
|
||||||
|
t.Fatalf("task group was not rebuilt: %q", task.groupID)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,8 +12,8 @@ import (
|
|||||||
type TaskExtension struct {
|
type TaskExtension struct {
|
||||||
tache.Base
|
tache.Base
|
||||||
Creator *model.User
|
Creator *model.User
|
||||||
startTime *time.Time
|
StartTime *time.Time `json:"start_time,omitempty"`
|
||||||
endTime *time.Time
|
EndTime *time.Time `json:"end_time,omitempty"`
|
||||||
TotalBytes int64
|
TotalBytes int64
|
||||||
ApiUrl string
|
ApiUrl string
|
||||||
}
|
}
|
||||||
@@ -38,23 +38,23 @@ func (t *TaskExtension) GetCreator() *model.User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskExtension) SetStartTime(startTime time.Time) {
|
func (t *TaskExtension) SetStartTime(startTime time.Time) {
|
||||||
t.startTime = &startTime
|
t.StartTime = &startTime
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskExtension) GetStartTime() *time.Time {
|
func (t *TaskExtension) GetStartTime() *time.Time {
|
||||||
return t.startTime
|
return t.StartTime
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskExtension) SetEndTime(endTime time.Time) {
|
func (t *TaskExtension) SetEndTime(endTime time.Time) {
|
||||||
t.endTime = &endTime
|
t.EndTime = &endTime
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskExtension) GetEndTime() *time.Time {
|
func (t *TaskExtension) GetEndTime() *time.Time {
|
||||||
return t.endTime
|
return t.EndTime
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskExtension) ClearEndTime() {
|
func (t *TaskExtension) ClearEndTime() {
|
||||||
t.endTime = nil
|
t.EndTime = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskExtension) SetTotalBytes(totalBytes int64) {
|
func (t *TaskExtension) SetTotalBytes(totalBytes int64) {
|
||||||
|
|||||||
Reference in New Issue
Block a user