74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package upload
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
func (m *Manager) patch(taskID string, fn func(*taskState)) {
|
|
m.mu.Lock()
|
|
st, ok := m.tasks[taskID]
|
|
if !ok {
|
|
m.mu.Unlock()
|
|
return
|
|
}
|
|
fn(st)
|
|
st.UpdatedAt = unixFloat(time.Now())
|
|
snap := st
|
|
m.mu.Unlock()
|
|
m.persistTask(snap)
|
|
m.broadcast()
|
|
}
|
|
|
|
func (m *Manager) failTask(taskID, errMsg string) {
|
|
m.patch(taskID, func(st *taskState) {
|
|
st.Status = StatusFailed
|
|
st.SpeedBytesPerSecond = 0
|
|
st.Message = "上传失败"
|
|
st.Error = translateError(errMsg)
|
|
})
|
|
}
|
|
|
|
func (m *Manager) snapshot(st *taskState) *Task {
|
|
t := st.Task
|
|
return &t
|
|
}
|
|
|
|
func (m *Manager) popTask(taskID string) *taskState {
|
|
m.mu.Lock()
|
|
st, ok := m.tasks[taskID]
|
|
if !ok {
|
|
m.mu.Unlock()
|
|
return nil
|
|
}
|
|
cancel := st.cancel
|
|
if cancel != nil {
|
|
st.cancelMode = "delete"
|
|
}
|
|
delete(m.tasks, taskID)
|
|
m.mu.Unlock()
|
|
m.deletePersisted(taskID)
|
|
if cancel != nil {
|
|
cancel()
|
|
select {
|
|
case <-st.runDone:
|
|
case <-time.After(30 * time.Second):
|
|
}
|
|
}
|
|
return st
|
|
}
|
|
|
|
func newTaskID() string {
|
|
var b [8]byte
|
|
_, _ = rand.Read(b[:])
|
|
return hex.EncodeToString(b[:])
|
|
}
|
|
|
|
func sortTasksDesc(tasks []Task) {
|
|
sort.Slice(tasks, func(i, j int) bool {
|
|
return tasks[i].CreatedAt > tasks[j].CreatedAt
|
|
})
|
|
}
|