Feat: prototype for slave driven filesystem

pull/1040/head
HFO4 4 years ago
parent 870df708bf
commit 99953825ff

@ -239,17 +239,24 @@ func (monitor *Monitor) RemoveTempFolder() {
func (monitor *Monitor) Complete(status rpc.StatusInfo) bool { func (monitor *Monitor) Complete(status rpc.StatusInfo) bool {
// 创建中转任务 // 创建中转任务
file := make([]string, 0, len(monitor.Task.StatusInfo.Files)) file := make([]string, 0, len(monitor.Task.StatusInfo.Files))
sizes := make(map[string]uint64, len(monitor.Task.StatusInfo.Files))
for i := 0; i < len(monitor.Task.StatusInfo.Files); i++ { for i := 0; i < len(monitor.Task.StatusInfo.Files); i++ {
if monitor.Task.StatusInfo.Files[i].Selected == "true" { fileInfo := monitor.Task.StatusInfo.Files[i]
file = append(file, monitor.Task.StatusInfo.Files[i].Path) if fileInfo.Selected == "true" {
file = append(file, fileInfo.Path)
size, _ := strconv.ParseUint(fileInfo.Length, 10, 64)
sizes[fileInfo.Path] = size
} }
} }
job, err := task.NewTransferTask( job, err := task.NewTransferTask(
monitor.Task.UserID, monitor.Task.UserID,
file, file,
monitor.Task.Dst, monitor.Task.Dst,
monitor.Task.Parent, monitor.Task.Parent,
true, true,
monitor.node.ID(),
sizes,
) )
if err != nil { if err != nil {
monitor.setErrorStatus(err) monitor.setErrorStatus(err)

@ -3,6 +3,7 @@ package filesystem
import ( import (
"context" "context"
"errors" "errors"
"github.com/cloudreve/Cloudreve/v3/pkg/cluster"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"
@ -134,7 +135,6 @@ func NewFileSystem(user *model.User) (*FileSystem, error) {
// 分配存储策略适配器 // 分配存储策略适配器
err := fs.DispatchHandler() err := fs.DispatchHandler()
// TODO 分配默认钩子
return fs, err return fs, err
} }
@ -159,7 +159,6 @@ func NewAnonymousFileSystem() (*FileSystem, error) {
} }
// DispatchHandler 根据存储策略分配文件适配器 // DispatchHandler 根据存储策略分配文件适配器
// TODO 完善测试
func (fs *FileSystem) DispatchHandler() error { func (fs *FileSystem) DispatchHandler() error {
var policyType string var policyType string
var currentPolicy *model.Policy var currentPolicy *model.Policy
@ -272,6 +271,11 @@ func NewFileSystemFromCallback(c *gin.Context) (*FileSystem, error) {
return fs, err return fs, err
} }
// SwitchToSlaveHandler 将负责上传的 Handler 切换为从机节点
func (fs *FileSystem) SwitchToSlaveHandler(node cluster.Node) {
}
// SetTargetFile 设置当前处理的目标文件 // SetTargetFile 设置当前处理的目标文件
func (fs *FileSystem) SetTargetFile(files *[]model.File) { func (fs *FileSystem) SetTargetFile(files *[]model.File) {
if len(fs.FileTarget) == 0 { if len(fs.FileTarget) == 0 {

@ -96,8 +96,10 @@ func Resume() {
continue continue
} }
if job != nil {
TaskPoll.Submit(job) TaskPoll.Submit(job)
} }
}
} }
// GetJobFromModel 从数据库给定模型获取任务 // GetJobFromModel 从数据库给定模型获取任务

@ -9,6 +9,7 @@ import (
"strings" "strings"
model "github.com/cloudreve/Cloudreve/v3/models" model "github.com/cloudreve/Cloudreve/v3/models"
"github.com/cloudreve/Cloudreve/v3/pkg/cluster"
"github.com/cloudreve/Cloudreve/v3/pkg/filesystem" "github.com/cloudreve/Cloudreve/v3/pkg/filesystem"
"github.com/cloudreve/Cloudreve/v3/pkg/filesystem/fsctx" "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/fsctx"
"github.com/cloudreve/Cloudreve/v3/pkg/util" "github.com/cloudreve/Cloudreve/v3/pkg/util"
@ -27,10 +28,13 @@ type TransferTask struct {
// TransferProps 中转任务属性 // TransferProps 中转任务属性
type TransferProps struct { type TransferProps struct {
Src []string `json:"src"` // 原始文件 Src []string `json:"src"` // 原始文件
SrcSizes map[string]uint64 `json:"src_size"` // 原始文件的大小信息,从机转存时使用
Parent string `json:"parent"` // 父目录 Parent string `json:"parent"` // 父目录
Dst string `json:"dst"` // 目的目录ID Dst string `json:"dst"` // 目的目录ID
// 将会保留原始文件的目录结构Src 除去 Parent 开头作为最终路径 // 将会保留原始文件的目录结构Src 除去 Parent 开头作为最终路径
TrimPath bool `json:"trim_path"` TrimPath bool `json:"trim_path"`
// 负责处理中专任务的节点ID
NodeID uint `json:"node_id"`
} }
// Props 获取任务属性 // Props 获取任务属性
@ -104,7 +108,22 @@ func (job *TransferTask) Do() {
} }
ctx := context.WithValue(context.Background(), fsctx.DisableOverwrite, true) ctx := context.WithValue(context.Background(), fsctx.DisableOverwrite, true)
if job.TaskProps.NodeID > 1 {
// 指定为从机中转
// 获取从机节点
node := cluster.Default.GetNodeByID(job.TaskProps.NodeID)
if node == nil {
job.SetErrorMsg("从机节点不可用", nil)
}
// 切换为从机节点处理上传
fs.SwitchToSlaveHandler(node)
err = fs.UploadFromStream(ctx, nil, dst, job.TaskProps.SrcSizes[file])
} else {
err = fs.UploadFromPath(ctx, file, dst) err = fs.UploadFromPath(ctx, file, dst)
}
if err != nil { if err != nil {
job.SetErrorMsg("文件转存失败", err) job.SetErrorMsg("文件转存失败", err)
} }
@ -122,7 +141,7 @@ func (job *TransferTask) Recycle() {
} }
// NewTransferTask 新建中转任务 // NewTransferTask 新建中转任务
func NewTransferTask(user uint, src []string, dst, parent string, trim bool) (Job, error) { func NewTransferTask(user uint, src []string, dst, parent string, trim bool, node uint, sizes map[string]uint64) (Job, error) {
creator, err := model.GetActiveUserByID(user) creator, err := model.GetActiveUserByID(user)
if err != nil { if err != nil {
return nil, err return nil, err
@ -135,6 +154,8 @@ func NewTransferTask(user uint, src []string, dst, parent string, trim bool) (Jo
Parent: parent, Parent: parent,
Dst: dst, Dst: dst,
TrimPath: trim, TrimPath: trim,
NodeID: node,
SrcSizes: sizes,
}, },
} }

Loading…
Cancel
Save