/
list.go
98 lines (82 loc) · 1.62 KB
/
list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package migrate
import (
"context"
"github.com/sirupsen/logrus"
"github.com/yunify/qscamel/constants"
"github.com/yunify/qscamel/model"
"github.com/yunify/qscamel/utils"
)
// List will list objects and send to channel.
func List(ctx context.Context) (err error) {
if t.Status == constants.TaskStatusCreated {
o := &model.DirectoryObject{
Key: "/",
Marker: "",
}
err = model.CreateObject(ctx, o)
if err != nil {
logrus.Panic(err)
}
t.Status = constants.TaskStatusRunning
err = t.Save(ctx)
if err != nil {
logrus.Panic(err)
}
}
// Traverse already running but not finished directory object.
p := ""
for {
do, err := model.NextDirectoryObject(ctx, p)
if err != nil {
logrus.Panic(err)
}
if do == nil {
break
}
jwg.Add(1)
jc <- do
p = do.Key
}
// Traverse already running but not finished single object.
p = ""
for {
so, err := model.NextSingleObject(ctx, p)
if err != nil {
logrus.Panic(err)
}
if so == nil {
break
}
oc <- so
p = so.Key
}
// Traverse already running but not finished partial object.
p = ""
pn := -1
for {
po, err := model.NextPartialObject(ctx, p, pn)
if err != nil {
logrus.Panic(err)
}
if po == nil {
break
}
oc <- po
p = po.Key
pn = po.PartNumber
}
return
}
// listWorker will do both list and copy work.
func listWorker(ctx context.Context) {
defer utils.Recover()
for j := range jc {
logrus.Infof("Start listing job %s.", j.Key)
err := listObject(ctx, j)
if err != nil {
logrus.Errorf("List object %s failed for %v.", j.Key, err)
continue
}
logrus.Infof("Job %s listed.", j.Key)
}
}