Skip to content

Commit 53bfcbb

Browse files
committed
重构,优化
1 parent 565b540 commit 53bfcbb

6 files changed

Lines changed: 85 additions & 151 deletions

File tree

internal/fs/archive.go

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"github.com/OpenListTeam/OpenList/v4/internal/stream"
2323
"github.com/OpenListTeam/OpenList/v4/internal/task"
2424
"github.com/OpenListTeam/OpenList/v4/internal/task/batch_task"
25-
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
2625
"github.com/OpenListTeam/tache"
2726
"github.com/pkg/errors"
2827
log "github.com/sirupsen/logrus"
@@ -158,9 +157,8 @@ func (t *ArchiveContentUploadTask) GetStatus() string {
158157
var _ task.Lifecycle = (*ArchiveContentUploadTask)(nil)
159158

160159
func (t *ArchiveContentUploadTask) BeforeRun() error {
161-
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(t.GetID(), batch_task.TaskMap{
162-
batch_task.NeedRefreshPath: stdpath.Join(t.DstStorageMp, t.DstDirPath),
163-
})
160+
targetPath := stdpath.Join(t.DstStorageMp, t.DstDirPath)
161+
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(targetPath, batch_task.TaskPayload{})
164162
return nil
165163
}
166164

@@ -177,25 +175,8 @@ func (t *ArchiveContentUploadTask) RunCore() error {
177175
})
178176
}
179177
func (t *ArchiveContentUploadTask) AfterRun(err error) error {
180-
allFinish := true
181-
// 需要先更新任务状态,再进行判断
182-
if err == nil {
183-
t.State = tache.StateSucceeded
184-
} else {
185-
t.State = tache.StateFailed
186-
}
187-
for _, ct := range ArchiveContentUploadTaskManager.GetAll() {
188-
if !utils.SliceContains([]tache.State{
189-
tache.StateSucceeded,
190-
tache.StateFailed,
191-
tache.StateCanceled,
192-
}, ct.GetState()) {
193-
allFinish = false
194-
break
195-
}
196-
197-
}
198-
batch_task.BatchTaskRefreshAndRemoveHook.RemoveTask(t.GetID(), allFinish)
178+
targetPath := stdpath.Join(t.DstStorageMp, t.DstDirPath)
179+
batch_task.BatchTaskRefreshAndRemoveHook.MarkTaskFinish(targetPath)
199180
return err
200181
}
201182

internal/fs/copy.go

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,8 @@ func (t *CopyTask) GetStatus() string {
4242
var _ task.Lifecycle = (*CopyTask)(nil)
4343

4444
func (t *CopyTask) BeforeRun() error {
45-
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(t.GetID(), batch_task.TaskMap{
46-
batch_task.NeedRefreshPath: stdpath.Join(t.DstStorageMp, t.DstDirPath),
47-
})
45+
targetPath := stdpath.Join(t.DstStorageMp, t.DstDirPath)
46+
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(targetPath, batch_task.TaskPayload{})
4847
return nil
4948
}
5049

@@ -69,25 +68,8 @@ func (t *CopyTask) RunCore() error {
6968
}
7069

7170
func (t *CopyTask) AfterRun(err error) error {
72-
allFinish := true
73-
// 需要先更新任务状态,再进行判断
74-
if err == nil {
75-
t.State = tache.StateSucceeded
76-
} else {
77-
t.State = tache.StateFailed
78-
}
79-
for _, ct := range CopyTaskManager.GetAll() {
80-
if !utils.SliceContains([]tache.State{
81-
tache.StateSucceeded,
82-
tache.StateFailed,
83-
tache.StateCanceled,
84-
}, ct.GetState()) {
85-
allFinish = false
86-
break
87-
}
88-
89-
}
90-
batch_task.BatchTaskRefreshAndRemoveHook.RemoveTask(t.GetID(), allFinish)
71+
dstPath := stdpath.Join(t.DstStorageMp, t.DstDirPath)
72+
batch_task.BatchTaskRefreshAndRemoveHook.MarkTaskFinish(dstPath)
9173
return err
9274
}
9375

internal/fs/move.go

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package fs
33
import (
44
"context"
55
"fmt"
6+
stdpath "path"
7+
"time"
8+
69
"github.com/OpenListTeam/OpenList/v4/internal/driver"
710
"github.com/OpenListTeam/OpenList/v4/internal/stream"
811
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
9-
stdpath "path"
10-
"time"
1112

1213
"github.com/OpenListTeam/OpenList/v4/internal/conf"
1314
"github.com/OpenListTeam/OpenList/v4/internal/errs"
@@ -46,10 +47,10 @@ func (t *MoveTask) Run() error {
4647
var _ task.Lifecycle = (*MoveTask)(nil)
4748

4849
func (t *MoveTask) BeforeRun() error {
49-
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(t.GetID(), batch_task.TaskMap{
50-
batch_task.NeedRefreshPath: stdpath.Join(t.DstStorageMp, t.DstDirPath),
51-
batch_task.MoveSrcPath: stdpath.Join(t.srcStorage.GetStorage().MountPath, t.SrcObjPath),
52-
batch_task.MoveDstPath: stdpath.Join(t.dstStorage.GetStorage().MountPath, t.DstDirPath),
50+
targetPath := stdpath.Join(t.DstStorageMp, t.DstDirPath)
51+
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(targetPath, batch_task.TaskPayload{
52+
batch_task.MoveSrcPath: stdpath.Join(t.SrcStorageMp, t.SrcObjPath),
53+
batch_task.MoveDstPath: targetPath,
5354
})
5455
return nil
5556
}
@@ -75,25 +76,8 @@ func (t *MoveTask) RunCore() error {
7576
}
7677

7778
func (t *MoveTask) AfterRun(err error) error {
78-
allFinish := true
79-
// 需要先更新任务状态,再进行判断
80-
if err == nil {
81-
t.State = tache.StateSucceeded
82-
} else {
83-
t.State = tache.StateFailed
84-
}
85-
for _, ct := range MoveTaskManager.GetAll() {
86-
if !utils.SliceContains([]tache.State{
87-
tache.StateSucceeded,
88-
tache.StateFailed,
89-
tache.StateCanceled,
90-
}, ct.GetState()) {
91-
allFinish = false
92-
break
93-
}
94-
95-
}
96-
batch_task.BatchTaskRefreshAndRemoveHook.RemoveTask(t.GetID(), allFinish)
79+
targetPath := stdpath.Join(t.DstStorageMp, t.DstDirPath)
80+
batch_task.BatchTaskRefreshAndRemoveHook.MarkTaskFinish(targetPath)
9781
return err
9882
}
9983

internal/fs/put.go

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"time"
88

99
"github.com/OpenListTeam/OpenList/v4/internal/task/batch_task"
10-
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1110

1211
"github.com/OpenListTeam/OpenList/v4/internal/conf"
1312
"github.com/OpenListTeam/OpenList/v4/internal/driver"
@@ -37,9 +36,8 @@ func (t *UploadTask) GetStatus() string {
3736
var _ task.Lifecycle = (*UploadTask)(nil)
3837

3938
func (t *UploadTask) BeforeRun() error {
40-
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(t.GetID(), batch_task.TaskMap{
41-
batch_task.NeedRefreshPath: stdpath.Join(t.storage.GetStorage().MountPath, t.dstDirActualPath),
42-
})
39+
targetPath := stdpath.Join(t.storage.GetStorage().MountPath, t.dstDirActualPath)
40+
batch_task.BatchTaskRefreshAndRemoveHook.AddTask(targetPath, batch_task.TaskPayload{})
4341
return nil
4442
}
4543

@@ -51,24 +49,8 @@ func (t *UploadTask) RunCore() error {
5149
}
5250

5351
func (t *UploadTask) AfterRun(err error) error {
54-
allFinish := true
55-
// 需要先更新任务状态,再进行判断
56-
if err == nil {
57-
t.State = tache.StateSucceeded
58-
} else {
59-
t.State = tache.StateFailed
60-
}
61-
for _, ct := range UploadTaskManager.GetAll() {
62-
if !utils.SliceContains([]tache.State{
63-
tache.StateSucceeded,
64-
tache.StateFailed,
65-
tache.StateCanceled,
66-
}, ct.GetState()) {
67-
allFinish = false
68-
break
69-
}
70-
}
71-
batch_task.BatchTaskRefreshAndRemoveHook.RemoveTask(t.GetID(), allFinish)
52+
targetPath := stdpath.Join(t.storage.GetStorage().MountPath, t.dstDirActualPath)
53+
batch_task.BatchTaskRefreshAndRemoveHook.MarkTaskFinish(targetPath)
7254
return err
7355
}
7456

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,84 @@
11
package batch_task
22

33
import (
4-
"maps"
54
"sync"
5+
6+
"github.com/sirupsen/logrus"
7+
)
8+
9+
type taskKey int
10+
11+
const (
12+
_ taskKey = iota
13+
refreshPath
14+
MoveSrcPath
15+
MoveDstPath
616
)
717

8-
type FinishHook func(allTaskArgs map[string]TaskMap)
9-
type BatchTaskHook struct {
10-
name string
11-
mu sync.Mutex
12-
tasks map[string]struct{}
13-
taskArgs map[string]TaskMap
18+
type TaskPayload map[taskKey]any
19+
type FinishHook func(payloads []TaskPayload)
20+
type BatchTasCoordinator struct {
21+
name string
22+
mu sync.Mutex
23+
24+
pendingTasks map[string][]TaskPayload
25+
finishCounts map[string]int
1426
allFinishHook FinishHook
1527
}
1628

17-
func NewBatchTaskHook(name string) *BatchTaskHook {
18-
return &BatchTaskHook{
19-
name: name,
20-
tasks: map[string]struct{}{},
21-
taskArgs: map[string]TaskMap{},
29+
func NewBatchTasCoordinator(name string) *BatchTasCoordinator {
30+
return &BatchTasCoordinator{
31+
name: name,
32+
pendingTasks: map[string][]TaskPayload{},
33+
finishCounts: map[string]int{},
2234
}
2335
}
2436

25-
func (bt *BatchTaskHook) SetAllFinishHook(f FinishHook) *BatchTaskHook {
37+
func (bt *BatchTasCoordinator) SetAllFinishHook(f FinishHook) *BatchTasCoordinator {
2638
bt.allFinishHook = f
2739
return bt
2840
}
2941

30-
func (bt *BatchTaskHook) AddTask(taskID string, taskMap TaskMap) {
42+
// 自动添加refreshPath在第1个任务
43+
func (bt *BatchTasCoordinator) AddTask(targetPath string, playload TaskPayload) {
3144
bt.mu.Lock()
3245
defer bt.mu.Unlock()
33-
bt.tasks[taskID] = struct{}{}
34-
if existingMap, ok := bt.taskArgs[taskID]; ok {
35-
maps.Copy(existingMap, taskMap)
46+
defer func() {
47+
logrus.Debugf("AddTask:%s ,%d", targetPath, len(bt.pendingTasks[targetPath]))
48+
}()
49+
if playloads, ok := bt.pendingTasks[targetPath]; ok {
50+
if _, ok := playload[refreshPath]; ok {
51+
if len(playload) == 1 {
52+
t := playloads[0]
53+
t[refreshPath] = targetPath
54+
playloads[0] = t
55+
return
56+
}
57+
delete(playload, refreshPath)
58+
}
59+
bt.pendingTasks[targetPath] = append(playloads, playload)
3660
} else {
37-
bt.taskArgs[taskID] = taskMap
61+
playload[refreshPath] = targetPath
62+
bt.pendingTasks[targetPath] = []TaskPayload{playload}
3863
}
3964
}
4065

41-
func (bt *BatchTaskHook) RemoveTask(taskID string, allFinish bool) {
66+
func (bt *BatchTasCoordinator) MarkTaskFinish(targetPath string) {
4267
bt.mu.Lock()
4368
defer bt.mu.Unlock()
44-
delete(bt.tasks, taskID)
45-
if len(bt.tasks) == 0 && allFinish {
46-
if bt.allFinishHook != nil {
47-
bt.allFinishHook(bt.taskArgs)
69+
finishCount := bt.finishCounts[targetPath]
70+
finishCount++
71+
logrus.Debugf("MarkTaskFinish:%s ,%v", targetPath, finishCount)
72+
if playloads, ok := bt.pendingTasks[targetPath]; ok {
73+
if len(playloads) == finishCount {
74+
delete(bt.pendingTasks, targetPath)
75+
delete(bt.finishCounts, targetPath)
76+
if bt.allFinishHook != nil {
77+
logrus.Debugf("allFinishHook:%s", targetPath)
78+
bt.allFinishHook(playloads)
79+
}
80+
return
4881
}
49-
clear(bt.taskArgs)
50-
}
51-
}
52-
53-
func (bt *BatchTaskHook) GetAllTaskArgs() map[string]TaskMap {
54-
bt.mu.Lock()
55-
defer bt.mu.Unlock()
56-
57-
result := map[string]TaskMap{}
58-
for taskID, args := range bt.taskArgs {
59-
copyArgs := TaskMap{}
60-
maps.Copy(copyArgs, args)
61-
result[taskID] = copyArgs
6282
}
63-
return result
83+
bt.finishCounts[targetPath] = finishCount
6484
}

internal/task/batch_task/refresh.go

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,27 @@ import (
77
"github.com/OpenListTeam/OpenList/v4/internal/driver"
88
"github.com/OpenListTeam/OpenList/v4/internal/model"
99
"github.com/OpenListTeam/OpenList/v4/internal/op"
10-
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1110
"github.com/pkg/errors"
1211
log "github.com/sirupsen/logrus"
1312
)
1413

15-
var BatchTaskRefreshAndRemoveHook *BatchTaskHook
16-
17-
type taskMapKey int
18-
19-
const (
20-
_ taskMapKey = iota
21-
NeedRefreshPath
22-
MoveSrcPath
23-
MoveDstPath
24-
)
25-
26-
type TaskMap map[taskMapKey]any
14+
var BatchTaskRefreshAndRemoveHook *BatchTasCoordinator
2715

2816
func InitBatchTaskHook() {
29-
BatchTaskRefreshAndRemoveHook = NewBatchTaskHook("refreshAndRemoveHook")
17+
BatchTaskRefreshAndRemoveHook = NewBatchTasCoordinator("refreshAndRemoveHook")
3018
BatchTaskRefreshAndRemoveHook.SetAllFinishHook(refreshAndRemove)
3119
}
3220

33-
func refreshAndRemove(allTaskArgs map[string]TaskMap) {
34-
for _, taskMap := range allTaskArgs {
35-
if refreshPathRaw, ok := taskMap[NeedRefreshPath]; ok {
21+
func refreshAndRemove(payloads []TaskPayload) {
22+
for _, payload := range payloads {
23+
if refreshPathRaw, ok := payload[refreshPath]; ok {
3624
if refreshPath, ok := refreshPathRaw.(string); ok {
3725
storage, actualPath, _ := op.GetStorageAndActualPath(refreshPath)
3826
op.ClearCache(storage, actualPath)
3927
}
4028
}
41-
if srcPathRaw, ok := taskMap[MoveSrcPath]; ok {
42-
if dstPathRaw, ok := taskMap[MoveDstPath]; ok {
29+
if srcPathRaw, ok := payload[MoveSrcPath]; ok {
30+
if dstPathRaw, ok := payload[MoveDstPath]; ok {
4331
srcPath, srcOk := srcPathRaw.(string)
4432
dstPath, dstOk := dstPathRaw.(string)
4533
if srcOk && dstOk {
@@ -92,9 +80,6 @@ func verifyAndRemove(srcStorage, dstStorage driver.Driver, srcPath, dstPath stri
9280

9381
hasError := false
9482
for _, obj := range srcObjs {
95-
if utils.IsCanceled(ctx) {
96-
return nil
97-
}
9883
srcSubPath := stdpath.Join(srcPath, obj.GetName())
9984
err := verifyAndRemove(srcStorage, dstStorage, srcSubPath, dstObjPath)
10085
if err != nil {

0 commit comments

Comments
 (0)