JCS-pub/client/internal/cmdline/object.go

85 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cmdline
import (
"fmt"
"os"
"path/filepath"
"time"
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
)
// 必须添加的命令函数,用于处理对象上传。
//
// ctx: 命令上下文,提供必要的服务和环境配置。
// packageID: 上传套餐的唯一标识。
// rootPath: 本地文件系统中待上传文件的根目录。
// nodeAffinity: 偏好的节点ID列表上传任务可能会分配到这些节点上。
// 返回值: 执行过程中遇到的任何错误。
var _ = MustAddCmd(func(ctx CommandContext, packageID cdssdk.PackageID, rootPath string, nodeAffinity []cdssdk.NodeID) error {
// 记录函数开始时间,用于计算执行时间。
startTime := time.Now()
defer func() {
// 打印函数执行时间。
fmt.Printf("%v\n", time.Since(startTime).Seconds())
}()
// 模拟或获取用户ID。
userID := cdssdk.UserID(1)
// 遍历根目录下所有文件,收集待上传的文件路径。
var uploadFilePathes []string
err := filepath.WalkDir(rootPath, func(fname string, fi os.DirEntry, err error) error {
if err != nil {
return nil
}
// 仅添加非目录文件路径。
if !fi.IsDir() {
uploadFilePathes = append(uploadFilePathes, fname)
}
return nil
})
if err != nil {
// 目录遍历失败处理。
return fmt.Errorf("open directory %s failed, err: %w", rootPath, err)
}
// 根据节点亲和性列表设置首选上传节点。
var nodeAff *cdssdk.NodeID
if len(nodeAffinity) > 0 {
n := cdssdk.NodeID(nodeAffinity[0])
nodeAff = &n
}
// 创建上传对象迭代器。
objIter := iterator.NewUploadingObjectIterator(rootPath, uploadFilePathes)
// 开始上传任务。
taskID, err := ctx.Cmdline.Svc.ObjectSvc().StartUploading(userID, packageID, objIter, nodeAff)
if err != nil {
// 上传任务启动失败处理。
return fmt.Errorf("update objects to package %d failed, err: %w", packageID, err)
}
// 循环等待上传任务完成。
for {
// 每5秒检查一次上传状态。
complete, _, err := ctx.Cmdline.Svc.ObjectSvc().WaitUploading(taskID, time.Second*5)
if complete {
// 上传完成,检查是否有错误。
if err != nil {
return fmt.Errorf("uploading objects: %w", err)
}
return nil
}
// 等待过程中发生错误处理。
if err != nil {
return fmt.Errorf("wait updating: %w", err)
}
}
}, "obj", "upload")