| @@ -83,7 +83,7 @@ func serve(configPath string) { | |||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| cons := collector.GetAll() | cons := collector.GetAll() | ||||
| nodeCons := make([]cdssdk.NodeConnectivity, 0, len(cons)) | |||||
| hubCons := make([]cdssdk.HubConnectivity, 0, len(cons)) | |||||
| for _, con := range cons { | for _, con := range cons { | ||||
| var delay *float32 | var delay *float32 | ||||
| if con.Delay != nil { | if con.Delay != nil { | ||||
| @@ -91,17 +91,17 @@ func serve(configPath string) { | |||||
| delay = &v | delay = &v | ||||
| } | } | ||||
| nodeCons = append(nodeCons, cdssdk.NodeConnectivity{ | |||||
| FromNodeID: *stgglb.Local.NodeID, | |||||
| ToNodeID: con.ToNodeID, | |||||
| Delay: delay, | |||||
| TestTime: con.TestTime, | |||||
| hubCons = append(hubCons, cdssdk.HubConnectivity{ | |||||
| FromHubID: *stgglb.Local.HubID, | |||||
| ToHubID: con.ToHubID, | |||||
| Delay: delay, | |||||
| TestTime: con.TestTime, | |||||
| }) | }) | ||||
| } | } | ||||
| _, err = coorCli.UpdateNodeConnectivities(coormq.ReqUpdateNodeConnectivities(nodeCons)) | |||||
| _, err = coorCli.UpdateHubConnectivities(coormq.ReqUpdateHubConnectivities(hubCons)) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("update node connectivities: %v", err) | |||||
| log.Warnf("update hub connectivities: %v", err) | |||||
| } | } | ||||
| }) | }) | ||||
| conCol.CollectInPlace() | conCol.CollectInPlace() | ||||
| @@ -160,7 +160,7 @@ func downloadHubConfig() coormq.GetHubConfigResp { | |||||
| } | } | ||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| cfgResp, err := coorCli.GetHubConfig(coormq.ReqGetHubConfig(cdssdk.NodeID(config.Cfg().ID))) | |||||
| cfgResp, err := coorCli.GetHubConfig(coormq.ReqGetHubConfig(cdssdk.HubID(config.Cfg().ID))) | |||||
| if err != nil { | if err != nil { | ||||
| logger.Errorf("getting hub config: %v", err) | logger.Errorf("getting hub config: %v", err) | ||||
| os.Exit(1) | os.Exit(1) | ||||
| @@ -13,7 +13,7 @@ import ( | |||||
| ) | ) | ||||
| type Config struct { | type Config struct { | ||||
| ID cdssdk.NodeID `json:"id"` | |||||
| ID cdssdk.HubID `json:"id"` | |||||
| ListenAddr string `json:"listenAddr"` | ListenAddr string `json:"listenAddr"` | ||||
| Local stgmodels.LocalMachineInfo `json:"local"` | Local stgmodels.LocalMachineInfo `json:"local"` | ||||
| GRPC *grpc.Config `json:"grpc"` | GRPC *grpc.Config `json:"grpc"` | ||||
| @@ -254,7 +254,7 @@ func (svc *Service) StartStorageCreatePackage(msg *agtmq.StartStorageCreatePacka | |||||
| } | } | ||||
| objIter := iterator.NewUploadingObjectIterator(fullPath, uploadFilePathes) | objIter := iterator.NewUploadingObjectIterator(fullPath, uploadFilePathes) | ||||
| tsk := svc.taskManager.StartNew(mytask.NewCreatePackage(msg.UserID, msg.BucketID, msg.Name, objIter, msg.NodeAffinity)) | |||||
| tsk := svc.taskManager.StartNew(mytask.NewCreatePackage(msg.UserID, msg.BucketID, msg.Name, objIter, msg.StorageAffinity)) | |||||
| return mq.ReplyOK(agtmq.NewStartStorageCreatePackageResp(tsk.ID())) | return mq.ReplyOK(agtmq.NewStartStorageCreatePackageResp(tsk.ID())) | ||||
| } | } | ||||
| @@ -23,12 +23,12 @@ type CreatePackageResult struct { | |||||
| // CreatePackage 定义创建包的任务结构 | // CreatePackage 定义创建包的任务结构 | ||||
| // 包含用户ID、存储桶ID、包名称、上传对象的迭代器、节点亲和性以及任务结果 | // 包含用户ID、存储桶ID、包名称、上传对象的迭代器、节点亲和性以及任务结果 | ||||
| type CreatePackage struct { | type CreatePackage struct { | ||||
| userID cdssdk.UserID | |||||
| bucketID cdssdk.BucketID | |||||
| name string | |||||
| objIter iterator.UploadingObjectIterator | |||||
| nodeAffinity *cdssdk.NodeID | |||||
| Result CreatePackageResult | |||||
| userID cdssdk.UserID | |||||
| bucketID cdssdk.BucketID | |||||
| name string | |||||
| objIter iterator.UploadingObjectIterator | |||||
| stgAffinity cdssdk.StorageID | |||||
| Result CreatePackageResult | |||||
| } | } | ||||
| // NewCreatePackage 创建一个新的CreatePackage实例 | // NewCreatePackage 创建一个新的CreatePackage实例 | ||||
| @@ -36,15 +36,15 @@ type CreatePackage struct { | |||||
| // bucketID: 存储桶ID | // bucketID: 存储桶ID | ||||
| // name: 包名称 | // name: 包名称 | ||||
| // objIter: 上传对象的迭代器 | // objIter: 上传对象的迭代器 | ||||
| // nodeAffinity: 节点亲和性,指定包应该创建在哪个节点上(可选) | |||||
| // stgAffinity: 节点亲和性,指定包应该创建在哪个节点上(可选) | |||||
| // 返回CreatePackage实例的指针 | // 返回CreatePackage实例的指针 | ||||
| func NewCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, objIter iterator.UploadingObjectIterator, nodeAffinity *cdssdk.NodeID) *CreatePackage { | |||||
| func NewCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, objIter iterator.UploadingObjectIterator, stgAffinity cdssdk.StorageID) *CreatePackage { | |||||
| return &CreatePackage{ | return &CreatePackage{ | ||||
| userID: userID, | |||||
| bucketID: bucketID, | |||||
| name: name, | |||||
| objIter: objIter, | |||||
| nodeAffinity: nodeAffinity, | |||||
| userID: userID, | |||||
| bucketID: bucketID, | |||||
| name: name, | |||||
| objIter: objIter, | |||||
| stgAffinity: stgAffinity, | |||||
| } | } | ||||
| } | } | ||||
| @@ -84,7 +84,7 @@ func (t *CreatePackage) Execute(task *task.Task[TaskContext], ctx TaskContext, c | |||||
| return | return | ||||
| } | } | ||||
| uploadRet, err := cmd.NewUploadObjects(t.userID, createResp.Package.PackageID, t.objIter, t.nodeAffinity).Execute(&cmd.UploadObjectsContext{ | |||||
| uploadRet, err := cmd.NewUploadObjects(t.userID, createResp.Package.PackageID, t.objIter, t.stgAffinity).Execute(&cmd.UploadObjectsContext{ | |||||
| Distlock: ctx.distlock, | Distlock: ctx.distlock, | ||||
| Connectivity: ctx.connectivity, | Connectivity: ctx.connectivity, | ||||
| StgMgr: ctx.stgMgr, | StgMgr: ctx.stgMgr, | ||||
| @@ -182,7 +182,7 @@ func (t *StorageLoadPackage) downloadOne(coorCli *coormq.Client, shardStore type | |||||
| func (t *StorageLoadPackage) downloadNoneOrRepObject(shardStore types.ShardStore, obj stgmod.ObjectDetail) (io.ReadCloser, error) { | func (t *StorageLoadPackage) downloadNoneOrRepObject(shardStore types.ShardStore, obj stgmod.ObjectDetail) (io.ReadCloser, error) { | ||||
| if len(obj.Blocks) == 0 && len(obj.PinnedAt) == 0 { | if len(obj.Blocks) == 0 && len(obj.PinnedAt) == 0 { | ||||
| return nil, fmt.Errorf("no node has this object") | |||||
| return nil, fmt.Errorf("no storage has this object") | |||||
| } | } | ||||
| file, err := shardStore.Open(types.NewOpen(obj.Object.FileHash)) | file, err := shardStore.Open(types.NewOpen(obj.Object.FileHash)) | ||||
| @@ -194,12 +194,12 @@ func (t *StorageLoadPackage) downloadNoneOrRepObject(shardStore types.ShardStore | |||||
| } | } | ||||
| func (t *StorageLoadPackage) downloadECObject(coorCli *coormq.Client, shardStore types.ShardStore, obj stgmod.ObjectDetail, ecRed *cdssdk.ECRedundancy) (io.ReadCloser, []stgmod.ObjectBlock, error) { | func (t *StorageLoadPackage) downloadECObject(coorCli *coormq.Client, shardStore types.ShardStore, obj stgmod.ObjectDetail, ecRed *cdssdk.ECRedundancy) (io.ReadCloser, []stgmod.ObjectBlock, error) { | ||||
| allNodes, err := t.sortDownloadNodes(coorCli, obj) | |||||
| allStorages, err := t.sortDownloadStorages(coorCli, obj) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, nil, err | return nil, nil, err | ||||
| } | } | ||||
| bsc, blocks := t.getMinReadingBlockSolution(allNodes, ecRed.K) | |||||
| osc, _ := t.getMinReadingObjectSolution(allNodes, ecRed.K) | |||||
| bsc, blocks := t.getMinReadingBlockSolution(allStorages, ecRed.K) | |||||
| osc, _ := t.getMinReadingObjectSolution(allStorages, ecRed.K) | |||||
| if bsc < osc { | if bsc < osc { | ||||
| var fileStrs []io.ReadCloser | var fileStrs []io.ReadCloser | ||||
| @@ -251,7 +251,7 @@ type downloadStorageInfo struct { | |||||
| Distance float64 | Distance float64 | ||||
| } | } | ||||
| func (t *StorageLoadPackage) sortDownloadNodes(coorCli *coormq.Client, obj stgmod.ObjectDetail) ([]*downloadStorageInfo, error) { | |||||
| func (t *StorageLoadPackage) sortDownloadStorages(coorCli *coormq.Client, obj stgmod.ObjectDetail) ([]*downloadStorageInfo, error) { | |||||
| var stgIDs []cdssdk.StorageID | var stgIDs []cdssdk.StorageID | ||||
| for _, id := range obj.PinnedAt { | for _, id := range obj.PinnedAt { | ||||
| if !lo.Contains(stgIDs, id) { | if !lo.Contains(stgIDs, id) { | ||||
| @@ -273,37 +273,37 @@ func (t *StorageLoadPackage) sortDownloadNodes(coorCli *coormq.Client, obj stgmo | |||||
| allStgs[stg.Storage.StorageID] = *stg | allStgs[stg.Storage.StorageID] = *stg | ||||
| } | } | ||||
| downloadNodeMap := make(map[cdssdk.StorageID]*downloadStorageInfo) | |||||
| downloadStorageMap := make(map[cdssdk.StorageID]*downloadStorageInfo) | |||||
| for _, id := range obj.PinnedAt { | for _, id := range obj.PinnedAt { | ||||
| node, ok := downloadNodeMap[id] | |||||
| storage, ok := downloadStorageMap[id] | |||||
| if !ok { | if !ok { | ||||
| mod := allStgs[id] | mod := allStgs[id] | ||||
| node = &downloadStorageInfo{ | |||||
| storage = &downloadStorageInfo{ | |||||
| Storage: mod, | Storage: mod, | ||||
| ObjectPinned: true, | ObjectPinned: true, | ||||
| Distance: t.getNodeDistance(mod), | |||||
| Distance: t.getStorageDistance(mod), | |||||
| } | } | ||||
| downloadNodeMap[id] = node | |||||
| downloadStorageMap[id] = storage | |||||
| } | } | ||||
| node.ObjectPinned = true | |||||
| storage.ObjectPinned = true | |||||
| } | } | ||||
| for _, b := range obj.Blocks { | for _, b := range obj.Blocks { | ||||
| node, ok := downloadNodeMap[b.StorageID] | |||||
| storage, ok := downloadStorageMap[b.StorageID] | |||||
| if !ok { | if !ok { | ||||
| mod := allStgs[b.StorageID] | mod := allStgs[b.StorageID] | ||||
| node = &downloadStorageInfo{ | |||||
| storage = &downloadStorageInfo{ | |||||
| Storage: mod, | Storage: mod, | ||||
| Distance: t.getNodeDistance(mod), | |||||
| Distance: t.getStorageDistance(mod), | |||||
| } | } | ||||
| downloadNodeMap[b.StorageID] = node | |||||
| downloadStorageMap[b.StorageID] = storage | |||||
| } | } | ||||
| node.Blocks = append(node.Blocks, b) | |||||
| storage.Blocks = append(storage.Blocks, b) | |||||
| } | } | ||||
| return sort2.Sort(lo.Values(downloadNodeMap), func(left, right *downloadStorageInfo) int { | |||||
| return sort2.Sort(lo.Values(downloadStorageMap), func(left, right *downloadStorageInfo) int { | |||||
| return sort2.Cmp(left.Distance, right.Distance) | return sort2.Cmp(left.Distance, right.Distance) | ||||
| }), nil | }), nil | ||||
| } | } | ||||
| @@ -313,11 +313,11 @@ type downloadBlock struct { | |||||
| Block stgmod.ObjectBlock | Block stgmod.ObjectBlock | ||||
| } | } | ||||
| func (t *StorageLoadPackage) getMinReadingBlockSolution(sortedNodes []*downloadStorageInfo, k int) (float64, []downloadBlock) { | |||||
| func (t *StorageLoadPackage) getMinReadingBlockSolution(sortedStorages []*downloadStorageInfo, k int) (float64, []downloadBlock) { | |||||
| gotBlocksMap := bitmap.Bitmap64(0) | gotBlocksMap := bitmap.Bitmap64(0) | ||||
| var gotBlocks []downloadBlock | var gotBlocks []downloadBlock | ||||
| dist := float64(0.0) | dist := float64(0.0) | ||||
| for _, n := range sortedNodes { | |||||
| for _, n := range sortedStorages { | |||||
| for _, b := range n.Blocks { | for _, b := range n.Blocks { | ||||
| if !gotBlocksMap.Get(b.Index) { | if !gotBlocksMap.Get(b.Index) { | ||||
| gotBlocks = append(gotBlocks, downloadBlock{ | gotBlocks = append(gotBlocks, downloadBlock{ | ||||
| @@ -337,10 +337,10 @@ func (t *StorageLoadPackage) getMinReadingBlockSolution(sortedNodes []*downloadS | |||||
| return math.MaxFloat64, gotBlocks | return math.MaxFloat64, gotBlocks | ||||
| } | } | ||||
| func (t *StorageLoadPackage) getMinReadingObjectSolution(sortedNodes []*downloadStorageInfo, k int) (float64, *stgmod.StorageDetail) { | |||||
| func (t *StorageLoadPackage) getMinReadingObjectSolution(sortedStorages []*downloadStorageInfo, k int) (float64, *stgmod.StorageDetail) { | |||||
| dist := math.MaxFloat64 | dist := math.MaxFloat64 | ||||
| var downloadStg *stgmod.StorageDetail | var downloadStg *stgmod.StorageDetail | ||||
| for _, n := range sortedNodes { | |||||
| for _, n := range sortedStorages { | |||||
| if n.ObjectPinned && float64(k)*n.Distance < dist { | if n.ObjectPinned && float64(k)*n.Distance < dist { | ||||
| dist = float64(k) * n.Distance | dist = float64(k) * n.Distance | ||||
| stg := n.Storage | stg := n.Storage | ||||
| @@ -351,16 +351,16 @@ func (t *StorageLoadPackage) getMinReadingObjectSolution(sortedNodes []*download | |||||
| return dist, downloadStg | return dist, downloadStg | ||||
| } | } | ||||
| func (t *StorageLoadPackage) getNodeDistance(stg stgmod.StorageDetail) float64 { | |||||
| if stgglb.Local.NodeID != nil { | |||||
| if stg.MasterHub.NodeID == *stgglb.Local.NodeID { | |||||
| return consts.NodeDistanceSameNode | |||||
| func (t *StorageLoadPackage) getStorageDistance(stg stgmod.StorageDetail) float64 { | |||||
| if stgglb.Local.HubID != nil { | |||||
| if stg.MasterHub.HubID == *stgglb.Local.HubID { | |||||
| return consts.StorageDistanceSameStorage | |||||
| } | } | ||||
| } | } | ||||
| if stg.MasterHub.LocationID == stgglb.Local.LocationID { | if stg.MasterHub.LocationID == stgglb.Local.LocationID { | ||||
| return consts.NodeDistanceSameLocation | |||||
| return consts.StorageDistanceSameLocation | |||||
| } | } | ||||
| return consts.NodeDistanceOther | |||||
| return consts.StorageDistanceOther | |||||
| } | } | ||||
| @@ -68,14 +68,14 @@ func loadByID(cmdCtx *CommandContext, pkgID cdssdk.PackageID, stgID cdssdk.Stora | |||||
| userID := cdssdk.UserID(1) | userID := cdssdk.UserID(1) | ||||
| startTime := time.Now() | startTime := time.Now() | ||||
| nodeID, taskID, err := cmdCtx.Cmdline.Svc.StorageSvc().StartStorageLoadPackage(userID, pkgID, stgID) | |||||
| hubID, taskID, err := cmdCtx.Cmdline.Svc.StorageSvc().StartStorageLoadPackage(userID, pkgID, stgID) | |||||
| if err != nil { | if err != nil { | ||||
| fmt.Println(err) | fmt.Println(err) | ||||
| return | return | ||||
| } | } | ||||
| for { | for { | ||||
| complete, fullPath, err := cmdCtx.Cmdline.Svc.StorageSvc().WaitStorageLoadPackage(nodeID, taskID, time.Second*10) | |||||
| complete, fullPath, err := cmdCtx.Cmdline.Svc.StorageSvc().WaitStorageLoadPackage(hubID, taskID, time.Second*10) | |||||
| if err != nil { | if err != nil { | ||||
| fmt.Println(err) | fmt.Println(err) | ||||
| return | return | ||||
| @@ -15,9 +15,9 @@ import ( | |||||
| // ctx: 命令上下文,提供必要的服务和环境配置。 | // ctx: 命令上下文,提供必要的服务和环境配置。 | ||||
| // packageID: 上传套餐的唯一标识。 | // packageID: 上传套餐的唯一标识。 | ||||
| // rootPath: 本地文件系统中待上传文件的根目录。 | // rootPath: 本地文件系统中待上传文件的根目录。 | ||||
| // nodeAffinity: 偏好的节点ID列表,上传任务可能会分配到这些节点上。 | |||||
| // storageAffinity: 偏好的节点ID列表,上传任务可能会分配到这些节点上。 | |||||
| // 返回值: 执行过程中遇到的任何错误。 | // 返回值: 执行过程中遇到的任何错误。 | ||||
| var _ = MustAddCmd(func(ctx CommandContext, packageID cdssdk.PackageID, rootPath string, nodeAffinity []cdssdk.NodeID) error { | |||||
| var _ = MustAddCmd(func(ctx CommandContext, packageID cdssdk.PackageID, rootPath string, storageAffinity []cdssdk.StorageID) error { | |||||
| // 记录函数开始时间,用于计算执行时间。 | // 记录函数开始时间,用于计算执行时间。 | ||||
| startTime := time.Now() | startTime := time.Now() | ||||
| defer func() { | defer func() { | ||||
| @@ -48,16 +48,15 @@ var _ = MustAddCmd(func(ctx CommandContext, packageID cdssdk.PackageID, rootPath | |||||
| } | } | ||||
| // 根据节点亲和性列表设置首选上传节点。 | // 根据节点亲和性列表设置首选上传节点。 | ||||
| var nodeAff *cdssdk.NodeID | |||||
| if len(nodeAffinity) > 0 { | |||||
| n := cdssdk.NodeID(nodeAffinity[0]) | |||||
| nodeAff = &n | |||||
| var storageAff cdssdk.StorageID | |||||
| if len(storageAffinity) > 0 { | |||||
| storageAff = storageAffinity[0] | |||||
| } | } | ||||
| // 创建上传对象迭代器。 | // 创建上传对象迭代器。 | ||||
| objIter := iterator.NewUploadingObjectIterator(rootPath, uploadFilePathes) | objIter := iterator.NewUploadingObjectIterator(rootPath, uploadFilePathes) | ||||
| // 开始上传任务。 | // 开始上传任务。 | ||||
| taskID, err := ctx.Cmdline.Svc.ObjectSvc().StartUploading(userID, packageID, objIter, nodeAff) | |||||
| taskID, err := ctx.Cmdline.Svc.ObjectSvc().StartUploading(userID, packageID, objIter, storageAff) | |||||
| if err != nil { | if err != nil { | ||||
| // 上传任务启动失败处理。 | // 上传任务启动失败处理。 | ||||
| return fmt.Errorf("update objects to package %d failed, err: %w", packageID, err) | return fmt.Errorf("update objects to package %d failed, err: %w", packageID, err) | ||||
| @@ -176,7 +176,7 @@ func PackageGetCachedStorages(ctx CommandContext, packageID cdssdk.PackageID) er | |||||
| resp, err := ctx.Cmdline.Svc.PackageSvc().GetCachedStorages(userID, packageID) | resp, err := ctx.Cmdline.Svc.PackageSvc().GetCachedStorages(userID, packageID) | ||||
| fmt.Printf("resp: %v\n", resp) | fmt.Printf("resp: %v\n", resp) | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("get package %d cached nodes failed, err: %w", packageID, err) | |||||
| return fmt.Errorf("get package %d cached storages failed, err: %w", packageID, err) | |||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -193,10 +193,10 @@ func PackageGetCachedStorages(ctx CommandContext, packageID cdssdk.PackageID) er | |||||
| // error - 操作过程中发生的任何错误。 | // error - 操作过程中发生的任何错误。 | ||||
| func PackageGetLoadedStorages(ctx CommandContext, packageID cdssdk.PackageID) error { | func PackageGetLoadedStorages(ctx CommandContext, packageID cdssdk.PackageID) error { | ||||
| userID := cdssdk.UserID(1) | userID := cdssdk.UserID(1) | ||||
| nodeIDs, err := ctx.Cmdline.Svc.PackageSvc().GetLoadedStorages(userID, packageID) | |||||
| fmt.Printf("nodeIDs: %v\n", nodeIDs) | |||||
| hubIDs, err := ctx.Cmdline.Svc.PackageSvc().GetLoadedStorages(userID, packageID) | |||||
| fmt.Printf("hubIDs: %v\n", hubIDs) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("get package %d loaded nodes failed, err: %w", packageID, err) | |||||
| return fmt.Errorf("get package %d loaded storages failed, err: %w", packageID, err) | |||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -16,7 +16,7 @@ import ( | |||||
| ) | ) | ||||
| func init() { | func init() { | ||||
| var nodeID int64 | |||||
| var stgID int64 | |||||
| cmd := &cobra.Command{ | cmd := &cobra.Command{ | ||||
| Use: "put [local] [remote]", | Use: "put [local] [remote]", | ||||
| Short: "Upload files to CDS", | Short: "Upload files to CDS", | ||||
| @@ -90,14 +90,13 @@ func init() { | |||||
| return | return | ||||
| } | } | ||||
| var nodeAff *cdssdk.NodeID | |||||
| if nodeID != 0 { | |||||
| id := cdssdk.NodeID(nodeID) | |||||
| nodeAff = &id | |||||
| var storageAff cdssdk.StorageID | |||||
| if stgID != 0 { | |||||
| storageAff = cdssdk.StorageID(stgID) | |||||
| } | } | ||||
| objIter := iterator.NewUploadingObjectIterator(local, uploadFilePathes) | objIter := iterator.NewUploadingObjectIterator(local, uploadFilePathes) | ||||
| taskID, err := cmdCtx.Cmdline.Svc.ObjectSvc().StartUploading(userID, pkg.PackageID, objIter, nodeAff) | |||||
| taskID, err := cmdCtx.Cmdline.Svc.ObjectSvc().StartUploading(userID, pkg.PackageID, objIter, storageAff) | |||||
| if err != nil { | if err != nil { | ||||
| fmt.Printf("start uploading objects: %v\n", err) | fmt.Printf("start uploading objects: %v\n", err) | ||||
| return | return | ||||
| @@ -118,7 +117,7 @@ func init() { | |||||
| fmt.Printf("Put %v files (%v) to %s in %v.\n", fileCount, bytesize.ByteSize(totalSize), remote, time.Since(startTime)) | fmt.Printf("Put %v files (%v) to %s in %v.\n", fileCount, bytesize.ByteSize(totalSize), remote, time.Since(startTime)) | ||||
| }, | }, | ||||
| } | } | ||||
| cmd.Flags().Int64VarP(&nodeID, "node", "n", 0, "node affinity") | |||||
| cmd.Flags().Int64VarP(&stgID, "storage", "s", 0, "storage affinity") | |||||
| rootCmd.AddCommand(cmd) | rootCmd.AddCommand(cmd) | ||||
| } | } | ||||
| @@ -20,14 +20,14 @@ func StorageLoadPackage(ctx CommandContext, packageID cdssdk.PackageID, storageI | |||||
| }() | }() | ||||
| // 开始加载包到存储系统 | // 开始加载包到存储系统 | ||||
| nodeID, taskID, err := ctx.Cmdline.Svc.StorageSvc().StartStorageLoadPackage(1, packageID, storageID) | |||||
| hubID, taskID, err := ctx.Cmdline.Svc.StorageSvc().StartStorageLoadPackage(1, packageID, storageID) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("start loading package to storage: %w", err) | return fmt.Errorf("start loading package to storage: %w", err) | ||||
| } | } | ||||
| // 循环等待加载完成 | // 循环等待加载完成 | ||||
| for { | for { | ||||
| complete, fullPath, err := ctx.Cmdline.Svc.StorageSvc().WaitStorageLoadPackage(nodeID, taskID, time.Second*10) | |||||
| complete, fullPath, err := ctx.Cmdline.Svc.StorageSvc().WaitStorageLoadPackage(hubID, taskID, time.Second*10) | |||||
| if complete { | if complete { | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("moving complete with: %w", err) | return fmt.Errorf("moving complete with: %w", err) | ||||
| @@ -58,14 +58,14 @@ func StorageCreatePackage(ctx CommandContext, bucketID cdssdk.BucketID, name str | |||||
| }() | }() | ||||
| // 开始创建并上传包到存储系统 | // 开始创建并上传包到存储系统 | ||||
| nodeID, taskID, err := ctx.Cmdline.Svc.StorageSvc().StartStorageCreatePackage(1, bucketID, name, storageID, path, nil) | |||||
| hubID, taskID, err := ctx.Cmdline.Svc.StorageSvc().StartStorageCreatePackage(1, bucketID, name, storageID, path, 0) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("start storage uploading package: %w", err) | return fmt.Errorf("start storage uploading package: %w", err) | ||||
| } | } | ||||
| // 循环等待上传完成 | // 循环等待上传完成 | ||||
| for { | for { | ||||
| complete, packageID, err := ctx.Cmdline.Svc.StorageSvc().WaitStorageCreatePackage(nodeID, taskID, time.Second*10) | |||||
| complete, packageID, err := ctx.Cmdline.Svc.StorageSvc().WaitStorageCreatePackage(hubID, taskID, time.Second*10) | |||||
| if complete { | if complete { | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("uploading complete with: %w", err) | return fmt.Errorf("uploading complete with: %w", err) | ||||
| @@ -31,7 +31,7 @@ func init() { | |||||
| } | } | ||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.NodeID{1, 2})) | |||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.HubID{1, 2})) | |||||
| if err != nil { | if err != nil { | ||||
| panic(err) | panic(err) | ||||
| } | } | ||||
| @@ -131,7 +131,7 @@ func init() { | |||||
| } | } | ||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.NodeID{1, 2})) | |||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.HubID{1, 2})) | |||||
| if err != nil { | if err != nil { | ||||
| panic(err) | panic(err) | ||||
| } | } | ||||
| @@ -173,7 +173,7 @@ func init() { | |||||
| } | } | ||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.NodeID{1, 2})) | |||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.HubID{1, 2})) | |||||
| if err != nil { | if err != nil { | ||||
| panic(err) | panic(err) | ||||
| } | } | ||||
| @@ -215,7 +215,7 @@ func init() { | |||||
| } | } | ||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.NodeID{1, 2})) | |||||
| nodes, err := coorCli.GetNodes(coormq.NewGetNodes([]cdssdk.HubID{1, 2})) | |||||
| if err != nil { | if err != nil { | ||||
| panic(err) | panic(err) | ||||
| } | } | ||||
| @@ -10,37 +10,37 @@ import ( | |||||
| "gitlink.org.cn/cloudream/common/sdks/storage/cdsapi" | "gitlink.org.cn/cloudream/common/sdks/storage/cdsapi" | ||||
| ) | ) | ||||
| type NodeService struct { | |||||
| type HubService struct { | |||||
| *Server | *Server | ||||
| } | } | ||||
| func (s *Server) NodeSvc() *NodeService { | |||||
| return &NodeService{ | |||||
| func (s *Server) HubSvc() *HubService { | |||||
| return &HubService{ | |||||
| Server: s, | Server: s, | ||||
| } | } | ||||
| } | } | ||||
| type GetNodesReq struct { | |||||
| NodeIDs *[]cdssdk.NodeID `form:"nodeIDs" binding:"required"` | |||||
| type GetHubsReq struct { | |||||
| HubIDs *[]cdssdk.HubID `form:"hubIDs" binding:"required"` | |||||
| } | } | ||||
| type GetNodesResp = cdsapi.NodeGetNodesResp | |||||
| type GetHubsResp = cdsapi.HubGetHubsResp | |||||
| func (s *ObjectService) GetNodes(ctx *gin.Context) { | |||||
| log := logger.WithField("HTTP", "Node.GetNodes") | |||||
| func (s *ObjectService) GetHubs(ctx *gin.Context) { | |||||
| log := logger.WithField("HTTP", "Hub.GetHubs") | |||||
| var req GetNodesReq | |||||
| var req GetHubsReq | |||||
| if err := ctx.ShouldBindQuery(&req); err != nil { | if err := ctx.ShouldBindQuery(&req); err != nil { | ||||
| log.Warnf("binding body: %s", err.Error()) | log.Warnf("binding body: %s", err.Error()) | ||||
| ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument")) | ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument")) | ||||
| return | return | ||||
| } | } | ||||
| nodes, err := s.svc.NodeSvc().GetNodes(*req.NodeIDs) | |||||
| hubs, err := s.svc.HubSvc().GetHubs(*req.HubIDs) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("getting nodes: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed")) | |||||
| log.Warnf("getting hubs: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get hubs failed")) | |||||
| return | return | ||||
| } | } | ||||
| ctx.JSON(http.StatusOK, OK(GetNodesResp{Nodes: nodes})) | |||||
| ctx.JSON(http.StatusOK, OK(GetHubsResp{Hubs: hubs})) | |||||
| } | } | ||||
| @@ -45,7 +45,7 @@ func (s *ObjectService) Upload(ctx *gin.Context) { | |||||
| objIter := mapMultiPartFileToUploadingObject(req.Files) | objIter := mapMultiPartFileToUploadingObject(req.Files) | ||||
| taskID, err := s.svc.ObjectSvc().StartUploading(req.Info.UserID, req.Info.PackageID, objIter, req.Info.NodeAffinity) | |||||
| taskID, err := s.svc.ObjectSvc().StartUploading(req.Info.UserID, req.Info.PackageID, objIter, req.Info.StorageAffinity) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("start uploading object task: %s", err.Error()) | log.Warnf("start uploading object task: %s", err.Error()) | ||||
| @@ -143,8 +143,8 @@ func (s *PackageService) GetCachedStorages(ctx *gin.Context) { | |||||
| resp, err := s.svc.PackageSvc().GetCachedStorages(req.UserID, req.PackageID) | resp, err := s.svc.PackageSvc().GetCachedStorages(req.UserID, req.PackageID) | ||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("get package cached nodes failed: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached nodes failed")) | |||||
| log.Warnf("get package cached storages failed: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached storages failed")) | |||||
| return | return | ||||
| } | } | ||||
| @@ -164,8 +164,8 @@ func (s *PackageService) GetLoadedStorages(ctx *gin.Context) { | |||||
| stgIDs, err := s.svc.PackageSvc().GetLoadedStorages(req.UserID, req.PackageID) | stgIDs, err := s.svc.PackageSvc().GetLoadedStorages(req.UserID, req.PackageID) | ||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("get package loaded nodes failed: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package loaded nodes failed")) | |||||
| log.Warnf("get package loaded storages failed: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package loaded storages failed")) | |||||
| return | return | ||||
| } | } | ||||
| @@ -32,7 +32,7 @@ func (s *StorageService) LoadPackage(ctx *gin.Context) { | |||||
| return | return | ||||
| } | } | ||||
| nodeID, taskID, err := s.svc.StorageSvc().StartStorageLoadPackage(req.UserID, req.PackageID, req.StorageID) | |||||
| hubID, taskID, err := s.svc.StorageSvc().StartStorageLoadPackage(req.UserID, req.PackageID, req.StorageID) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("start storage load package: %s", err.Error()) | log.Warnf("start storage load package: %s", err.Error()) | ||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, fmt.Sprintf("start loading: %v", err))) | ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, fmt.Sprintf("start loading: %v", err))) | ||||
| @@ -40,7 +40,7 @@ func (s *StorageService) LoadPackage(ctx *gin.Context) { | |||||
| } | } | ||||
| for { | for { | ||||
| complete, ret, err := s.svc.StorageSvc().WaitStorageLoadPackage(nodeID, taskID, time.Second*10) | |||||
| complete, ret, err := s.svc.StorageSvc().WaitStorageLoadPackage(hubID, taskID, time.Second*10) | |||||
| if complete { | if complete { | ||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("loading complete with: %s", err.Error()) | log.Warnf("loading complete with: %s", err.Error()) | ||||
| @@ -75,8 +75,8 @@ func (s *StorageService) CreatePackage(ctx *gin.Context) { | |||||
| return | return | ||||
| } | } | ||||
| nodeID, taskID, err := s.svc.StorageSvc().StartStorageCreatePackage( | |||||
| req.UserID, req.BucketID, req.Name, req.StorageID, req.Path, req.NodeAffinity) | |||||
| hubID, taskID, err := s.svc.StorageSvc().StartStorageCreatePackage( | |||||
| req.UserID, req.BucketID, req.Name, req.StorageID, req.Path, req.StorageAffinity) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("start storage create package: %s", err.Error()) | log.Warnf("start storage create package: %s", err.Error()) | ||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "storage create package failed")) | ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "storage create package failed")) | ||||
| @@ -84,7 +84,7 @@ func (s *StorageService) CreatePackage(ctx *gin.Context) { | |||||
| } | } | ||||
| for { | for { | ||||
| complete, packageID, err := s.svc.StorageSvc().WaitStorageCreatePackage(nodeID, taskID, time.Second*10) | |||||
| complete, packageID, err := s.svc.StorageSvc().WaitStorageCreatePackage(hubID, taskID, time.Second*10) | |||||
| if complete { | if complete { | ||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("creating complete with: %s", err.Error()) | log.Warnf("creating complete with: %s", err.Error()) | ||||
| @@ -123,43 +123,43 @@ func (s *TempService) GetObjectDetail(ctx *gin.Context) { | |||||
| return | return | ||||
| } | } | ||||
| loadedNodeIDs, err := s.svc.PackageSvc().GetLoadedNodes(1, details.Object.PackageID) | |||||
| loadedHubIDs, err := s.svc.PackageSvc().GetLoadedNodes(1, details.Object.PackageID) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("getting loaded nodes: %s", err.Error()) | log.Warnf("getting loaded nodes: %s", err.Error()) | ||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get loaded nodes failed")) | ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get loaded nodes failed")) | ||||
| return | return | ||||
| } | } | ||||
| var allNodeIDs []cdssdk.NodeID | |||||
| allNodeIDs = append(allNodeIDs, details.PinnedAt...) | |||||
| var allHubIDs []cdssdk.HubID | |||||
| allHubIDs = append(allHubIDs, details.PinnedAt...) | |||||
| for _, b := range details.Blocks { | for _, b := range details.Blocks { | ||||
| allNodeIDs = append(allNodeIDs, b.StorageID) | |||||
| allHubIDs = append(allHubIDs, b.StorageID) | |||||
| } | } | ||||
| allNodeIDs = append(allNodeIDs, loadedNodeIDs...) | |||||
| allHubIDs = append(allHubIDs, loadedHubIDs...) | |||||
| allNodeIDs = lo.Uniq(allNodeIDs) | |||||
| allHubIDs = lo.Uniq(allHubIDs) | |||||
| getNodes, err := s.svc.NodeSvc().GetNodes(allNodeIDs) | |||||
| getNodes, err := s.svc.NodeSvc().GetNodes(allHubIDs) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("getting nodes: %s", err.Error()) | log.Warnf("getting nodes: %s", err.Error()) | ||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed")) | ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed")) | ||||
| return | return | ||||
| } | } | ||||
| allNodes := make(map[cdssdk.NodeID]*cdssdk.Node) | |||||
| allNodes := make(map[cdssdk.HubID]*cdssdk.Node) | |||||
| for _, n := range getNodes { | for _, n := range getNodes { | ||||
| n2 := n | n2 := n | ||||
| allNodes[n.NodeID] = &n2 | |||||
| allNodes[n.HubID] = &n2 | |||||
| } | } | ||||
| var blocks []ObjectBlockDetail | var blocks []ObjectBlockDetail | ||||
| for _, nodeID := range details.PinnedAt { | |||||
| for _, hubID := range details.PinnedAt { | |||||
| blocks = append(blocks, ObjectBlockDetail{ | blocks = append(blocks, ObjectBlockDetail{ | ||||
| Type: "Rep", | Type: "Rep", | ||||
| FileHash: details.Object.FileHash, | FileHash: details.Object.FileHash, | ||||
| LocationType: "Agent", | LocationType: "Agent", | ||||
| LocationName: allNodes[nodeID].Name, | |||||
| LocationName: allNodes[hubID].Name, | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -198,12 +198,12 @@ func (s *TempService) GetObjectDetail(ctx *gin.Context) { | |||||
| } | } | ||||
| } | } | ||||
| for _, nodeID := range loadedNodeIDs { | |||||
| for _, hubID := range loadedHubIDs { | |||||
| blocks = append(blocks, ObjectBlockDetail{ | blocks = append(blocks, ObjectBlockDetail{ | ||||
| Type: "Rep", | Type: "Rep", | ||||
| FileHash: details.Object.FileHash, | FileHash: details.Object.FileHash, | ||||
| LocationType: "Storage", | LocationType: "Storage", | ||||
| LocationName: allNodes[nodeID].Name, | |||||
| LocationName: allNodes[hubID].Name, | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -258,9 +258,9 @@ func (s *TempService) GetDatabaseAll(ctx *gin.Context) { | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed")) | ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed")) | ||||
| return | return | ||||
| } | } | ||||
| allNodes := make(map[cdssdk.NodeID]cdssdk.Node) | |||||
| allNodes := make(map[cdssdk.HubID]cdssdk.Node) | |||||
| for _, n := range nodes { | for _, n := range nodes { | ||||
| allNodes[n.NodeID] = n | |||||
| allNodes[n.HubID] = n | |||||
| } | } | ||||
| bkts := make(map[cdssdk.BucketID]*BucketDetail) | bkts := make(map[cdssdk.BucketID]*BucketDetail) | ||||
| @@ -290,8 +290,8 @@ func (s *TempService) GetDatabaseAll(ctx *gin.Context) { | |||||
| return | return | ||||
| } | } | ||||
| for _, nodeID := range loaded { | |||||
| p.Loaded = append(p.Loaded, allNodes[nodeID]) | |||||
| for _, hubID := range loaded { | |||||
| p.Loaded = append(p.Loaded, allNodes[hubID]) | |||||
| } | } | ||||
| pkgs[pkg.PackageID] = &p | pkgs[pkg.PackageID] = &p | ||||
| @@ -310,13 +310,13 @@ func (s *TempService) GetDatabaseAll(ctx *gin.Context) { | |||||
| for _, obj := range db.Objects { | for _, obj := range db.Objects { | ||||
| bkts[pkgs[obj.Object.PackageID].Package.BucketID].ObjectCount++ | bkts[pkgs[obj.Object.PackageID].Package.BucketID].ObjectCount++ | ||||
| for _, nodeID := range obj.PinnedAt { | |||||
| for _, hubID := range obj.PinnedAt { | |||||
| blocks = append(blocks, ObjectBlockDetail{ | blocks = append(blocks, ObjectBlockDetail{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Type: "Rep", | Type: "Rep", | ||||
| FileHash: obj.Object.FileHash, | FileHash: obj.Object.FileHash, | ||||
| LocationType: "Agent", | LocationType: "Agent", | ||||
| LocationName: allNodes[nodeID].Name, | |||||
| LocationName: allNodes[hubID].Name, | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -364,7 +364,7 @@ func (s *TempService) GetDatabaseAll(ctx *gin.Context) { | |||||
| Type: "Rep", | Type: "Rep", | ||||
| FileHash: obj.Object.FileHash, | FileHash: obj.Object.FileHash, | ||||
| LocationType: "Storage", | LocationType: "Storage", | ||||
| LocationName: allNodes[node.NodeID].Name, | |||||
| LocationName: allNodes[node.HubID].Name, | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -19,7 +19,7 @@ func (svc *Service) CacheSvc() *CacheService { | |||||
| return &CacheService{Service: svc} | return &CacheService{Service: svc} | ||||
| } | } | ||||
| func (svc *CacheService) StartCacheMovePackage(userID cdssdk.UserID, packageID cdssdk.PackageID, stgID cdssdk.StorageID) (cdssdk.NodeID, string, error) { | |||||
| func (svc *CacheService) StartCacheMovePackage(userID cdssdk.UserID, packageID cdssdk.PackageID, stgID cdssdk.StorageID) (cdssdk.HubID, string, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("new coordinator client: %w", err) | return 0, "", fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -35,7 +35,7 @@ func (svc *CacheService) StartCacheMovePackage(userID cdssdk.UserID, packageID c | |||||
| return 0, "", fmt.Errorf("shard storage is not enabled") | return 0, "", fmt.Errorf("shard storage is not enabled") | ||||
| } | } | ||||
| agentCli, err := stgglb.AgentMQPool.Acquire(getStg.Storages[0].MasterHub.NodeID) | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(getStg.Storages[0].MasterHub.HubID) | |||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("new agent client: %w", err) | return 0, "", fmt.Errorf("new agent client: %w", err) | ||||
| } | } | ||||
| @@ -46,10 +46,10 @@ func (svc *CacheService) StartCacheMovePackage(userID cdssdk.UserID, packageID c | |||||
| return 0, "", fmt.Errorf("start cache move package: %w", err) | return 0, "", fmt.Errorf("start cache move package: %w", err) | ||||
| } | } | ||||
| return getStg.Storages[0].MasterHub.NodeID, startResp.TaskID, nil | |||||
| return getStg.Storages[0].MasterHub.HubID, startResp.TaskID, nil | |||||
| } | } | ||||
| func (svc *CacheService) WaitCacheMovePackage(hubID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, error) { | |||||
| func (svc *CacheService) WaitCacheMovePackage(hubID cdssdk.HubID, taskID string, waitTimeout time.Duration) (bool, error) { | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(hubID) | agentCli, err := stgglb.AgentMQPool.Acquire(hubID) | ||||
| if err != nil { | if err != nil { | ||||
| return true, fmt.Errorf("new agent client: %w", err) | return true, fmt.Errorf("new agent client: %w", err) | ||||
| @@ -8,26 +8,26 @@ import ( | |||||
| coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator" | coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator" | ||||
| ) | ) | ||||
| // NodeService 是关于节点操作的服务结构体 | |||||
| type NodeService struct { | |||||
| // HubService 是关于节点操作的服务结构体 | |||||
| type HubService struct { | |||||
| *Service | *Service | ||||
| } | } | ||||
| // NodeSvc 创建并返回一个NodeService的实例 | |||||
| func (svc *Service) NodeSvc() *NodeService { | |||||
| return &NodeService{Service: svc} | |||||
| // HubSvc 创建并返回一个HubService的实例 | |||||
| func (svc *Service) HubSvc() *HubService { | |||||
| return &HubService{Service: svc} | |||||
| } | } | ||||
| // GetNodes 根据提供的节点ID列表,获取对应的节点信息 | |||||
| // GetHubs 根据提供的节点ID列表,获取对应的节点信息 | |||||
| // 参数: | // 参数: | ||||
| // | // | ||||
| // nodeIDs []cdssdk.NodeID - 需要查询的节点ID列表 | |||||
| // hubIDs []cdssdk.HubID - 需要查询的节点ID列表 | |||||
| // | // | ||||
| // 返回值: | // 返回值: | ||||
| // | // | ||||
| // []cdssdk.Node - 获取到的节点信息列表 | |||||
| // []cdssdk.Hub - 获取到的节点信息列表 | |||||
| // error - 如果过程中发生错误,则返回错误信息 | // error - 如果过程中发生错误,则返回错误信息 | ||||
| func (svc *NodeService) GetNodes(nodeIDs []cdssdk.NodeID) ([]cdssdk.Node, error) { | |||||
| func (svc *HubService) GetHubs(hubIDs []cdssdk.HubID) ([]cdssdk.Hub, error) { | |||||
| // 从协调器MQ池中获取一个客户端实例 | // 从协调器MQ池中获取一个客户端实例 | ||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| @@ -37,11 +37,11 @@ func (svc *NodeService) GetNodes(nodeIDs []cdssdk.NodeID) ([]cdssdk.Node, error) | |||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| // 向协调器发送获取节点信息的请求 | // 向协调器发送获取节点信息的请求 | ||||
| getResp, err := coorCli.GetNodes(coormq.NewGetNodes(nodeIDs)) | |||||
| getResp, err := coorCli.GetHubs(coormq.NewGetHubs(hubIDs)) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("requesting to coordinator: %w", err) | return nil, fmt.Errorf("requesting to coordinator: %w", err) | ||||
| } | } | ||||
| // 返回获取到的节点信息 | // 返回获取到的节点信息 | ||||
| return getResp.Nodes, nil | |||||
| return getResp.Hubs, nil | |||||
| } | } | ||||
| @@ -29,10 +29,10 @@ func (svc *Service) ObjectSvc() *ObjectService { | |||||
| // userID: 用户ID。 | // userID: 用户ID。 | ||||
| // packageID: 套件ID。 | // packageID: 套件ID。 | ||||
| // objIter: 正在上传的对象迭代器。 | // objIter: 正在上传的对象迭代器。 | ||||
| // nodeAffinity: 节点亲和性,指定对象上传的首选节点。 | |||||
| // storageAffinity: 节点亲和性,指定对象上传的首选节点。 | |||||
| // 返回值: 任务ID和错误信息。 | // 返回值: 任务ID和错误信息。 | ||||
| func (svc *ObjectService) StartUploading(userID cdssdk.UserID, packageID cdssdk.PackageID, objIter iterator.UploadingObjectIterator, nodeAffinity *cdssdk.NodeID) (string, error) { | |||||
| tsk := svc.TaskMgr.StartNew(mytask.NewUploadObjects(userID, packageID, objIter, nodeAffinity)) | |||||
| func (svc *ObjectService) StartUploading(userID cdssdk.UserID, packageID cdssdk.PackageID, objIter iterator.UploadingObjectIterator, storageAffinity cdssdk.StorageID) (string, error) { | |||||
| tsk := svc.TaskMgr.StartNew(mytask.NewUploadObjects(userID, packageID, objIter, storageAffinity)) | |||||
| return tsk.ID(), nil | return tsk.ID(), nil | ||||
| } | } | ||||
| @@ -118,7 +118,7 @@ func (svc *PackageService) GetCachedStorages(userID cdssdk.UserID, packageID cds | |||||
| // 向协调器请求获取包的缓存节点信息 | // 向协调器请求获取包的缓存节点信息 | ||||
| resp, err := coorCli.GetPackageCachedStorages(coormq.ReqGetPackageCachedStorages(userID, packageID)) | resp, err := coorCli.GetPackageCachedStorages(coormq.ReqGetPackageCachedStorages(userID, packageID)) | ||||
| if err != nil { | if err != nil { | ||||
| return cdssdk.PackageCachingInfo{}, fmt.Errorf("get package cached nodes: %w", err) | |||||
| return cdssdk.PackageCachingInfo{}, fmt.Errorf("get package cached storages: %w", err) | |||||
| } | } | ||||
| // 构造并返回缓存信息 | // 构造并返回缓存信息 | ||||
| @@ -141,7 +141,7 @@ func (svc *PackageService) GetLoadedStorages(userID cdssdk.UserID, packageID cds | |||||
| // 向协调器请求获取加载指定包的节点ID列表 | // 向协调器请求获取加载指定包的节点ID列表 | ||||
| resp, err := coorCli.GetPackageLoadedStorages(coormq.ReqGetPackageLoadedStorages(userID, packageID)) | resp, err := coorCli.GetPackageLoadedStorages(coormq.ReqGetPackageLoadedStorages(userID, packageID)) | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("get package loaded nodes: %w", err) | |||||
| return nil, fmt.Errorf("get package loaded storages: %w", err) | |||||
| } | } | ||||
| return resp.StorageIDs, nil | return resp.StorageIDs, nil | ||||
| } | } | ||||
| @@ -50,7 +50,7 @@ func (svc *StorageService) GetByName(userID cdssdk.UserID, name string) (*model. | |||||
| return &getResp.Storage, nil | return &getResp.Storage, nil | ||||
| } | } | ||||
| func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID, storageID cdssdk.StorageID) (cdssdk.NodeID, string, error) { | |||||
| func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID, storageID cdssdk.StorageID) (cdssdk.HubID, string, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("new coordinator client: %w", err) | return 0, "", fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -66,7 +66,7 @@ func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, package | |||||
| return 0, "", fmt.Errorf("shard storage is not enabled") | return 0, "", fmt.Errorf("shard storage is not enabled") | ||||
| } | } | ||||
| agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storages[0].MasterHub.NodeID) | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storages[0].MasterHub.HubID) | |||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("new agent client: %w", err) | return 0, "", fmt.Errorf("new agent client: %w", err) | ||||
| } | } | ||||
| @@ -77,7 +77,7 @@ func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, package | |||||
| return 0, "", fmt.Errorf("start storage load package: %w", err) | return 0, "", fmt.Errorf("start storage load package: %w", err) | ||||
| } | } | ||||
| return stgResp.Storages[0].MasterHub.NodeID, startResp.TaskID, nil | |||||
| return stgResp.Storages[0].MasterHub.HubID, startResp.TaskID, nil | |||||
| } | } | ||||
| type StorageLoadPackageResult struct { | type StorageLoadPackageResult struct { | ||||
| @@ -86,8 +86,8 @@ type StorageLoadPackageResult struct { | |||||
| RemoteBase string | RemoteBase string | ||||
| } | } | ||||
| func (svc *StorageService) WaitStorageLoadPackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, *StorageLoadPackageResult, error) { | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(nodeID) | |||||
| func (svc *StorageService) WaitStorageLoadPackage(hubID cdssdk.HubID, taskID string, waitTimeout time.Duration) (bool, *StorageLoadPackageResult, error) { | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(hubID) | |||||
| if err != nil { | if err != nil { | ||||
| // TODO 失败是否要当做任务已经结束? | // TODO 失败是否要当做任务已经结束? | ||||
| return true, nil, fmt.Errorf("new agent client: %w", err) | return true, nil, fmt.Errorf("new agent client: %w", err) | ||||
| @@ -121,7 +121,7 @@ func (svc *StorageService) DeleteStoragePackage(userID int64, packageID int64, s | |||||
| } | } | ||||
| // 请求节点启动从Storage中上传文件的任务。会返回节点ID和任务ID | // 请求节点启动从Storage中上传文件的任务。会返回节点ID和任务ID | ||||
| func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, nodeAffinity *cdssdk.NodeID) (cdssdk.NodeID, string, error) { | |||||
| func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, storageAffinity cdssdk.StorageID) (cdssdk.HubID, string, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("new coordinator client: %w", err) | return 0, "", fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -137,22 +137,22 @@ func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucke | |||||
| return 0, "", fmt.Errorf("shard storage is not enabled") | return 0, "", fmt.Errorf("shard storage is not enabled") | ||||
| } | } | ||||
| agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storages[0].MasterHub.NodeID) | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storages[0].MasterHub.HubID) | |||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("new agent client: %w", err) | return 0, "", fmt.Errorf("new agent client: %w", err) | ||||
| } | } | ||||
| defer stgglb.AgentMQPool.Release(agentCli) | defer stgglb.AgentMQPool.Release(agentCli) | ||||
| startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, nodeAffinity)) | |||||
| startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, storageAffinity)) | |||||
| if err != nil { | if err != nil { | ||||
| return 0, "", fmt.Errorf("start storage upload package: %w", err) | return 0, "", fmt.Errorf("start storage upload package: %w", err) | ||||
| } | } | ||||
| return stgResp.Storages[0].MasterHub.NodeID, startResp.TaskID, nil | |||||
| return stgResp.Storages[0].MasterHub.HubID, startResp.TaskID, nil | |||||
| } | } | ||||
| func (svc *StorageService) WaitStorageCreatePackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, cdssdk.PackageID, error) { | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(nodeID) | |||||
| func (svc *StorageService) WaitStorageCreatePackage(hubID cdssdk.HubID, taskID string, waitTimeout time.Duration) (bool, cdssdk.PackageID, error) { | |||||
| agentCli, err := stgglb.AgentMQPool.Acquire(hubID) | |||||
| if err != nil { | if err != nil { | ||||
| // TODO 失败是否要当做任务已经结束? | // TODO 失败是否要当做任务已经结束? | ||||
| return true, 0, fmt.Errorf("new agent client: %w", err) | return true, 0, fmt.Errorf("new agent client: %w", err) | ||||
| @@ -24,11 +24,11 @@ type UploadObjects struct { | |||||
| // userID: 用户ID,标识发起上传请求的用户。 | // userID: 用户ID,标识发起上传请求的用户。 | ||||
| // packageID: 包ID,标识被上传的对象所属的包。 | // packageID: 包ID,标识被上传的对象所属的包。 | ||||
| // objectIter: 上传对象迭代器,用于遍历和上传多个对象。 | // objectIter: 上传对象迭代器,用于遍历和上传多个对象。 | ||||
| // nodeAffinity: 节点亲和性,指定上传任务首选的执行节点。 | |||||
| // storageAffinity: 节点亲和性,指定上传任务首选的执行节点。 | |||||
| // 返回值为初始化后的UploadObjects指针。 | // 返回值为初始化后的UploadObjects指针。 | ||||
| func NewUploadObjects(userID cdssdk.UserID, packageID cdssdk.PackageID, objectIter iterator.UploadingObjectIterator, nodeAffinity *cdssdk.NodeID) *UploadObjects { | |||||
| func NewUploadObjects(userID cdssdk.UserID, packageID cdssdk.PackageID, objectIter iterator.UploadingObjectIterator, storageAffinity cdssdk.StorageID) *UploadObjects { | |||||
| return &UploadObjects{ | return &UploadObjects{ | ||||
| cmd: *cmd.NewUploadObjects(userID, packageID, objectIter, nodeAffinity), | |||||
| cmd: *cmd.NewUploadObjects(userID, packageID, objectIter, storageAffinity), | |||||
| } | } | ||||
| } | } | ||||
| @@ -40,32 +40,32 @@ func main() { | |||||
| stgglb.InitAgentRPCPool(&config.Cfg().AgentGRPC) | stgglb.InitAgentRPCPool(&config.Cfg().AgentGRPC) | ||||
| var conCol connectivity.Collector | var conCol connectivity.Collector | ||||
| if config.Cfg().Local.NodeID != nil { | |||||
| //如果client与某个node处于同一台机器,则使用这个node的连通性信息 | |||||
| if config.Cfg().Local.HubID != nil { | |||||
| //如果client与某个hub处于同一台机器,则使用这个hub的连通性信息 | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| logger.Warnf("acquire coordinator mq failed, err: %s", err.Error()) | logger.Warnf("acquire coordinator mq failed, err: %s", err.Error()) | ||||
| os.Exit(1) | os.Exit(1) | ||||
| } | } | ||||
| getCons, err := coorCli.GetNodeConnectivities(coormq.ReqGetNodeConnectivities([]cdssdk.NodeID{*config.Cfg().Local.NodeID})) | |||||
| getCons, err := coorCli.GetHubConnectivities(coormq.ReqGetHubConnectivities([]cdssdk.HubID{*config.Cfg().Local.HubID})) | |||||
| if err != nil { | if err != nil { | ||||
| logger.Warnf("get node connectivities failed, err: %s", err.Error()) | |||||
| logger.Warnf("get hub connectivities failed, err: %s", err.Error()) | |||||
| os.Exit(1) | os.Exit(1) | ||||
| } | } | ||||
| consMap := make(map[cdssdk.NodeID]connectivity.Connectivity) | |||||
| consMap := make(map[cdssdk.HubID]connectivity.Connectivity) | |||||
| for _, con := range getCons.Connectivities { | for _, con := range getCons.Connectivities { | ||||
| var delay *time.Duration | var delay *time.Duration | ||||
| if con.Delay != nil { | if con.Delay != nil { | ||||
| d := time.Duration(*con.Delay * float32(time.Millisecond)) | d := time.Duration(*con.Delay * float32(time.Millisecond)) | ||||
| delay = &d | delay = &d | ||||
| } | } | ||||
| consMap[con.FromNodeID] = connectivity.Connectivity{ | |||||
| ToNodeID: con.ToNodeID, | |||||
| Delay: delay, | |||||
| consMap[con.FromHubID] = connectivity.Connectivity{ | |||||
| ToHubID: con.ToHubID, | |||||
| Delay: delay, | |||||
| } | } | ||||
| } | } | ||||
| conCol = connectivity.NewCollectorWithInitData(&config.Cfg().Connectivity, nil, consMap) | conCol = connectivity.NewCollectorWithInitData(&config.Cfg().Connectivity, nil, consMap) | ||||
| logger.Info("use local node connectivities") | |||||
| logger.Info("use local hub connectivities") | |||||
| } else { | } else { | ||||
| // 否则需要就地收集连通性信息 | // 否则需要就地收集连通性信息 | ||||
| @@ -1,7 +1,7 @@ | |||||
| { | { | ||||
| "id": 1, | "id": 1, | ||||
| "local": { | "local": { | ||||
| "nodeID": 1, | |||||
| "hubID": 1, | |||||
| "localIP": "127.0.0.1", | "localIP": "127.0.0.1", | ||||
| "externalIP": "127.0.0.1", | "externalIP": "127.0.0.1", | ||||
| "locationID": 1 | "locationID": 1 | ||||
| @@ -42,7 +42,7 @@ | |||||
| }, | }, | ||||
| "downloader": { | "downloader": { | ||||
| "maxStripCacheCount": 100, | "maxStripCacheCount": 100, | ||||
| "highLatencyNode": 35, | |||||
| "highLatencyHub": 35, | |||||
| "ecStripPrefetchCount": 1 | "ecStripPrefetchCount": 1 | ||||
| } | } | ||||
| } | } | ||||
| @@ -34,7 +34,7 @@ | |||||
| }, | }, | ||||
| "downloader": { | "downloader": { | ||||
| "maxStripCacheCount": 100, | "maxStripCacheCount": 100, | ||||
| "highLatencyNode": 35, | |||||
| "highLatencyHub": 35, | |||||
| "ecStripPrefetchCount": 1 | "ecStripPrefetchCount": 1 | ||||
| }, | }, | ||||
| "storageID": 0 | "storageID": 0 | ||||
| @@ -1,7 +1,7 @@ | |||||
| { | { | ||||
| "accessStatHistoryAmount": 0.8, | "accessStatHistoryAmount": 0.8, | ||||
| "ecFileSizeThreshold": 104857600, | "ecFileSizeThreshold": 104857600, | ||||
| "nodeUnavailableSeconds": 300, | |||||
| "hubUnavailableSeconds": 300, | |||||
| "logger": { | "logger": { | ||||
| "output": "file", | "output": "file", | ||||
| "outputFileName": "scanner", | "outputFileName": "scanner", | ||||
| @@ -1,187 +0,0 @@ | |||||
| drop database if exists cloudream; | |||||
| create database cloudream; | |||||
| use cloudream; | |||||
| create table Node ( | |||||
| NodeID int not null auto_increment primary key comment '节点ID', | |||||
| Name varchar(128) not null comment '节点名称', | |||||
| LocalIP varchar(128) not null comment '节点的内网IP', | |||||
| ExternalIP varchar(128) not null comment '节点的外网IP', | |||||
| LocalGRPCPort int not null comment '节点的内网GRCP端口', | |||||
| ExternalGRPCPort int not null comment '节点的外网GRCP端口', | |||||
| LocationID int not null comment '节点的地域', | |||||
| State varchar(128) comment '节点的状态', | |||||
| LastReportTime timestamp comment '节点上次上报时间' | |||||
| ) comment = '节点表'; | |||||
| insert into | |||||
| Node ( | |||||
| NodeID, | |||||
| Name, | |||||
| LocalIP, | |||||
| ExternalIP, | |||||
| LocalGRPCPort, | |||||
| ExternalGRPCPort, | |||||
| LocationID, | |||||
| State | |||||
| ) | |||||
| values | |||||
| ( | |||||
| 1, | |||||
| "localhost", | |||||
| "localhost", | |||||
| "localhost", | |||||
| 5010, | |||||
| 5010, | |||||
| 1, | |||||
| "alive" | |||||
| ); | |||||
| create table Storage ( | |||||
| StorageID int not null auto_increment primary key comment '存储服务ID', | |||||
| Name varchar(100) not null comment '存储服务名称', | |||||
| NodeID int not null comment '存储服务所在节点的ID', | |||||
| Directory varchar(4096) not null comment '存储服务所在节点的目录', | |||||
| Remote varchar(4096) not null, | |||||
| State varchar(100) comment '状态' | |||||
| ) comment = "存储服务表"; | |||||
| insert into | |||||
| Storage (StorageID, Name, NodeID, Directory, State) | |||||
| values | |||||
| (1, "HuaWei-Cloud", 1, "/", "Online"); | |||||
| create table NodeConnectivity ( | |||||
| FromNodeID int not null comment '发起检测的节点ID', | |||||
| ToNodeID int not null comment '被检测节点的ID', | |||||
| Delay float comment '发起节点与被检测节点间延迟(毫秒),为null代表节点不可达', | |||||
| TestTime timestamp comment '进行连通性测试的时间', | |||||
| primary key(FromNodeID, ToNodeID) | |||||
| ) comment = '节点连通性表'; | |||||
| create table User ( | |||||
| UserID int not null primary key comment '用户ID', | |||||
| Password varchar(100) not null comment '用户密码' | |||||
| ) comment = '用户密码表'; | |||||
| create table UserBucket ( | |||||
| UserID int not null comment '用户ID', | |||||
| BucketID int not null comment '用户可访问的桶ID', | |||||
| primary key(UserID, BucketID) | |||||
| ) comment = '用户桶权限表'; | |||||
| insert into | |||||
| UserBucket (UserID, BucketID) | |||||
| values | |||||
| (0, 1); | |||||
| create table UserNode ( | |||||
| UserID int not null comment '用户ID', | |||||
| NodeID int not null comment '用户可使用的节点ID', | |||||
| primary key(UserID, NodeID) | |||||
| ) comment = '用户节点权限表'; | |||||
| insert into | |||||
| UserNode (UserID, NodeID) | |||||
| values | |||||
| (0, 1); | |||||
| create table UserStorage ( | |||||
| UserID int not null comment "用户ID", | |||||
| StorageID int not null comment "存储服务ID", | |||||
| primary key(UserID, StorageID) | |||||
| ); | |||||
| insert into | |||||
| UserStorage (UserID, StorageID) | |||||
| values | |||||
| (0, 1); | |||||
| create table Bucket ( | |||||
| BucketID int not null auto_increment primary key comment '桶ID', | |||||
| Name varchar(100) not null comment '桶名', | |||||
| CreatorID int not null comment '创建者ID' | |||||
| ) comment = '桶表'; | |||||
| insert into | |||||
| Bucket (BucketID, Name, CreatorID) | |||||
| values | |||||
| (0, "bucket01", 0); | |||||
| create table Package ( | |||||
| PackageID int not null auto_increment primary key comment '包ID', | |||||
| Name varchar(100) not null comment '对象名', | |||||
| BucketID int not null comment '桶ID', | |||||
| State varchar(100) not null comment '状态', | |||||
| ); | |||||
| create table Object ( | |||||
| ObjectID int not null auto_increment primary key comment '对象ID', | |||||
| PackageID int not null comment '包ID', | |||||
| Path varchar(500) not null comment '对象路径', | |||||
| Size bigint not null comment '对象大小(Byte)', | |||||
| FileHash varchar(100) not null comment '完整对象的FileHash', | |||||
| Redundancy JSON not null comment '冗余策略', | |||||
| CreateTime timestamp not null comment '创建时间', | |||||
| UpdateTime timestamp not null comment '更新时间', | |||||
| UNIQUE KEY PackagePath (PackageID, Path) | |||||
| ) comment = '对象表'; | |||||
| create table ObjectBlock ( | |||||
| ObjectID int not null comment '对象ID', | |||||
| `Index` int not null comment '编码块在条带内的排序', | |||||
| NodeID int not null comment '此编码块应该存在的节点', | |||||
| FileHash varchar(100) not null comment '编码块哈希值', | |||||
| primary key(ObjectID, `Index`, NodeID) | |||||
| ) comment = '对象编码块表'; | |||||
| create table Cache ( | |||||
| FileHash varchar(100) not null comment '编码块块ID', | |||||
| NodeID int not null comment '节点ID', | |||||
| CreateTime timestamp not null comment '缓存时间', | |||||
| Priority int not null comment '编码块优先级', | |||||
| primary key(FileHash, NodeID) | |||||
| ) comment = '缓存表'; | |||||
| create table PinnedObject ( | |||||
| NodeID int not null comment '节点ID', | |||||
| ObjectID int not null comment '对象ID', | |||||
| CreateTime timestamp not null comment '缓存时间', | |||||
| primary key(NodeID, ObjectID) | |||||
| ) comment = '临时对象表'; | |||||
| create table StoragePackage ( | |||||
| StorageID int not null comment '存储服务ID', | |||||
| PackageID int not null comment '包ID', | |||||
| UserID int not null comment '调度了此文件的用户ID', | |||||
| State varchar(100) not null comment '包状态', | |||||
| primary key(StorageID, PackageID, UserID) | |||||
| ); | |||||
| create table PackageAccessStat ( | |||||
| PackageID int not null comment '包ID', | |||||
| NodeID int not null comment '节点ID', | |||||
| Amount float not null comment '前一日流量的滑动平均值', | |||||
| Counter float not null comment '本日的流量', | |||||
| primary key(PackageID, NodeID) | |||||
| ); | |||||
| create table Location ( | |||||
| LocationID int not null auto_increment primary key comment 'ID', | |||||
| Name varchar(128) not null comment '名称' | |||||
| ) comment = '地域表'; | |||||
| insert into | |||||
| Location (LocationID, Name) | |||||
| values | |||||
| (1, "Local"); | |||||
| create table ObjectAccessStat ( | |||||
| ObjectID int not null comment '对象ID', | |||||
| NodeID int not null comment '节点ID', | |||||
| Amount float not null comment '前一日流量的滑动平均值', | |||||
| Counter float not null comment '本日的流量', | |||||
| primary key(ObjectID, NodeID) | |||||
| ); | |||||
| @@ -3,13 +3,13 @@ package consts | |||||
| const ( | const ( | ||||
| StorageDirectoryStateOK = "OK" | StorageDirectoryStateOK = "OK" | ||||
| NodeStateNormal = "Normal" | |||||
| NodeStateUnavailable = "Unavailable" | |||||
| HubStateNormal = "Normal" | |||||
| HubStateUnavailable = "Unavailable" | |||||
| ) | ) | ||||
| const ( | const ( | ||||
| NodeDistanceSameNode = 0.1 | |||||
| NodeDistanceSameLocation = 1 | |||||
| NodeDistanceOther = 5 | |||||
| NodeDistanceHighLatencyNode = 10 | |||||
| StorageDistanceSameStorage = 0.1 | |||||
| StorageDistanceSameLocation = 1 | |||||
| StorageDistanceOther = 5 | |||||
| HubDistanceHighLatencyHub = 10 | |||||
| ) | ) | ||||
| @@ -3,8 +3,8 @@ package stgglb | |||||
| import cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | import cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | ||||
| // 根据当前节点与目标地址的距离关系,选择合适的地址 | // 根据当前节点与目标地址的距离关系,选择合适的地址 | ||||
| func SelectGRPCAddress(node cdssdk.Node, addr cdssdk.GRPCAddressInfo) (string, int) { | |||||
| if Local != nil && Local.LocationID == node.LocationID { | |||||
| func SelectGRPCAddress(hub cdssdk.Hub, addr cdssdk.GRPCAddressInfo) (string, int) { | |||||
| if Local != nil && Local.LocationID == hub.LocationID { | |||||
| return addr.LocalIP, addr.LocalGRPCPort | return addr.LocalIP, addr.LocalGRPCPort | ||||
| } | } | ||||
| @@ -99,7 +99,7 @@ func (o *ObjectDetail) GroupBlocks() []GrouppedObjectBlock { | |||||
| } | } | ||||
| type LocalMachineInfo struct { | type LocalMachineInfo struct { | ||||
| NodeID *cdssdk.NodeID `json:"nodeID"` | |||||
| HubID *cdssdk.HubID `json:"hubID"` | |||||
| ExternalIP string `json:"externalIP"` | ExternalIP string `json:"externalIP"` | ||||
| LocalIP string `json:"localIP"` | LocalIP string `json:"localIP"` | ||||
| LocationID cdssdk.LocationID `json:"locationID"` | LocationID cdssdk.LocationID `json:"locationID"` | ||||
| @@ -129,7 +129,7 @@ func (ObjectAccessStat) TableName() string { | |||||
| type StorageDetail struct { | type StorageDetail struct { | ||||
| Storage cdssdk.Storage `json:"storage"` | Storage cdssdk.Storage `json:"storage"` | ||||
| MasterHub *cdssdk.Node `json:"masterHub"` | |||||
| MasterHub *cdssdk.Hub `json:"masterHub"` | |||||
| Shard *cdssdk.ShardStorage `json:"shard"` | Shard *cdssdk.ShardStorage `json:"shard"` | ||||
| Shared *cdssdk.SharedStorage `json:"shared"` | Shared *cdssdk.SharedStorage `json:"shared"` | ||||
| } | } | ||||
| @@ -28,10 +28,10 @@ import ( | |||||
| ) | ) | ||||
| type UploadObjects struct { | type UploadObjects struct { | ||||
| userID cdssdk.UserID | |||||
| packageID cdssdk.PackageID | |||||
| objectIter iterator.UploadingObjectIterator | |||||
| nodeAffinity *cdssdk.NodeID | |||||
| userID cdssdk.UserID | |||||
| packageID cdssdk.PackageID | |||||
| objectIter iterator.UploadingObjectIterator | |||||
| stgAffinity cdssdk.StorageID | |||||
| } | } | ||||
| type UploadObjectsResult struct { | type UploadObjectsResult struct { | ||||
| @@ -56,12 +56,12 @@ type UploadObjectsContext struct { | |||||
| StgMgr *mgr.Manager | StgMgr *mgr.Manager | ||||
| } | } | ||||
| func NewUploadObjects(userID cdssdk.UserID, packageID cdssdk.PackageID, objIter iterator.UploadingObjectIterator, nodeAffinity *cdssdk.NodeID) *UploadObjects { | |||||
| func NewUploadObjects(userID cdssdk.UserID, packageID cdssdk.PackageID, objIter iterator.UploadingObjectIterator, stgAffinity cdssdk.StorageID) *UploadObjects { | |||||
| return &UploadObjects{ | return &UploadObjects{ | ||||
| userID: userID, | |||||
| packageID: packageID, | |||||
| objectIter: objIter, | |||||
| nodeAffinity: nodeAffinity, | |||||
| userID: userID, | |||||
| packageID: packageID, | |||||
| objectIter: objIter, | |||||
| stgAffinity: stgAffinity, | |||||
| } | } | ||||
| } | } | ||||
| @@ -75,7 +75,7 @@ func (t *UploadObjects) Execute(ctx *UploadObjectsContext) (*UploadObjectsResult | |||||
| getUserStgsResp, err := coorCli.GetUserStorageDetails(coormq.ReqGetUserStorageDetails(t.userID)) | getUserStgsResp, err := coorCli.GetUserStorageDetails(coormq.ReqGetUserStorageDetails(t.userID)) | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("getting user nodes: %w", err) | |||||
| return nil, fmt.Errorf("getting user storages: %w", err) | |||||
| } | } | ||||
| cons := ctx.Connectivity.GetAll() | cons := ctx.Connectivity.GetAll() | ||||
| @@ -87,7 +87,7 @@ func (t *UploadObjects) Execute(ctx *UploadObjectsContext) (*UploadObjectsResult | |||||
| delay := time.Duration(math.MaxInt64) | delay := time.Duration(math.MaxInt64) | ||||
| con, ok := cons[stg.MasterHub.NodeID] | |||||
| con, ok := cons[stg.MasterHub.HubID] | |||||
| if ok && con.Delay != nil { | if ok && con.Delay != nil { | ||||
| delay = *con.Delay | delay = *con.Delay | ||||
| } | } | ||||
| @@ -116,7 +116,7 @@ func (t *UploadObjects) Execute(ctx *UploadObjectsContext) (*UploadObjectsResult | |||||
| } | } | ||||
| defer ipfsMutex.Unlock() | defer ipfsMutex.Unlock() | ||||
| rets, err := uploadAndUpdatePackage(ctx, t.packageID, t.objectIter, userStgs, t.nodeAffinity) | |||||
| rets, err := uploadAndUpdatePackage(ctx, t.packageID, t.objectIter, userStgs, t.stgAffinity) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| @@ -126,30 +126,30 @@ func (t *UploadObjects) Execute(ctx *UploadObjectsContext) (*UploadObjectsResult | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| // chooseUploadNode 选择一个上传文件的节点 | |||||
| // chooseUploadStorage 选择一个上传文件的节点 | |||||
| // 1. 选择设置了亲和性的节点 | // 1. 选择设置了亲和性的节点 | ||||
| // 2. 从与当前客户端相同地域的节点中随机选一个 | // 2. 从与当前客户端相同地域的节点中随机选一个 | ||||
| // 3. 没有的话从所有节点选择延迟最低的节点 | // 3. 没有的话从所有节点选择延迟最低的节点 | ||||
| func chooseUploadNode(nodes []UploadStorageInfo, nodeAffinity *cdssdk.NodeID) UploadStorageInfo { | |||||
| if nodeAffinity != nil { | |||||
| aff, ok := lo.Find(nodes, func(node UploadStorageInfo) bool { return node.Storage.MasterHub.NodeID == *nodeAffinity }) | |||||
| func chooseUploadStorage(storages []UploadStorageInfo, stgAffinity cdssdk.StorageID) UploadStorageInfo { | |||||
| if stgAffinity > 0 { | |||||
| aff, ok := lo.Find(storages, func(storage UploadStorageInfo) bool { return storage.Storage.Storage.StorageID == stgAffinity }) | |||||
| if ok { | if ok { | ||||
| return aff | return aff | ||||
| } | } | ||||
| } | } | ||||
| sameLocationNodes := lo.Filter(nodes, func(e UploadStorageInfo, i int) bool { return e.IsSameLocation }) | |||||
| if len(sameLocationNodes) > 0 { | |||||
| return sameLocationNodes[rand.Intn(len(sameLocationNodes))] | |||||
| sameLocationStorages := lo.Filter(storages, func(e UploadStorageInfo, i int) bool { return e.IsSameLocation }) | |||||
| if len(sameLocationStorages) > 0 { | |||||
| return sameLocationStorages[rand.Intn(len(sameLocationStorages))] | |||||
| } | } | ||||
| // 选择延迟最低的节点 | // 选择延迟最低的节点 | ||||
| nodes = sort2.Sort(nodes, func(e1, e2 UploadStorageInfo) int { return sort2.Cmp(e1.Delay, e2.Delay) }) | |||||
| storages = sort2.Sort(storages, func(e1, e2 UploadStorageInfo) int { return sort2.Cmp(e1.Delay, e2.Delay) }) | |||||
| return nodes[0] | |||||
| return storages[0] | |||||
| } | } | ||||
| func uploadAndUpdatePackage(ctx *UploadObjectsContext, packageID cdssdk.PackageID, objectIter iterator.UploadingObjectIterator, userNodes []UploadStorageInfo, nodeAffinity *cdssdk.NodeID) ([]ObjectUploadResult, error) { | |||||
| func uploadAndUpdatePackage(ctx *UploadObjectsContext, packageID cdssdk.PackageID, objectIter iterator.UploadingObjectIterator, userStorages []UploadStorageInfo, stgAffinity cdssdk.StorageID) ([]ObjectUploadResult, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("new coordinator client: %w", err) | return nil, fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -157,7 +157,7 @@ func uploadAndUpdatePackage(ctx *UploadObjectsContext, packageID cdssdk.PackageI | |||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| // 为所有文件选择相同的上传节点 | // 为所有文件选择相同的上传节点 | ||||
| uploadNode := chooseUploadNode(userNodes, nodeAffinity) | |||||
| uploadStorage := chooseUploadStorage(userStorages, stgAffinity) | |||||
| var uploadRets []ObjectUploadResult | var uploadRets []ObjectUploadResult | ||||
| //上传文件夹 | //上传文件夹 | ||||
| @@ -174,7 +174,7 @@ func uploadAndUpdatePackage(ctx *UploadObjectsContext, packageID cdssdk.PackageI | |||||
| defer objInfo.File.Close() | defer objInfo.File.Close() | ||||
| uploadTime := time.Now() | uploadTime := time.Now() | ||||
| fileHash, err := uploadFile(ctx, objInfo.File, uploadNode) | |||||
| fileHash, err := uploadFile(ctx, objInfo.File, uploadStorage) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("uploading file: %w", err) | return fmt.Errorf("uploading file: %w", err) | ||||
| } | } | ||||
| @@ -184,7 +184,7 @@ func uploadAndUpdatePackage(ctx *UploadObjectsContext, packageID cdssdk.PackageI | |||||
| Error: err, | Error: err, | ||||
| }) | }) | ||||
| adds = append(adds, coormq.NewAddObjectEntry(objInfo.Path, objInfo.Size, fileHash, uploadTime, uploadNode.Storage.Storage.StorageID)) | |||||
| adds = append(adds, coormq.NewAddObjectEntry(objInfo.Path, objInfo.Size, fileHash, uploadTime, uploadStorage.Storage.Storage.StorageID)) | |||||
| return nil | return nil | ||||
| }() | }() | ||||
| if err != nil { | if err != nil { | ||||
| @@ -12,7 +12,7 @@ import ( | |||||
| ) | ) | ||||
| type Connectivity struct { | type Connectivity struct { | ||||
| ToNodeID cdssdk.NodeID | |||||
| ToHubID cdssdk.HubID | |||||
| Delay *time.Duration | Delay *time.Duration | ||||
| TestTime time.Time | TestTime time.Time | ||||
| } | } | ||||
| @@ -22,7 +22,7 @@ type Collector struct { | |||||
| onCollected func(collector *Collector) | onCollected func(collector *Collector) | ||||
| collectNow chan any | collectNow chan any | ||||
| close chan any | close chan any | ||||
| connectivities map[cdssdk.NodeID]Connectivity | |||||
| connectivities map[cdssdk.HubID]Connectivity | |||||
| lock *sync.RWMutex | lock *sync.RWMutex | ||||
| } | } | ||||
| @@ -31,7 +31,7 @@ func NewCollector(cfg *Config, onCollected func(collector *Collector)) Collector | |||||
| cfg: cfg, | cfg: cfg, | ||||
| collectNow: make(chan any), | collectNow: make(chan any), | ||||
| close: make(chan any), | close: make(chan any), | ||||
| connectivities: make(map[cdssdk.NodeID]Connectivity), | |||||
| connectivities: make(map[cdssdk.HubID]Connectivity), | |||||
| lock: &sync.RWMutex{}, | lock: &sync.RWMutex{}, | ||||
| onCollected: onCollected, | onCollected: onCollected, | ||||
| } | } | ||||
| @@ -39,7 +39,7 @@ func NewCollector(cfg *Config, onCollected func(collector *Collector)) Collector | |||||
| return rpt | return rpt | ||||
| } | } | ||||
| func NewCollectorWithInitData(cfg *Config, onCollected func(collector *Collector), initData map[cdssdk.NodeID]Connectivity) Collector { | |||||
| func NewCollectorWithInitData(cfg *Config, onCollected func(collector *Collector), initData map[cdssdk.HubID]Connectivity) Collector { | |||||
| rpt := Collector{ | rpt := Collector{ | ||||
| cfg: cfg, | cfg: cfg, | ||||
| collectNow: make(chan any), | collectNow: make(chan any), | ||||
| @@ -52,22 +52,22 @@ func NewCollectorWithInitData(cfg *Config, onCollected func(collector *Collector | |||||
| return rpt | return rpt | ||||
| } | } | ||||
| func (r *Collector) Get(nodeID cdssdk.NodeID) *Connectivity { | |||||
| func (r *Collector) Get(hubID cdssdk.HubID) *Connectivity { | |||||
| r.lock.RLock() | r.lock.RLock() | ||||
| defer r.lock.RUnlock() | defer r.lock.RUnlock() | ||||
| con, ok := r.connectivities[nodeID] | |||||
| con, ok := r.connectivities[hubID] | |||||
| if ok { | if ok { | ||||
| return &con | return &con | ||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| func (r *Collector) GetAll() map[cdssdk.NodeID]Connectivity { | |||||
| func (r *Collector) GetAll() map[cdssdk.HubID]Connectivity { | |||||
| r.lock.RLock() | r.lock.RLock() | ||||
| defer r.lock.RUnlock() | defer r.lock.RUnlock() | ||||
| ret := make(map[cdssdk.NodeID]Connectivity) | |||||
| ret := make(map[cdssdk.HubID]Connectivity) | |||||
| for k, v := range r.connectivities { | for k, v := range r.connectivities { | ||||
| ret[k] = v | ret[k] = v | ||||
| } | } | ||||
| @@ -136,31 +136,31 @@ func (r *Collector) testing() { | |||||
| } | } | ||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| getNodeResp, err := coorCli.GetNodes(coormq.NewGetNodes(nil)) | |||||
| getHubResp, err := coorCli.GetHubs(coormq.NewGetHubs(nil)) | |||||
| if err != nil { | if err != nil { | ||||
| return | return | ||||
| } | } | ||||
| wg := sync.WaitGroup{} | wg := sync.WaitGroup{} | ||||
| cons := make([]Connectivity, len(getNodeResp.Nodes)) | |||||
| for i, node := range getNodeResp.Nodes { | |||||
| cons := make([]Connectivity, len(getHubResp.Hubs)) | |||||
| for i, hub := range getHubResp.Hubs { | |||||
| tmpIdx := i | tmpIdx := i | ||||
| tmpNode := node | |||||
| tmpHub := hub | |||||
| wg.Add(1) | wg.Add(1) | ||||
| go func() { | go func() { | ||||
| defer wg.Done() | defer wg.Done() | ||||
| cons[tmpIdx] = r.ping(tmpNode) | |||||
| cons[tmpIdx] = r.ping(tmpHub) | |||||
| }() | }() | ||||
| } | } | ||||
| wg.Wait() | wg.Wait() | ||||
| r.lock.Lock() | r.lock.Lock() | ||||
| // 删除所有node的记录,然后重建,避免node数量变化时导致残余数据 | |||||
| r.connectivities = make(map[cdssdk.NodeID]Connectivity) | |||||
| // 删除所有hub的记录,然后重建,避免hub数量变化时导致残余数据 | |||||
| r.connectivities = make(map[cdssdk.HubID]Connectivity) | |||||
| for _, con := range cons { | for _, con := range cons { | ||||
| r.connectivities[con.ToNodeID] = con | |||||
| r.connectivities[con.ToHubID] = con | |||||
| } | } | ||||
| r.lock.Unlock() | r.lock.Unlock() | ||||
| @@ -169,14 +169,14 @@ func (r *Collector) testing() { | |||||
| } | } | ||||
| } | } | ||||
| func (r *Collector) ping(node cdssdk.Node) Connectivity { | |||||
| log := logger.WithType[Collector]("").WithField("NodeID", node.NodeID) | |||||
| func (r *Collector) ping(hub cdssdk.Hub) Connectivity { | |||||
| log := logger.WithType[Collector]("").WithField("HubID", hub.HubID) | |||||
| var ip string | var ip string | ||||
| var port int | var port int | ||||
| switch addr := node.Address.(type) { | |||||
| switch addr := hub.Address.(type) { | |||||
| case *cdssdk.GRPCAddressInfo: | case *cdssdk.GRPCAddressInfo: | ||||
| if node.LocationID == stgglb.Local.LocationID { | |||||
| if hub.LocationID == stgglb.Local.LocationID { | |||||
| ip = addr.LocalIP | ip = addr.LocalIP | ||||
| port = addr.LocalGRPCPort | port = addr.LocalGRPCPort | ||||
| } else { | } else { | ||||
| @@ -189,7 +189,7 @@ func (r *Collector) ping(node cdssdk.Node) Connectivity { | |||||
| log.Warnf("unsupported address type: %v", addr) | log.Warnf("unsupported address type: %v", addr) | ||||
| return Connectivity{ | return Connectivity{ | ||||
| ToNodeID: node.NodeID, | |||||
| ToHubID: hub.HubID, | |||||
| Delay: nil, | Delay: nil, | ||||
| TestTime: time.Now(), | TestTime: time.Now(), | ||||
| } | } | ||||
| @@ -199,7 +199,7 @@ func (r *Collector) ping(node cdssdk.Node) Connectivity { | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("new agent %v:%v rpc client: %w", ip, port, err) | log.Warnf("new agent %v:%v rpc client: %w", ip, port, err) | ||||
| return Connectivity{ | return Connectivity{ | ||||
| ToNodeID: node.NodeID, | |||||
| ToHubID: hub.HubID, | |||||
| Delay: nil, | Delay: nil, | ||||
| TestTime: time.Now(), | TestTime: time.Now(), | ||||
| } | } | ||||
| @@ -211,7 +211,7 @@ func (r *Collector) ping(node cdssdk.Node) Connectivity { | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("pre ping: %v", err) | log.Warnf("pre ping: %v", err) | ||||
| return Connectivity{ | return Connectivity{ | ||||
| ToNodeID: node.NodeID, | |||||
| ToHubID: hub.HubID, | |||||
| Delay: nil, | Delay: nil, | ||||
| TestTime: time.Now(), | TestTime: time.Now(), | ||||
| } | } | ||||
| @@ -225,7 +225,7 @@ func (r *Collector) ping(node cdssdk.Node) Connectivity { | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("ping: %v", err) | log.Warnf("ping: %v", err) | ||||
| return Connectivity{ | return Connectivity{ | ||||
| ToNodeID: node.NodeID, | |||||
| ToHubID: hub.HubID, | |||||
| Delay: nil, | Delay: nil, | ||||
| TestTime: time.Now(), | TestTime: time.Now(), | ||||
| } | } | ||||
| @@ -240,7 +240,7 @@ func (r *Collector) ping(node cdssdk.Node) Connectivity { | |||||
| delay := avgDelay / 3 | delay := avgDelay / 3 | ||||
| return Connectivity{ | return Connectivity{ | ||||
| ToNodeID: node.NodeID, | |||||
| ToHubID: hub.HubID, | |||||
| Delay: &delay, | Delay: &delay, | ||||
| TestTime: time.Now(), | TestTime: time.Now(), | ||||
| } | } | ||||
| @@ -17,9 +17,9 @@ func (db *DB) Cache() *CacheDB { | |||||
| return &CacheDB{DB: db} | return &CacheDB{DB: db} | ||||
| } | } | ||||
| func (*CacheDB) Get(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) (model.Cache, error) { | |||||
| func (*CacheDB) Get(ctx SQLContext, fileHash string, hubID cdssdk.HubID) (model.Cache, error) { | |||||
| var ret model.Cache | var ret model.Cache | ||||
| err := sqlx.Get(ctx, &ret, "select * from Cache where FileHash = ? and NodeID = ?", fileHash, nodeID) | |||||
| err := sqlx.Get(ctx, &ret, "select * from Cache where FileHash = ? and HubID = ?", fileHash, hubID) | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| @@ -29,15 +29,15 @@ func (*CacheDB) BatchGetAllFileHashes(ctx SQLContext, start int, count int) ([]s | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| func (*CacheDB) GetByNodeID(ctx SQLContext, nodeID cdssdk.NodeID) ([]model.Cache, error) { | |||||
| func (*CacheDB) GetByHubID(ctx SQLContext, hubID cdssdk.HubID) ([]model.Cache, error) { | |||||
| var ret []model.Cache | var ret []model.Cache | ||||
| err := sqlx.Select(ctx, &ret, "select * from Cache where NodeID = ?", nodeID) | |||||
| err := sqlx.Select(ctx, &ret, "select * from Cache where HubID = ?", hubID) | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| // Create 创建一条的缓存记录,如果已有则不进行操作 | // Create 创建一条的缓存记录,如果已有则不进行操作 | ||||
| func (*CacheDB) Create(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID, priority int) error { | |||||
| _, err := ctx.Exec("insert ignore into Cache values(?,?,?,?)", fileHash, nodeID, time.Now(), priority) | |||||
| func (*CacheDB) Create(ctx SQLContext, fileHash string, hubID cdssdk.HubID, priority int) error { | |||||
| _, err := ctx.Exec("insert ignore into Cache values(?,?,?,?)", fileHash, hubID, time.Now(), priority) | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| @@ -52,7 +52,7 @@ func (*CacheDB) BatchCreate(ctx SQLContext, caches []model.Cache) error { | |||||
| } | } | ||||
| return BatchNamedExec( | return BatchNamedExec( | ||||
| ctx, | ctx, | ||||
| "insert into Cache(FileHash,NodeID,CreateTime,Priority) values(:FileHash,:NodeID,:CreateTime,:Priority)"+ | |||||
| "insert into Cache(FileHash,HubID,CreateTime,Priority) values(:FileHash,:HubID,:CreateTime,:Priority)"+ | |||||
| " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)", | " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)", | ||||
| 4, | 4, | ||||
| caches, | caches, | ||||
| @@ -60,7 +60,7 @@ func (*CacheDB) BatchCreate(ctx SQLContext, caches []model.Cache) error { | |||||
| ) | ) | ||||
| } | } | ||||
| func (*CacheDB) BatchCreateOnSameNode(ctx SQLContext, fileHashes []string, nodeID cdssdk.NodeID, priority int) error { | |||||
| func (*CacheDB) BatchCreateOnSameNode(ctx SQLContext, fileHashes []string, hubID cdssdk.HubID, priority int) error { | |||||
| if len(fileHashes) == 0 { | if len(fileHashes) == 0 { | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -70,14 +70,14 @@ func (*CacheDB) BatchCreateOnSameNode(ctx SQLContext, fileHashes []string, nodeI | |||||
| for _, hash := range fileHashes { | for _, hash := range fileHashes { | ||||
| caches = append(caches, model.Cache{ | caches = append(caches, model.Cache{ | ||||
| FileHash: hash, | FileHash: hash, | ||||
| NodeID: nodeID, | |||||
| HubID: hubID, | |||||
| CreateTime: nowTime, | CreateTime: nowTime, | ||||
| Priority: priority, | Priority: priority, | ||||
| }) | }) | ||||
| } | } | ||||
| return BatchNamedExec(ctx, | return BatchNamedExec(ctx, | ||||
| "insert into Cache(FileHash,NodeID,CreateTime,Priority) values(:FileHash,:NodeID,:CreateTime,:Priority)"+ | |||||
| "insert into Cache(FileHash,HubID,CreateTime,Priority) values(:FileHash,:HubID,:CreateTime,:Priority)"+ | |||||
| " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)", | " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)", | ||||
| 4, | 4, | ||||
| caches, | caches, | ||||
| @@ -85,13 +85,13 @@ func (*CacheDB) BatchCreateOnSameNode(ctx SQLContext, fileHashes []string, nodeI | |||||
| ) | ) | ||||
| } | } | ||||
| func (*CacheDB) NodeBatchDelete(ctx SQLContext, nodeID cdssdk.NodeID, fileHashes []string) error { | |||||
| func (*CacheDB) NodeBatchDelete(ctx SQLContext, hubID cdssdk.HubID, fileHashes []string) error { | |||||
| if len(fileHashes) == 0 { | if len(fileHashes) == 0 { | ||||
| return nil | return nil | ||||
| } | } | ||||
| // TODO in语句有长度限制 | // TODO in语句有长度限制 | ||||
| query, args, err := sqlx.In("delete from Cache where NodeID = ? and FileHash in (?)", nodeID, fileHashes) | |||||
| query, args, err := sqlx.In("delete from Cache where HubID = ? and FileHash in (?)", hubID, fileHashes) | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| @@ -103,23 +103,23 @@ func (*CacheDB) NodeBatchDelete(ctx SQLContext, nodeID cdssdk.NodeID, fileHashes | |||||
| func (*CacheDB) GetCachingFileNodes(ctx SQLContext, fileHash string) ([]cdssdk.Node, error) { | func (*CacheDB) GetCachingFileNodes(ctx SQLContext, fileHash string) ([]cdssdk.Node, error) { | ||||
| var x []cdssdk.Node | var x []cdssdk.Node | ||||
| err := sqlx.Select(ctx, &x, | err := sqlx.Select(ctx, &x, | ||||
| "select Node.* from Cache, Node where Cache.FileHash=? and Cache.NodeID = Node.NodeID", fileHash) | |||||
| "select Node.* from Cache, Node where Cache.FileHash=? and Cache.HubID = Node.HubID", fileHash) | |||||
| return x, err | return x, err | ||||
| } | } | ||||
| // DeleteNodeAll 删除一个节点所有的记录 | // DeleteNodeAll 删除一个节点所有的记录 | ||||
| func (*CacheDB) DeleteNodeAll(ctx SQLContext, nodeID cdssdk.NodeID) error { | |||||
| _, err := ctx.Exec("delete from Cache where NodeID = ?", nodeID) | |||||
| func (*CacheDB) DeleteNodeAll(ctx SQLContext, hubID cdssdk.HubID) error { | |||||
| _, err := ctx.Exec("delete from Cache where HubID = ?", hubID) | |||||
| return err | return err | ||||
| } | } | ||||
| // FindCachingFileUserNodes 在缓存表中查询指定数据所在的节点 | // FindCachingFileUserNodes 在缓存表中查询指定数据所在的节点 | ||||
| func (*CacheDB) FindCachingFileUserNodes(ctx SQLContext, userID cdssdk.NodeID, fileHash string) ([]cdssdk.Node, error) { | |||||
| func (*CacheDB) FindCachingFileUserNodes(ctx SQLContext, userID cdssdk.HubID, fileHash string) ([]cdssdk.Node, error) { | |||||
| var x []cdssdk.Node | var x []cdssdk.Node | ||||
| err := sqlx.Select(ctx, &x, | err := sqlx.Select(ctx, &x, | ||||
| "select Node.* from Cache, UserNode, Node where"+ | "select Node.* from Cache, UserNode, Node where"+ | ||||
| " Cache.FileHash=? and Cache.NodeID = UserNode.NodeID and"+ | |||||
| " UserNode.UserID = ? and UserNode.NodeID = Node.NodeID", fileHash, userID) | |||||
| " Cache.FileHash=? and Cache.HubID = UserNode.HubID and"+ | |||||
| " UserNode.UserID = ? and UserNode.HubID = Node.HubID", fileHash, userID) | |||||
| return x, err | return x, err | ||||
| } | } | ||||
| */ | */ | ||||
| @@ -16,9 +16,9 @@ func (db *DB) Node() *NodeDB { | |||||
| return &NodeDB{DB: db} | return &NodeDB{DB: db} | ||||
| } | } | ||||
| func (db *NodeDB) GetByID(ctx SQLContext, nodeID cdssdk.NodeID) (cdssdk.Node, error) { | |||||
| func (db *NodeDB) GetByID(ctx SQLContext, hubID cdssdk.HubID) (cdssdk.Node, error) { | |||||
| var ret cdssdk.Node | var ret cdssdk.Node | ||||
| err := sqlx.Get(ctx, &ret, "select * from Node where NodeID = ?", nodeID) | |||||
| err := sqlx.Get(ctx, &ret, "select * from Node where HubID = ?", hubID) | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| @@ -31,13 +31,13 @@ func (db *NodeDB) GetAllNodes(ctx SQLContext) ([]cdssdk.Node, error) { | |||||
| // GetUserNodes 根据用户id查询可用node | // GetUserNodes 根据用户id查询可用node | ||||
| func (db *NodeDB) GetUserNodes(ctx SQLContext, userID cdssdk.UserID) ([]cdssdk.Node, error) { | func (db *NodeDB) GetUserNodes(ctx SQLContext, userID cdssdk.UserID) ([]cdssdk.Node, error) { | ||||
| var nodes []cdssdk.Node | var nodes []cdssdk.Node | ||||
| err := sqlx.Select(ctx, &nodes, "select Node.* from UserNode, Node where UserNode.NodeID = Node.NodeID and UserNode.UserID=?", userID) | |||||
| err := sqlx.Select(ctx, &nodes, "select Node.* from UserNode, Node where UserNode.HubID = Node.HubID and UserNode.UserID=?", userID) | |||||
| return nodes, err | return nodes, err | ||||
| } | } | ||||
| // UpdateState 更新状态,并且设置上次上报时间为现在 | // UpdateState 更新状态,并且设置上次上报时间为现在 | ||||
| func (db *NodeDB) UpdateState(ctx SQLContext, nodeID cdssdk.NodeID, state string) error { | |||||
| _, err := ctx.Exec("update Node set State = ?, LastReportTime = ? where NodeID = ?", state, time.Now(), nodeID) | |||||
| func (db *NodeDB) UpdateState(ctx SQLContext, hubID cdssdk.HubID, state string) error { | |||||
| _, err := ctx.Exec("update Node set State = ?, LastReportTime = ? where HubID = ?", state, time.Now(), hubID) | |||||
| return err | return err | ||||
| } | } | ||||
| */ | */ | ||||
| @@ -15,14 +15,14 @@ func (db *DB) NodeConnectivity() *NodeConnectivityDB { | |||||
| return &NodeConnectivityDB{DB: db} | return &NodeConnectivityDB{DB: db} | ||||
| } | } | ||||
| func (db *NodeConnectivityDB) BatchGetByFromNode(ctx SQLContext, fromNodeIDs []cdssdk.NodeID) ([]model.NodeConnectivity, error) { | |||||
| if len(fromNodeIDs) == 0 { | |||||
| func (db *NodeConnectivityDB) BatchGetByFromNode(ctx SQLContext, fromHubIDs []cdssdk.HubID) ([]model.NodeConnectivity, error) { | |||||
| if len(fromHubIDs) == 0 { | |||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| var ret []model.NodeConnectivity | var ret []model.NodeConnectivity | ||||
| sql, args, err := sqlx.In("select * from NodeConnectivity where FromNodeID in (?)", fromNodeIDs) | |||||
| sql, args, err := sqlx.In("select * from NodeConnectivity where FromHubID in (?)", fromHubIDs) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| @@ -36,7 +36,7 @@ func (db *NodeConnectivityDB) BatchUpdateOrCreate(ctx SQLContext, cons []model.N | |||||
| } | } | ||||
| return BatchNamedExec(ctx, | return BatchNamedExec(ctx, | ||||
| "insert into NodeConnectivity(FromNodeID, ToNodeID, Delay, TestTime) values(:FromNodeID, :ToNodeID, :Delay, :TestTime) as new"+ | |||||
| "insert into NodeConnectivity(FromHubID, ToHubID, Delay, TestTime) values(:FromHubID, :ToHubID, :Delay, :TestTime) as new"+ | |||||
| " on duplicate key update Delay = new.Delay, TestTime = new.TestTime", 4, cons, nil) | " on duplicate key update Delay = new.Delay, TestTime = new.TestTime", 4, cons, nil) | ||||
| } | } | ||||
| */ | */ | ||||
| @@ -175,9 +175,9 @@ func (db *ObjectDB) GetPackageObjectDetails(ctx SQLContext, packageID cdssdk.Pac | |||||
| return details, nil | return details, nil | ||||
| } | } | ||||
| func (*ObjectDB) GetObjectsIfAnyBlockOnNode(ctx SQLContext, nodeID cdssdk.NodeID) ([]cdssdk.Object, error) { | |||||
| func (*ObjectDB) GetObjectsIfAnyBlockOnNode(ctx SQLContext, hubID cdssdk.HubID) ([]cdssdk.Object, error) { | |||||
| var temps []model.TempObject | var temps []model.TempObject | ||||
| err := sqlx.Select(ctx, &temps, "select * from Object where ObjectID in (select ObjectID from ObjectBlock where NodeID = ?) order by ObjectID asc", nodeID) | |||||
| err := sqlx.Select(ctx, &temps, "select * from Object where ObjectID in (select ObjectID from ObjectBlock where HubID = ?) order by ObjectID asc", hubID) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("getting objects: %w", err) | return nil, fmt.Errorf("getting objects: %w", err) | ||||
| } | } | ||||
| @@ -247,7 +247,7 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds [] | |||||
| objBlocks = append(objBlocks, stgmod.ObjectBlock{ | objBlocks = append(objBlocks, stgmod.ObjectBlock{ | ||||
| ObjectID: addedObjIDs[i], | ObjectID: addedObjIDs[i], | ||||
| Index: 0, | Index: 0, | ||||
| NodeID: add.NodeID, | |||||
| HubID: add.HubID, | |||||
| FileHash: add.FileHash, | FileHash: add.FileHash, | ||||
| }) | }) | ||||
| } | } | ||||
| @@ -260,7 +260,7 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds [] | |||||
| for _, add := range adds { | for _, add := range adds { | ||||
| caches = append(caches, model.Cache{ | caches = append(caches, model.Cache{ | ||||
| FileHash: add.FileHash, | FileHash: add.FileHash, | ||||
| NodeID: add.NodeID, | |||||
| HubID: add.HubID, | |||||
| CreateTime: time.Now(), | CreateTime: time.Now(), | ||||
| Priority: 0, | Priority: 0, | ||||
| }) | }) | ||||
| @@ -326,7 +326,7 @@ func (db *ObjectDB) BatchUpdateRedundancy(ctx SQLContext, objs []coormq.Updating | |||||
| for _, blk := range obj.Blocks { | for _, blk := range obj.Blocks { | ||||
| caches = append(caches, model.Cache{ | caches = append(caches, model.Cache{ | ||||
| FileHash: blk.FileHash, | FileHash: blk.FileHash, | ||||
| NodeID: blk.NodeID, | |||||
| HubID: blk.HubID, | |||||
| CreateTime: time.Now(), | CreateTime: time.Now(), | ||||
| Priority: 0, | Priority: 0, | ||||
| }) | }) | ||||
| @@ -16,9 +16,9 @@ func (db *DB) ObjectAccessStat() *ObjectAccessStatDB { | |||||
| return &ObjectAccessStatDB{db} | return &ObjectAccessStatDB{db} | ||||
| } | } | ||||
| func (*ObjectAccessStatDB) Get(ctx SQLContext, objID cdssdk.ObjectID, nodeID cdssdk.NodeID) (stgmod.ObjectAccessStat, error) { | |||||
| func (*ObjectAccessStatDB) Get(ctx SQLContext, objID cdssdk.ObjectID, hubID cdssdk.HubID) (stgmod.ObjectAccessStat, error) { | |||||
| var ret stgmod.ObjectAccessStat | var ret stgmod.ObjectAccessStat | ||||
| err := sqlx.Get(ctx, &ret, "select * from ObjectAccessStat where ObjectID=? and NodeID=?", objID, nodeID) | |||||
| err := sqlx.Get(ctx, &ret, "select * from ObjectAccessStat where ObjectID=? and HubID=?", objID, hubID) | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| @@ -43,13 +43,13 @@ func (*ObjectAccessStatDB) BatchGetByObjectID(ctx SQLContext, objIDs []cdssdk.Ob | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| func (*ObjectAccessStatDB) BatchGetByObjectIDOnNode(ctx SQLContext, objIDs []cdssdk.ObjectID, nodeID cdssdk.NodeID) ([]stgmod.ObjectAccessStat, error) { | |||||
| func (*ObjectAccessStatDB) BatchGetByObjectIDOnNode(ctx SQLContext, objIDs []cdssdk.ObjectID, hubID cdssdk.HubID) ([]stgmod.ObjectAccessStat, error) { | |||||
| if len(objIDs) == 0 { | if len(objIDs) == 0 { | ||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| var ret []stgmod.ObjectAccessStat | var ret []stgmod.ObjectAccessStat | ||||
| stmt, args, err := sqlx.In("select * from ObjectAccessStat where ObjectID in (?) and NodeID=?", objIDs, nodeID) | |||||
| stmt, args, err := sqlx.In("select * from ObjectAccessStat where ObjectID in (?) and HubID=?", objIDs, hubID) | |||||
| if err != nil { | if err != nil { | ||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| @@ -63,8 +63,8 @@ func (*ObjectAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddA | |||||
| return nil | return nil | ||||
| } | } | ||||
| sql := "insert into ObjectAccessStat(ObjectID, NodeID, Counter, Amount) " + | |||||
| " values(:ObjectID, :NodeID, :Counter, 0) as new" + | |||||
| sql := "insert into ObjectAccessStat(ObjectID, HubID, Counter, Amount) " + | |||||
| " values(:ObjectID, :HubID, :Counter, 0) as new" + | |||||
| " on duplicate key update ObjectAccessStat.Counter=ObjectAccessStat.Counter+new.Counter" | " on duplicate key update ObjectAccessStat.Counter=ObjectAccessStat.Counter+new.Counter" | ||||
| err := BatchNamedExec(ctx, sql, 4, entries, nil) | err := BatchNamedExec(ctx, sql, 4, entries, nil) | ||||
| return err | return err | ||||
| @@ -19,9 +19,9 @@ func (db *DB) ObjectBlock() *ObjectBlockDB { | |||||
| return &ObjectBlockDB{DB: db} | return &ObjectBlockDB{DB: db} | ||||
| } | } | ||||
| func (db *ObjectBlockDB) GetByNodeID(ctx SQLContext, nodeID cdssdk.NodeID) ([]stgmod.ObjectBlock, error) { | |||||
| func (db *ObjectBlockDB) GetByHubID(ctx SQLContext, hubID cdssdk.HubID) ([]stgmod.ObjectBlock, error) { | |||||
| var rets []stgmod.ObjectBlock | var rets []stgmod.ObjectBlock | ||||
| err := sqlx.Select(ctx, &rets, "select * from ObjectBlock where NodeID = ?", nodeID) | |||||
| err := sqlx.Select(ctx, &rets, "select * from ObjectBlock where HubID = ?", hubID) | |||||
| return rets, err | return rets, err | ||||
| } | } | ||||
| @@ -45,8 +45,8 @@ func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []cdssdk.O | |||||
| return blocks, nil | return blocks, nil | ||||
| } | } | ||||
| func (db *ObjectBlockDB) Create(ctx SQLContext, objectID cdssdk.ObjectID, index int, nodeID cdssdk.NodeID, fileHash string) error { | |||||
| _, err := ctx.Exec("insert into ObjectBlock values(?,?,?,?)", objectID, index, nodeID, fileHash) | |||||
| func (db *ObjectBlockDB) Create(ctx SQLContext, objectID cdssdk.ObjectID, index int, hubID cdssdk.HubID, fileHash string) error { | |||||
| _, err := ctx.Exec("insert into ObjectBlock values(?,?,?,?)", objectID, index, hubID, fileHash) | |||||
| return err | return err | ||||
| } | } | ||||
| @@ -56,7 +56,7 @@ func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []stgmod.ObjectBlock | |||||
| } | } | ||||
| return BatchNamedExec(ctx, | return BatchNamedExec(ctx, | ||||
| "insert ignore into ObjectBlock(ObjectID, `Index`, NodeID, FileHash) values(:ObjectID, :Index, :NodeID, :FileHash)", | |||||
| "insert ignore into ObjectBlock(ObjectID, `Index`, HubID, FileHash) values(:ObjectID, :Index, :HubID, :FileHash)", | |||||
| 4, | 4, | ||||
| blocks, | blocks, | ||||
| nil, | nil, | ||||
| @@ -87,12 +87,12 @@ func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.Packag | |||||
| return err | return err | ||||
| } | } | ||||
| func (db *ObjectBlockDB) NodeBatchDelete(ctx SQLContext, nodeID cdssdk.NodeID, fileHashes []string) error { | |||||
| func (db *ObjectBlockDB) NodeBatchDelete(ctx SQLContext, hubID cdssdk.HubID, fileHashes []string) error { | |||||
| if len(fileHashes) == 0 { | if len(fileHashes) == 0 { | ||||
| return nil | return nil | ||||
| } | } | ||||
| query, args, err := sqlx.In("delete from ObjectBlock where NodeID = ? and FileHash in (?)", nodeID, fileHashes) | |||||
| query, args, err := sqlx.In("delete from ObjectBlock where HubID = ? and FileHash in (?)", hubID, fileHashes) | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| @@ -117,14 +117,14 @@ func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (in | |||||
| // 按逗号切割字符串,并将每一个部分解析为一个int64的ID。 | // 按逗号切割字符串,并将每一个部分解析为一个int64的ID。 | ||||
| // 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式 | // 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式 | ||||
| func splitConcatedNodeID(idStr string) []cdssdk.NodeID { | |||||
| func splitConcatedHubID(idStr string) []cdssdk.HubID { | |||||
| idStrs := strings.Split(idStr, ",") | idStrs := strings.Split(idStr, ",") | ||||
| ids := make([]cdssdk.NodeID, 0, len(idStrs)) | |||||
| ids := make([]cdssdk.HubID, 0, len(idStrs)) | |||||
| for _, str := range idStrs { | for _, str := range idStrs { | ||||
| // 假设传入的ID是正确的数字格式 | // 假设传入的ID是正确的数字格式 | ||||
| id, _ := strconv.ParseInt(str, 10, 64) | id, _ := strconv.ParseInt(str, 10, 64) | ||||
| ids = append(ids, cdssdk.NodeID(id)) | |||||
| ids = append(ids, cdssdk.HubID(id)) | |||||
| } | } | ||||
| return ids | return ids | ||||
| @@ -16,9 +16,9 @@ func (db *DB) PackageAccessStat() *PackageAccessStatDB { | |||||
| return &PackageAccessStatDB{db} | return &PackageAccessStatDB{db} | ||||
| } | } | ||||
| func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID cdssdk.PackageID, nodeID cdssdk.NodeID) (stgmod.PackageAccessStat, error) { | |||||
| func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID cdssdk.PackageID, hubID cdssdk.HubID) (stgmod.PackageAccessStat, error) { | |||||
| var ret stgmod.PackageAccessStat | var ret stgmod.PackageAccessStat | ||||
| err := sqlx.Get(ctx, &ret, "select * from PackageAccessStat where PackageID=? and NodeID=?", pkgID, nodeID) | |||||
| err := sqlx.Get(ctx, &ret, "select * from PackageAccessStat where PackageID=? and HubID=?", pkgID, hubID) | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| @@ -48,8 +48,8 @@ func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.Add | |||||
| return nil | return nil | ||||
| } | } | ||||
| sql := "insert into PackageAccessStat(PackageID, NodeID, Counter, Amount)" + | |||||
| " values(:PackageID, :NodeID, :Counter, 0) as new" + | |||||
| sql := "insert into PackageAccessStat(PackageID, HubID, Counter, Amount)" + | |||||
| " values(:PackageID, :HubID, :Counter, 0) as new" + | |||||
| " on duplicate key update Counter=Counter+new.Counter" | " on duplicate key update Counter=Counter+new.Counter" | ||||
| err := BatchNamedExec(ctx, sql, 4, entries, nil) | err := BatchNamedExec(ctx, sql, 4, entries, nil) | ||||
| return err | return err | ||||
| @@ -22,9 +22,9 @@ func (*LocationDB) GetByID(ctx SQLContext, id int64) (model.Location, error) { | |||||
| func (db *LocationDB) FindLocationByExternalIP(ctx SQLContext, ip string) (model.Location, error) { | func (db *LocationDB) FindLocationByExternalIP(ctx SQLContext, ip string) (model.Location, error) { | ||||
| var locID int64 | var locID int64 | ||||
| err := ctx.Table("Node").Select("LocationID").Where("ExternalIP = ?", ip).Scan(&locID).Error | |||||
| err := ctx.Table("Hub").Select("LocationID").Where("ExternalIP = ?", ip).Scan(&locID).Error | |||||
| if err != nil { | if err != nil { | ||||
| return model.Location{}, fmt.Errorf("finding node by external ip: %w", err) | |||||
| return model.Location{}, fmt.Errorf("finding hub by external ip: %w", err) | |||||
| } | } | ||||
| loc, err := db.GetByID(ctx, locID) | loc, err := db.GetByID(ctx, locID) | ||||
| @@ -28,13 +28,13 @@ func (UserBucket) TableName() string { | |||||
| return "UserBucket" | return "UserBucket" | ||||
| } | } | ||||
| type UserNode struct { | |||||
| type UserHub struct { | |||||
| UserID cdssdk.UserID `gorm:"column:UserID; primaryKey; type:bigint" json:"userID"` | UserID cdssdk.UserID `gorm:"column:UserID; primaryKey; type:bigint" json:"userID"` | ||||
| NodeID cdssdk.NodeID `gorm:"column:NodeID; primaryKey; type:bigint" json:"nodeID"` | |||||
| HubID cdssdk.HubID `gorm:"column:HubID; primaryKey; type:bigint" json:"hubID"` | |||||
| } | } | ||||
| func (UserNode) TableName() string { | |||||
| return "UserNode" | |||||
| func (UserHub) TableName() string { | |||||
| return "UserHub" | |||||
| } | } | ||||
| type UserStorage struct { | type UserStorage struct { | ||||
| @@ -52,7 +52,7 @@ type Package = cdssdk.Package | |||||
| type Object = cdssdk.Object | type Object = cdssdk.Object | ||||
| type NodeConnectivity = cdssdk.NodeConnectivity | |||||
| type HubConnectivity = cdssdk.HubConnectivity | |||||
| type ObjectBlock = stgmod.ObjectBlock | type ObjectBlock = stgmod.ObjectBlock | ||||
| @@ -6,52 +6,52 @@ import ( | |||||
| cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | ||||
| ) | ) | ||||
| type NodeDB struct { | |||||
| type HubDB struct { | |||||
| *DB | *DB | ||||
| } | } | ||||
| func (db *DB) Node() *NodeDB { | |||||
| return &NodeDB{DB: db} | |||||
| func (db *DB) Hub() *HubDB { | |||||
| return &HubDB{DB: db} | |||||
| } | } | ||||
| func (*NodeDB) GetAllNodes(ctx SQLContext) ([]cdssdk.Node, error) { | |||||
| var ret []cdssdk.Node | |||||
| func (*HubDB) GetAllHubs(ctx SQLContext) ([]cdssdk.Hub, error) { | |||||
| var ret []cdssdk.Hub | |||||
| err := ctx.Table("Node").Find(&ret).Error | |||||
| err := ctx.Table("Hub").Find(&ret).Error | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| func (*NodeDB) GetByID(ctx SQLContext, nodeID cdssdk.NodeID) (cdssdk.Node, error) { | |||||
| var ret cdssdk.Node | |||||
| err := ctx.Table("Node").Where("NodeID = ?", nodeID).Find(&ret).Error | |||||
| func (*HubDB) GetByID(ctx SQLContext, hubID cdssdk.HubID) (cdssdk.Hub, error) { | |||||
| var ret cdssdk.Hub | |||||
| err := ctx.Table("Hub").Where("HubID = ?", hubID).Find(&ret).Error | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| func (*NodeDB) BatchGetByID(ctx SQLContext, nodeIDs []cdssdk.NodeID) ([]cdssdk.Node, error) { | |||||
| var ret []cdssdk.Node | |||||
| err := ctx.Table("Node").Where("NodeID IN (?)", nodeIDs).Find(&ret).Error | |||||
| func (*HubDB) BatchGetByID(ctx SQLContext, hubIDs []cdssdk.HubID) ([]cdssdk.Hub, error) { | |||||
| var ret []cdssdk.Hub | |||||
| err := ctx.Table("Hub").Where("HubID IN (?)", hubIDs).Find(&ret).Error | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| // GetUserNodes 根据用户id查询可用node | |||||
| func (*NodeDB) GetUserNodes(ctx SQLContext, userID cdssdk.UserID) ([]cdssdk.Node, error) { | |||||
| var nodes []cdssdk.Node | |||||
| // GetUserHubs 根据用户id查询可用hub | |||||
| func (*HubDB) GetUserHubs(ctx SQLContext, userID cdssdk.UserID) ([]cdssdk.Hub, error) { | |||||
| var hubs []cdssdk.Hub | |||||
| err := ctx. | err := ctx. | ||||
| Table("Node"). | |||||
| Select("Node.*"). | |||||
| Joins("JOIN UserNode ON UserNode.NodeID = Node.NodeID"). | |||||
| Where("UserNode.UserID = ?", userID). | |||||
| Find(&nodes).Error | |||||
| return nodes, err | |||||
| Table("Hub"). | |||||
| Select("Hub.*"). | |||||
| Joins("JOIN UserHub ON UserHub.HubID = Hub.HubID"). | |||||
| Where("UserHub.UserID = ?", userID). | |||||
| Find(&hubs).Error | |||||
| return hubs, err | |||||
| } | } | ||||
| // UpdateState 更新状态,并且设置上次上报时间为现在 | // UpdateState 更新状态,并且设置上次上报时间为现在 | ||||
| func (*NodeDB) UpdateState(ctx SQLContext, nodeID cdssdk.NodeID, state string) error { | |||||
| func (*HubDB) UpdateState(ctx SQLContext, hubID cdssdk.HubID, state string) error { | |||||
| err := ctx. | err := ctx. | ||||
| Model(&cdssdk.Node{}). | |||||
| Where("NodeID = ?", nodeID). | |||||
| Model(&cdssdk.Hub{}). | |||||
| Where("HubID = ?", hubID). | |||||
| Updates(map[string]interface{}{ | Updates(map[string]interface{}{ | ||||
| "State": state, | "State": state, | ||||
| "LastReportTime": time.Now(), | "LastReportTime": time.Now(), | ||||
| @@ -6,32 +6,32 @@ import ( | |||||
| "gorm.io/gorm/clause" | "gorm.io/gorm/clause" | ||||
| ) | ) | ||||
| type NodeConnectivityDB struct { | |||||
| type HubConnectivityDB struct { | |||||
| *DB | *DB | ||||
| } | } | ||||
| func (db *DB) NodeConnectivity() *NodeConnectivityDB { | |||||
| return &NodeConnectivityDB{DB: db} | |||||
| func (db *DB) HubConnectivity() *HubConnectivityDB { | |||||
| return &HubConnectivityDB{DB: db} | |||||
| } | } | ||||
| func (db *NodeConnectivityDB) BatchGetByFromNode(ctx SQLContext, fromNodeIDs []cdssdk.NodeID) ([]model.NodeConnectivity, error) { | |||||
| if len(fromNodeIDs) == 0 { | |||||
| func (db *HubConnectivityDB) BatchGetByFromHub(ctx SQLContext, fromHubIDs []cdssdk.HubID) ([]model.HubConnectivity, error) { | |||||
| if len(fromHubIDs) == 0 { | |||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| var ret []model.NodeConnectivity | |||||
| var ret []model.HubConnectivity | |||||
| err := ctx.Table("NodeConnectivity").Where("FromNodeID IN (?)", fromNodeIDs).Find(&ret).Error | |||||
| err := ctx.Table("HubConnectivity").Where("FromHubID IN (?)", fromHubIDs).Find(&ret).Error | |||||
| return ret, err | return ret, err | ||||
| } | } | ||||
| func (db *NodeConnectivityDB) BatchUpdateOrCreate(ctx SQLContext, cons []model.NodeConnectivity) error { | |||||
| func (db *HubConnectivityDB) BatchUpdateOrCreate(ctx SQLContext, cons []model.HubConnectivity) error { | |||||
| if len(cons) == 0 { | if len(cons) == 0 { | ||||
| return nil | return nil | ||||
| } | } | ||||
| // 使用 GORM 的批量插入或更新 | // 使用 GORM 的批量插入或更新 | ||||
| return ctx.Table("NodeConnectivity").Clauses(clause.OnConflict{ | |||||
| return ctx.Table("HubConnectivity").Clauses(clause.OnConflict{ | |||||
| UpdateAll: true, | UpdateAll: true, | ||||
| }).Create(&cons).Error | }).Create(&cons).Error | ||||
| } | } | ||||
| @@ -88,14 +88,14 @@ func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (in | |||||
| // 按逗号切割字符串,并将每一个部分解析为一个int64的ID。 | // 按逗号切割字符串,并将每一个部分解析为一个int64的ID。 | ||||
| // 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式 | // 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式 | ||||
| func splitConcatedNodeID(idStr string) []cdssdk.NodeID { | |||||
| func splitConcatedHubID(idStr string) []cdssdk.HubID { | |||||
| idStrs := strings.Split(idStr, ",") | idStrs := strings.Split(idStr, ",") | ||||
| ids := make([]cdssdk.NodeID, 0, len(idStrs)) | |||||
| ids := make([]cdssdk.HubID, 0, len(idStrs)) | |||||
| for _, str := range idStrs { | for _, str := range idStrs { | ||||
| // 假设传入的ID是正确的数字格式 | // 假设传入的ID是正确的数字格式 | ||||
| id, _ := strconv.ParseInt(str, 10, 64) | id, _ := strconv.ParseInt(str, 10, 64) | ||||
| ids = append(ids, cdssdk.NodeID(id)) | |||||
| ids = append(ids, cdssdk.HubID(id)) | |||||
| } | } | ||||
| return ids | return ids | ||||
| @@ -80,7 +80,7 @@ func (db *StorageDB) GetUserStorageByName(ctx SQLContext, userID cdssdk.UserID, | |||||
| return stg, err | return stg, err | ||||
| } | } | ||||
| func (db *StorageDB) GetHubStorages(ctx SQLContext, hubID cdssdk.NodeID) ([]model.Storage, error) { | |||||
| func (db *StorageDB) GetHubStorages(ctx SQLContext, hubID cdssdk.HubID) ([]model.Storage, error) { | |||||
| var stgs []model.Storage | var stgs []model.Storage | ||||
| err := ctx.Table("Storage").Select("Storage.*").Find(&stgs, "MasterHub = ?", hubID).Error | err := ctx.Table("Storage").Select("Storage.*").Find(&stgs, "MasterHub = ?", hubID).Error | ||||
| return stgs, err | return stgs, err | ||||
| @@ -89,7 +89,7 @@ func (db *StorageDB) GetHubStorages(ctx SQLContext, hubID cdssdk.NodeID) ([]mode | |||||
| func (db *StorageDB) FillDetails(ctx SQLContext, details []stgmod.StorageDetail) error { | func (db *StorageDB) FillDetails(ctx SQLContext, details []stgmod.StorageDetail) error { | ||||
| stgsMp := make(map[cdssdk.StorageID]*stgmod.StorageDetail) | stgsMp := make(map[cdssdk.StorageID]*stgmod.StorageDetail) | ||||
| stgIDs := make([]cdssdk.StorageID, 0, len(details)) | stgIDs := make([]cdssdk.StorageID, 0, len(details)) | ||||
| var masterHubIDs []cdssdk.NodeID | |||||
| var masterHubIDs []cdssdk.HubID | |||||
| for i := range details { | for i := range details { | ||||
| stgsMp[details[i].Storage.StorageID] = &details[i] | stgsMp[details[i].Storage.StorageID] = &details[i] | ||||
| stgIDs = append(stgIDs, details[i].Storage.StorageID) | stgIDs = append(stgIDs, details[i].Storage.StorageID) | ||||
| @@ -97,13 +97,13 @@ func (db *StorageDB) FillDetails(ctx SQLContext, details []stgmod.StorageDetail) | |||||
| } | } | ||||
| // 获取监护Hub信息 | // 获取监护Hub信息 | ||||
| masterHubs, err := db.Node().BatchGetByID(ctx, masterHubIDs) | |||||
| masterHubs, err := db.Hub().BatchGetByID(ctx, masterHubIDs) | |||||
| if err != nil && err != gorm.ErrRecordNotFound { | if err != nil && err != gorm.ErrRecordNotFound { | ||||
| return fmt.Errorf("getting master hub: %w", err) | return fmt.Errorf("getting master hub: %w", err) | ||||
| } | } | ||||
| masterHubMap := make(map[cdssdk.NodeID]cdssdk.Node) | |||||
| masterHubMap := make(map[cdssdk.HubID]cdssdk.Hub) | |||||
| for _, hub := range masterHubs { | for _, hub := range masterHubs { | ||||
| masterHubMap[hub.NodeID] = hub | |||||
| masterHubMap[hub.HubID] = hub | |||||
| } | } | ||||
| for _, stg := range stgsMp { | for _, stg := range stgsMp { | ||||
| if stg.Storage.MasterHub != 0 { | if stg.Storage.MasterHub != 0 { | ||||
| @@ -8,10 +8,10 @@ import ( | |||||
| ) | ) | ||||
| const ( | const ( | ||||
| IPFSLockPathPrefix = "IPFS" | |||||
| IPFSNodeIDPathIndex = 1 | |||||
| IPFSBuzyLock = "Buzy" | |||||
| IPFSGCLock = "GC" | |||||
| IPFSLockPathPrefix = "IPFS" | |||||
| IPFSHubIDPathIndex = 1 | |||||
| IPFSBuzyLock = "Buzy" | |||||
| IPFSGCLock = "GC" | |||||
| ) | ) | ||||
| type IPFSLock struct { | type IPFSLock struct { | ||||
| @@ -28,7 +28,7 @@ func NewIPFSLock() *IPFSLock { | |||||
| // CanLock 判断这个锁能否锁定成功 | // CanLock 判断这个锁能否锁定成功 | ||||
| func (l *IPFSLock) CanLock(lock distlock.Lock) error { | func (l *IPFSLock) CanLock(lock distlock.Lock) error { | ||||
| nodeLock, ok := l.nodeLocks[lock.Path[IPFSNodeIDPathIndex]] | |||||
| nodeLock, ok := l.nodeLocks[lock.Path[IPFSHubIDPathIndex]] | |||||
| if !ok { | if !ok { | ||||
| // 不能直接返回nil,因为如果锁数据的格式不对,也不能获取锁。 | // 不能直接返回nil,因为如果锁数据的格式不对,也不能获取锁。 | ||||
| // 这里使用一个空Provider来进行检查。 | // 这里使用一个空Provider来进行检查。 | ||||
| @@ -40,12 +40,12 @@ func (l *IPFSLock) CanLock(lock distlock.Lock) error { | |||||
| // 锁定。在内部可以不用判断能否加锁,外部需要保证调用此函数前调用了CanLock进行检查 | // 锁定。在内部可以不用判断能否加锁,外部需要保证调用此函数前调用了CanLock进行检查 | ||||
| func (l *IPFSLock) Lock(reqID string, lock distlock.Lock) error { | func (l *IPFSLock) Lock(reqID string, lock distlock.Lock) error { | ||||
| nodeID := lock.Path[IPFSNodeIDPathIndex] | |||||
| hubID := lock.Path[IPFSHubIDPathIndex] | |||||
| nodeLock, ok := l.nodeLocks[nodeID] | |||||
| nodeLock, ok := l.nodeLocks[hubID] | |||||
| if !ok { | if !ok { | ||||
| nodeLock = NewIPFSNodeLock() | nodeLock = NewIPFSNodeLock() | ||||
| l.nodeLocks[nodeID] = nodeLock | |||||
| l.nodeLocks[hubID] = nodeLock | |||||
| } | } | ||||
| return nodeLock.Lock(reqID, lock) | return nodeLock.Lock(reqID, lock) | ||||
| @@ -53,9 +53,9 @@ func (l *IPFSLock) Lock(reqID string, lock distlock.Lock) error { | |||||
| // 解锁 | // 解锁 | ||||
| func (l *IPFSLock) Unlock(reqID string, lock distlock.Lock) error { | func (l *IPFSLock) Unlock(reqID string, lock distlock.Lock) error { | ||||
| nodeID := lock.Path[IPFSNodeIDPathIndex] | |||||
| hubID := lock.Path[IPFSHubIDPathIndex] | |||||
| nodeLock, ok := l.nodeLocks[nodeID] | |||||
| nodeLock, ok := l.nodeLocks[hubID] | |||||
| if !ok { | if !ok { | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -18,12 +18,12 @@ func Test_IPFSLock(t *testing.T) { | |||||
| title: "同节点,同一个Buzy锁", | title: "同节点,同一个Buzy锁", | ||||
| initLocks: []distlock.Lock{ | initLocks: []distlock.Lock{ | ||||
| { | { | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSBuzyLock, | Name: IPFSBuzyLock, | ||||
| }, | }, | ||||
| }, | }, | ||||
| doLock: distlock.Lock{ | doLock: distlock.Lock{ | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSBuzyLock, | Name: IPFSBuzyLock, | ||||
| }, | }, | ||||
| wantOK: true, | wantOK: true, | ||||
| @@ -32,12 +32,12 @@ func Test_IPFSLock(t *testing.T) { | |||||
| title: "同节点,同一个GC锁", | title: "同节点,同一个GC锁", | ||||
| initLocks: []distlock.Lock{ | initLocks: []distlock.Lock{ | ||||
| { | { | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSGCLock, | Name: IPFSGCLock, | ||||
| }, | }, | ||||
| }, | }, | ||||
| doLock: distlock.Lock{ | doLock: distlock.Lock{ | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSGCLock, | Name: IPFSGCLock, | ||||
| }, | }, | ||||
| wantOK: true, | wantOK: true, | ||||
| @@ -46,13 +46,13 @@ func Test_IPFSLock(t *testing.T) { | |||||
| title: "同时设置Buzy和GC", | title: "同时设置Buzy和GC", | ||||
| initLocks: []distlock.Lock{ | initLocks: []distlock.Lock{ | ||||
| { | { | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSBuzyLock, | Name: IPFSBuzyLock, | ||||
| Target: *NewStringLockTarget(), | Target: *NewStringLockTarget(), | ||||
| }, | }, | ||||
| }, | }, | ||||
| doLock: distlock.Lock{ | doLock: distlock.Lock{ | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSGCLock, | Name: IPFSGCLock, | ||||
| Target: *NewStringLockTarget(), | Target: *NewStringLockTarget(), | ||||
| }, | }, | ||||
| @@ -81,7 +81,7 @@ func Test_IPFSLock(t *testing.T) { | |||||
| ipfsLock := NewIPFSLock() | ipfsLock := NewIPFSLock() | ||||
| lock := distlock.Lock{ | lock := distlock.Lock{ | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSBuzyLock, | Name: IPFSBuzyLock, | ||||
| } | } | ||||
| @@ -93,7 +93,7 @@ func Test_IPFSLock(t *testing.T) { | |||||
| ipfsLock.Unlock("req1", lock) | ipfsLock.Unlock("req1", lock) | ||||
| lock = distlock.Lock{ | lock = distlock.Lock{ | ||||
| Path: []string{IPFSLockPathPrefix, "node1"}, | |||||
| Path: []string{IPFSLockPathPrefix, "hub1"}, | |||||
| Name: IPFSGCLock, | Name: IPFSGCLock, | ||||
| } | } | ||||
| err = ipfsLock.CanLock(lock) | err = ipfsLock.CanLock(lock) | ||||
| @@ -8,10 +8,10 @@ import ( | |||||
| ) | ) | ||||
| const ( | const ( | ||||
| StorageLockPathPrefix = "Storage" | |||||
| StorageNodeIDPathIndex = 1 | |||||
| StorageBuzyLock = "Buzy" | |||||
| StorageGCLock = "GC" | |||||
| StorageLockPathPrefix = "Storage" | |||||
| StorageHubIDPathIndex = 1 | |||||
| StorageBuzyLock = "Buzy" | |||||
| StorageGCLock = "GC" | |||||
| ) | ) | ||||
| type StorageLock struct { | type StorageLock struct { | ||||
| @@ -28,7 +28,7 @@ func NewStorageLock() *StorageLock { | |||||
| // CanLock 判断这个锁能否锁定成功 | // CanLock 判断这个锁能否锁定成功 | ||||
| func (l *StorageLock) CanLock(lock distlock.Lock) error { | func (l *StorageLock) CanLock(lock distlock.Lock) error { | ||||
| nodeLock, ok := l.nodeLocks[lock.Path[StorageNodeIDPathIndex]] | |||||
| nodeLock, ok := l.nodeLocks[lock.Path[StorageHubIDPathIndex]] | |||||
| if !ok { | if !ok { | ||||
| // 不能直接返回nil,因为如果锁数据的格式不对,也不能获取锁。 | // 不能直接返回nil,因为如果锁数据的格式不对,也不能获取锁。 | ||||
| // 这里使用一个空Provider来进行检查。 | // 这里使用一个空Provider来进行检查。 | ||||
| @@ -40,12 +40,12 @@ func (l *StorageLock) CanLock(lock distlock.Lock) error { | |||||
| // 锁定。在内部可以不用判断能否加锁,外部需要保证调用此函数前调用了CanLock进行检查 | // 锁定。在内部可以不用判断能否加锁,外部需要保证调用此函数前调用了CanLock进行检查 | ||||
| func (l *StorageLock) Lock(reqID string, lock distlock.Lock) error { | func (l *StorageLock) Lock(reqID string, lock distlock.Lock) error { | ||||
| nodeID := lock.Path[StorageNodeIDPathIndex] | |||||
| hubID := lock.Path[StorageHubIDPathIndex] | |||||
| nodeLock, ok := l.nodeLocks[nodeID] | |||||
| nodeLock, ok := l.nodeLocks[hubID] | |||||
| if !ok { | if !ok { | ||||
| nodeLock = NewStorageNodeLock() | nodeLock = NewStorageNodeLock() | ||||
| l.nodeLocks[nodeID] = nodeLock | |||||
| l.nodeLocks[hubID] = nodeLock | |||||
| } | } | ||||
| return nodeLock.Lock(reqID, lock) | return nodeLock.Lock(reqID, lock) | ||||
| @@ -53,9 +53,9 @@ func (l *StorageLock) Lock(reqID string, lock distlock.Lock) error { | |||||
| // 解锁 | // 解锁 | ||||
| func (l *StorageLock) Unlock(reqID string, lock distlock.Lock) error { | func (l *StorageLock) Unlock(reqID string, lock distlock.Lock) error { | ||||
| nodeID := lock.Path[StorageNodeIDPathIndex] | |||||
| hubID := lock.Path[StorageHubIDPathIndex] | |||||
| nodeLock, ok := l.nodeLocks[nodeID] | |||||
| nodeLock, ok := l.nodeLocks[hubID] | |||||
| if !ok { | if !ok { | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -33,6 +33,6 @@ func (b *ShardStoreLockReqBuilder) GC(stgID cdssdk.StorageID) *ShardStoreLockReq | |||||
| return b | return b | ||||
| } | } | ||||
| func (b *ShardStoreLockReqBuilder) makePath(nodeID cdssdk.StorageID) []string { | |||||
| return []string{lockprovider.IPFSLockPathPrefix, strconv.FormatInt(int64(nodeID), 10)} | |||||
| func (b *ShardStoreLockReqBuilder) makePath(hubID cdssdk.StorageID) []string { | |||||
| return []string{lockprovider.IPFSLockPathPrefix, strconv.FormatInt(int64(hubID), 10)} | |||||
| } | } | ||||
| @@ -33,11 +33,11 @@ func initProviders() []distlock.PathProvider { | |||||
| func initMetadataLockProviders() []distlock.PathProvider { | func initMetadataLockProviders() []distlock.PathProvider { | ||||
| return []distlock.PathProvider{ | return []distlock.PathProvider{ | ||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Node"), | |||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Hub"), | |||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Storage"), | distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Storage"), | ||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "User"), | distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "User"), | ||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "UserBucket"), | distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "UserBucket"), | ||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "UserNode"), | |||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "UserHub"), | |||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "UserStorage"), | distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "UserStorage"), | ||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Bucket"), | distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Bucket"), | ||||
| distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Object"), | distlock.NewPathProvider(lockprovider.NewMetadataLock(), lockprovider.MetadataLockPathPrefix, "Object"), | ||||
| @@ -4,7 +4,7 @@ type Config struct { | |||||
| // EC模式的Object的条带缓存数量 | // EC模式的Object的条带缓存数量 | ||||
| MaxStripCacheCount int `json:"maxStripCacheCount"` | MaxStripCacheCount int `json:"maxStripCacheCount"` | ||||
| // 当到下载节点的延迟高于这个值时,该节点在评估时会有更高的分数惩罚,单位:ms | // 当到下载节点的延迟高于这个值时,该节点在评估时会有更高的分数惩罚,单位:ms | ||||
| HighLatencyNodeMs float64 `json:"highLatencyNodeMs"` | |||||
| HighLatencyHubMs float64 `json:"highLatencyHubMs"` | |||||
| // EC模式下,每个Object的条带的预取数量,最少为1 | // EC模式下,每个Object的条带的预取数量,最少为1 | ||||
| ECStripPrefetchCount int `json:"ecStripPrefetchCount"` | ECStripPrefetchCount int `json:"ecStripPrefetchCount"` | ||||
| } | } | ||||
| @@ -210,13 +210,13 @@ func (iter *DownloadObjectIterator) downloadNoneOrRepObject(obj downloadReqeust2 | |||||
| } | } | ||||
| func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed *cdssdk.ECRedundancy) (io.ReadCloser, error) { | func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed *cdssdk.ECRedundancy) (io.ReadCloser, error) { | ||||
| allNodes, err := iter.sortDownloadStorages(req) | |||||
| allStorages, err := iter.sortDownloadStorages(req) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| bsc, blocks := iter.getMinReadingBlockSolution(allNodes, ecRed.K) | |||||
| osc, stg := iter.getMinReadingObjectSolution(allNodes, ecRed.K) | |||||
| bsc, blocks := iter.getMinReadingBlockSolution(allStorages, ecRed.K) | |||||
| osc, stg := iter.getMinReadingObjectSolution(allStorages, ecRed.K) | |||||
| if bsc < osc { | if bsc < osc { | ||||
| var logStrs []any = []any{fmt.Sprintf("downloading ec object %v from blocks: ", req.Raw.ObjectID)} | var logStrs []any = []any{fmt.Sprintf("downloading ec object %v from blocks: ", req.Raw.ObjectID)} | ||||
| @@ -291,37 +291,37 @@ func (iter *DownloadObjectIterator) sortDownloadStorages(req downloadReqeust2) ( | |||||
| } | } | ||||
| } | } | ||||
| downloadNodeMap := make(map[cdssdk.StorageID]*downloadStorageInfo) | |||||
| downloadStorageMap := make(map[cdssdk.StorageID]*downloadStorageInfo) | |||||
| for _, id := range req.Detail.PinnedAt { | for _, id := range req.Detail.PinnedAt { | ||||
| node, ok := downloadNodeMap[id] | |||||
| storage, ok := downloadStorageMap[id] | |||||
| if !ok { | if !ok { | ||||
| mod := iter.allStorages[id] | mod := iter.allStorages[id] | ||||
| node = &downloadStorageInfo{ | |||||
| storage = &downloadStorageInfo{ | |||||
| Storage: mod, | Storage: mod, | ||||
| ObjectPinned: true, | ObjectPinned: true, | ||||
| Distance: iter.getNodeDistance(mod), | |||||
| Distance: iter.getStorageDistance(mod), | |||||
| } | } | ||||
| downloadNodeMap[id] = node | |||||
| downloadStorageMap[id] = storage | |||||
| } | } | ||||
| node.ObjectPinned = true | |||||
| storage.ObjectPinned = true | |||||
| } | } | ||||
| for _, b := range req.Detail.Blocks { | for _, b := range req.Detail.Blocks { | ||||
| node, ok := downloadNodeMap[b.StorageID] | |||||
| storage, ok := downloadStorageMap[b.StorageID] | |||||
| if !ok { | if !ok { | ||||
| mod := iter.allStorages[b.StorageID] | mod := iter.allStorages[b.StorageID] | ||||
| node = &downloadStorageInfo{ | |||||
| storage = &downloadStorageInfo{ | |||||
| Storage: mod, | Storage: mod, | ||||
| Distance: iter.getNodeDistance(mod), | |||||
| Distance: iter.getStorageDistance(mod), | |||||
| } | } | ||||
| downloadNodeMap[b.StorageID] = node | |||||
| downloadStorageMap[b.StorageID] = storage | |||||
| } | } | ||||
| node.Blocks = append(node.Blocks, b) | |||||
| storage.Blocks = append(storage.Blocks, b) | |||||
| } | } | ||||
| return sort2.Sort(lo.Values(downloadNodeMap), func(left, right *downloadStorageInfo) int { | |||||
| return sort2.Sort(lo.Values(downloadStorageMap), func(left, right *downloadStorageInfo) int { | |||||
| return sort2.Cmp(left.Distance, right.Distance) | return sort2.Cmp(left.Distance, right.Distance) | ||||
| }), nil | }), nil | ||||
| } | } | ||||
| @@ -364,23 +364,23 @@ func (iter *DownloadObjectIterator) getMinReadingObjectSolution(sortedStgs []*do | |||||
| return dist, downloadStg | return dist, downloadStg | ||||
| } | } | ||||
| func (iter *DownloadObjectIterator) getNodeDistance(stg stgmod.StorageDetail) float64 { | |||||
| if stgglb.Local.NodeID != nil { | |||||
| if stg.MasterHub.NodeID == *stgglb.Local.NodeID { | |||||
| return consts.NodeDistanceSameNode | |||||
| func (iter *DownloadObjectIterator) getStorageDistance(stg stgmod.StorageDetail) float64 { | |||||
| if stgglb.Local.HubID != nil { | |||||
| if stg.MasterHub.HubID == *stgglb.Local.HubID { | |||||
| return consts.StorageDistanceSameStorage | |||||
| } | } | ||||
| } | } | ||||
| if stg.MasterHub.LocationID == stgglb.Local.LocationID { | if stg.MasterHub.LocationID == stgglb.Local.LocationID { | ||||
| return consts.NodeDistanceSameLocation | |||||
| return consts.StorageDistanceSameLocation | |||||
| } | } | ||||
| c := iter.downloader.conn.Get(stg.MasterHub.NodeID) | |||||
| if c == nil || c.Delay == nil || *c.Delay > time.Duration(float64(time.Millisecond)*iter.downloader.cfg.HighLatencyNodeMs) { | |||||
| return consts.NodeDistanceHighLatencyNode | |||||
| c := iter.downloader.conn.Get(stg.MasterHub.HubID) | |||||
| if c == nil || c.Delay == nil || *c.Delay > time.Duration(float64(time.Millisecond)*iter.downloader.cfg.HighLatencyHubMs) { | |||||
| return consts.HubDistanceHighLatencyHub | |||||
| } | } | ||||
| return consts.NodeDistanceOther | |||||
| return consts.StorageDistanceOther | |||||
| } | } | ||||
| func (iter *DownloadObjectIterator) downloadFromStorage(stg *stgmod.StorageDetail, req downloadReqeust2) (io.ReadCloser, error) { | func (iter *DownloadObjectIterator) downloadFromStorage(stg *stgmod.StorageDetail, req downloadReqeust2) (io.ReadCloser, error) { | ||||
| @@ -98,7 +98,7 @@ func (s *LRCStripIterator) downloading() { | |||||
| var froms []ioswitchlrc.From | var froms []ioswitchlrc.From | ||||
| for _, b := range s.blocks { | for _, b := range s.blocks { | ||||
| stg := b.Storage | stg := b.Storage | ||||
| froms = append(froms, ioswitchlrc.NewFromNode(b.Block.FileHash, *stg.MasterHub, stg.Storage, b.Block.Index)) | |||||
| froms = append(froms, ioswitchlrc.NewFromStorage(b.Block.FileHash, *stg.MasterHub, stg.Storage, b.Block.Index)) | |||||
| } | } | ||||
| toExec, hd := ioswitchlrc.NewToDriverWithRange(-1, exec.Range{ | toExec, hd := ioswitchlrc.NewToDriverWithRange(-1, exec.Range{ | ||||
| @@ -18,12 +18,12 @@ var _ = serder.UseTypeUnionExternallyTagged(types.Ref(types.NewTypeUnion[exec.Wo | |||||
| ))) | ))) | ||||
| type AgentWorker struct { | type AgentWorker struct { | ||||
| Node cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| Address cdssdk.GRPCAddressInfo | Address cdssdk.GRPCAddressInfo | ||||
| } | } | ||||
| func (w *AgentWorker) NewClient() (exec.WorkerClient, error) { | func (w *AgentWorker) NewClient() (exec.WorkerClient, error) { | ||||
| cli, err := stgglb.AgentRPCPool.Acquire(stgglb.SelectGRPCAddress(w.Node, w.Address)) | |||||
| cli, err := stgglb.AgentRPCPool.Acquire(stgglb.SelectGRPCAddress(w.Hub, w.Address)) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| @@ -32,7 +32,7 @@ func (w *AgentWorker) NewClient() (exec.WorkerClient, error) { | |||||
| } | } | ||||
| func (w *AgentWorker) String() string { | func (w *AgentWorker) String() string { | ||||
| return w.Node.String() | |||||
| return w.Hub.String() | |||||
| } | } | ||||
| func (w *AgentWorker) Equals(worker exec.WorkerInfo) bool { | func (w *AgentWorker) Equals(worker exec.WorkerInfo) bool { | ||||
| @@ -41,7 +41,7 @@ func (w *AgentWorker) Equals(worker exec.WorkerInfo) bool { | |||||
| return false | return false | ||||
| } | } | ||||
| return w.Node.NodeID == aw.Node.NodeID | |||||
| return w.Hub.HubID == aw.Hub.HubID | |||||
| } | } | ||||
| type AgentWorkerClient struct { | type AgentWorkerClient struct { | ||||
| @@ -59,12 +59,12 @@ func (f *FromDriver) GetDataIndex() int { | |||||
| type FromShardstore struct { | type FromShardstore struct { | ||||
| FileHash cdssdk.FileHash | FileHash cdssdk.FileHash | ||||
| Hub cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| Storage cdssdk.Storage | Storage cdssdk.Storage | ||||
| DataIndex int | DataIndex int | ||||
| } | } | ||||
| func NewFromShardstore(fileHash cdssdk.FileHash, hub cdssdk.Node, storage cdssdk.Storage, dataIndex int) *FromShardstore { | |||||
| func NewFromShardstore(fileHash cdssdk.FileHash, hub cdssdk.Hub, storage cdssdk.Storage, dataIndex int) *FromShardstore { | |||||
| return &FromShardstore{ | return &FromShardstore{ | ||||
| FileHash: fileHash, | FileHash: fileHash, | ||||
| Hub: hub, | Hub: hub, | ||||
| @@ -109,14 +109,14 @@ func (t *ToDriver) GetRange() exec.Range { | |||||
| } | } | ||||
| type ToShardStore struct { | type ToShardStore struct { | ||||
| Hub cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| Storage cdssdk.Storage | Storage cdssdk.Storage | ||||
| DataIndex int | DataIndex int | ||||
| Range exec.Range | Range exec.Range | ||||
| FileHashStoreKey string | FileHashStoreKey string | ||||
| } | } | ||||
| func NewToShardStore(hub cdssdk.Node, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string) *ToShardStore { | |||||
| func NewToShardStore(hub cdssdk.Hub, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string) *ToShardStore { | |||||
| return &ToShardStore{ | return &ToShardStore{ | ||||
| Hub: hub, | Hub: hub, | ||||
| Storage: stg, | Storage: stg, | ||||
| @@ -125,7 +125,7 @@ func NewToShardStore(hub cdssdk.Node, stg cdssdk.Storage, dataIndex int, fileHas | |||||
| } | } | ||||
| } | } | ||||
| func NewToShardStoreWithRange(hub cdssdk.Node, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string, rng exec.Range) *ToShardStore { | |||||
| func NewToShardStoreWithRange(hub cdssdk.Hub, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string, rng exec.Range) *ToShardStore { | |||||
| return &ToShardStore{ | return &ToShardStore{ | ||||
| Hub: hub, | Hub: hub, | ||||
| Storage: stg, | Storage: stg, | ||||
| @@ -11,11 +11,11 @@ import ( | |||||
| ) | ) | ||||
| type HttpHubWorker struct { | type HttpHubWorker struct { | ||||
| Node cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| } | } | ||||
| func (w *HttpHubWorker) NewClient() (exec.WorkerClient, error) { | func (w *HttpHubWorker) NewClient() (exec.WorkerClient, error) { | ||||
| addressInfo := w.Node.Address.(*cdssdk.HttpAddressInfo) | |||||
| addressInfo := w.Hub.Address.(*cdssdk.HttpAddressInfo) | |||||
| baseUrl := "http://" + addressInfo.ExternalIP + ":" + strconv.Itoa(addressInfo.Port) | baseUrl := "http://" + addressInfo.ExternalIP + ":" + strconv.Itoa(addressInfo.Port) | ||||
| config := cdsapi.Config{ | config := cdsapi.Config{ | ||||
| URL: baseUrl, | URL: baseUrl, | ||||
| @@ -31,7 +31,7 @@ func (w *HttpHubWorker) NewClient() (exec.WorkerClient, error) { | |||||
| } | } | ||||
| func (w *HttpHubWorker) String() string { | func (w *HttpHubWorker) String() string { | ||||
| return w.Node.String() | |||||
| return w.Hub.String() | |||||
| } | } | ||||
| func (w *HttpHubWorker) Equals(worker exec.WorkerInfo) bool { | func (w *HttpHubWorker) Equals(worker exec.WorkerInfo) bool { | ||||
| @@ -40,7 +40,7 @@ func (w *HttpHubWorker) Equals(worker exec.WorkerInfo) bool { | |||||
| return false | return false | ||||
| } | } | ||||
| return w.Node.NodeID == aw.Node.NodeID | |||||
| return w.Hub.HubID == aw.Hub.HubID | |||||
| } | } | ||||
| type HttpHubWorkerClient struct { | type HttpHubWorkerClient struct { | ||||
| @@ -245,11 +245,11 @@ func (p *DefaultParser) buildFromNode(ctx *ParseContext, f ioswitch2.From) (ops2 | |||||
| switch addr := f.Hub.Address.(type) { | switch addr := f.Hub.Address.(type) { | ||||
| case *cdssdk.HttpAddressInfo: | case *cdssdk.HttpAddressInfo: | ||||
| t.Env().ToEnvWorker(&ioswitch2.HttpHubWorker{Node: f.Hub}) | |||||
| t.Env().ToEnvWorker(&ioswitch2.HttpHubWorker{Hub: f.Hub}) | |||||
| t.Env().Pinned = true | t.Env().Pinned = true | ||||
| case *cdssdk.GRPCAddressInfo: | case *cdssdk.GRPCAddressInfo: | ||||
| t.Env().ToEnvWorker(&ioswitch2.AgentWorker{Node: f.Hub, Address: *addr}) | |||||
| t.Env().ToEnvWorker(&ioswitch2.AgentWorker{Hub: f.Hub, Address: *addr}) | |||||
| t.Env().Pinned = true | t.Env().Pinned = true | ||||
| default: | default: | ||||
| @@ -285,10 +285,10 @@ func (p *DefaultParser) buildToNode(ctx *ParseContext, t ioswitch2.To) (ops2.ToN | |||||
| switch addr := t.Hub.Address.(type) { | switch addr := t.Hub.Address.(type) { | ||||
| case *cdssdk.HttpAddressInfo: | case *cdssdk.HttpAddressInfo: | ||||
| n.Env().ToEnvWorker(&ioswitch2.HttpHubWorker{Node: t.Hub}) | |||||
| n.Env().ToEnvWorker(&ioswitch2.HttpHubWorker{Hub: t.Hub}) | |||||
| case *cdssdk.GRPCAddressInfo: | case *cdssdk.GRPCAddressInfo: | ||||
| n.Env().ToEnvWorker(&ioswitch2.AgentWorker{Node: t.Hub, Address: *addr}) | |||||
| n.Env().ToEnvWorker(&ioswitch2.AgentWorker{Hub: t.Hub, Address: *addr}) | |||||
| default: | default: | ||||
| return nil, fmt.Errorf("unsupported node address type %T", addr) | return nil, fmt.Errorf("unsupported node address type %T", addr) | ||||
| @@ -15,12 +15,12 @@ import ( | |||||
| // ))) | // ))) | ||||
| type AgentWorker struct { | type AgentWorker struct { | ||||
| Node cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| Address cdssdk.GRPCAddressInfo | Address cdssdk.GRPCAddressInfo | ||||
| } | } | ||||
| func (w *AgentWorker) NewClient() (exec.WorkerClient, error) { | func (w *AgentWorker) NewClient() (exec.WorkerClient, error) { | ||||
| cli, err := stgglb.AgentRPCPool.Acquire(stgglb.SelectGRPCAddress(w.Node, w.Address)) | |||||
| cli, err := stgglb.AgentRPCPool.Acquire(stgglb.SelectGRPCAddress(w.Hub, w.Address)) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| @@ -29,7 +29,7 @@ func (w *AgentWorker) NewClient() (exec.WorkerClient, error) { | |||||
| } | } | ||||
| func (w *AgentWorker) String() string { | func (w *AgentWorker) String() string { | ||||
| return w.Node.String() | |||||
| return w.Hub.String() | |||||
| } | } | ||||
| func (w *AgentWorker) Equals(worker exec.WorkerInfo) bool { | func (w *AgentWorker) Equals(worker exec.WorkerInfo) bool { | ||||
| @@ -38,7 +38,7 @@ func (w *AgentWorker) Equals(worker exec.WorkerInfo) bool { | |||||
| return false | return false | ||||
| } | } | ||||
| return w.Node.NodeID == aw.Node.NodeID | |||||
| return w.Hub.HubID == aw.Hub.HubID | |||||
| } | } | ||||
| type AgentWorkerClient struct { | type AgentWorkerClient struct { | ||||
| @@ -38,15 +38,15 @@ func (f *FromDriver) GetDataIndex() int { | |||||
| type FromNode struct { | type FromNode struct { | ||||
| FileHash cdssdk.FileHash | FileHash cdssdk.FileHash | ||||
| Node cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| Storage cdssdk.Storage | Storage cdssdk.Storage | ||||
| DataIndex int | DataIndex int | ||||
| } | } | ||||
| func NewFromNode(fileHash cdssdk.FileHash, node cdssdk.Node, storage cdssdk.Storage, dataIndex int) *FromNode { | |||||
| func NewFromStorage(fileHash cdssdk.FileHash, hub cdssdk.Hub, storage cdssdk.Storage, dataIndex int) *FromNode { | |||||
| return &FromNode{ | return &FromNode{ | ||||
| FileHash: fileHash, | FileHash: fileHash, | ||||
| Node: node, | |||||
| Hub: hub, | |||||
| DataIndex: dataIndex, | DataIndex: dataIndex, | ||||
| } | } | ||||
| } | } | ||||
| @@ -87,14 +87,14 @@ func (t *ToDriver) GetRange() exec.Range { | |||||
| } | } | ||||
| type ToNode struct { | type ToNode struct { | ||||
| Hub cdssdk.Node | |||||
| Hub cdssdk.Hub | |||||
| Storage cdssdk.Storage | Storage cdssdk.Storage | ||||
| DataIndex int | DataIndex int | ||||
| Range exec.Range | Range exec.Range | ||||
| FileHashStoreKey string | FileHashStoreKey string | ||||
| } | } | ||||
| func NewToStorage(hub cdssdk.Node, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string) *ToNode { | |||||
| func NewToStorage(hub cdssdk.Hub, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string) *ToNode { | |||||
| return &ToNode{ | return &ToNode{ | ||||
| Hub: hub, | Hub: hub, | ||||
| Storage: stg, | Storage: stg, | ||||
| @@ -103,7 +103,7 @@ func NewToStorage(hub cdssdk.Node, stg cdssdk.Storage, dataIndex int, fileHashSt | |||||
| } | } | ||||
| } | } | ||||
| func NewToStorageWithRange(hub cdssdk.Node, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string, rng exec.Range) *ToNode { | |||||
| func NewToStorageWithRange(hub cdssdk.Hub, stg cdssdk.Storage, dataIndex int, fileHashStoreKey string, rng exec.Range) *ToNode { | |||||
| return &ToNode{ | return &ToNode{ | ||||
| Hub: hub, | Hub: hub, | ||||
| Storage: stg, | Storage: stg, | ||||
| @@ -73,7 +73,7 @@ func buildFromNode(ctx *GenerateContext, f ioswitchlrc.From) (ops2.FromNode, err | |||||
| } | } | ||||
| // TODO2 支持HTTP协议 | // TODO2 支持HTTP协议 | ||||
| t.Env().ToEnvWorker(&ioswitchlrc.AgentWorker{Node: f.Node, Address: *f.Node.Address.(*cdssdk.GRPCAddressInfo)}) | |||||
| t.Env().ToEnvWorker(&ioswitchlrc.AgentWorker{Hub: f.Hub, Address: *f.Hub.Address.(*cdssdk.GRPCAddressInfo)}) | |||||
| t.Env().Pinned = true | t.Env().Pinned = true | ||||
| return t, nil | return t, nil | ||||
| @@ -107,7 +107,7 @@ func buildToNode(ctx *GenerateContext, t ioswitchlrc.To) (ops2.ToNode, error) { | |||||
| // n.Env().ToEnvWorker(&ioswitchlrc.HttpHubWorker{Node: t.Hub}) | // n.Env().ToEnvWorker(&ioswitchlrc.HttpHubWorker{Node: t.Hub}) | ||||
| // TODO2 支持HTTP协议 | // TODO2 支持HTTP协议 | ||||
| case *cdssdk.GRPCAddressInfo: | case *cdssdk.GRPCAddressInfo: | ||||
| n.Env().ToEnvWorker(&ioswitchlrc.AgentWorker{Node: t.Hub, Address: *addr}) | |||||
| n.Env().ToEnvWorker(&ioswitchlrc.AgentWorker{Hub: t.Hub, Address: *addr}) | |||||
| default: | default: | ||||
| return nil, fmt.Errorf("unsupported node address type %T", addr) | return nil, fmt.Errorf("unsupported node address type %T", addr) | ||||
| @@ -10,10 +10,10 @@ import ( | |||||
| type Client struct { | type Client struct { | ||||
| rabbitCli *mq.RabbitMQTransport | rabbitCli *mq.RabbitMQTransport | ||||
| id cdssdk.NodeID | |||||
| id cdssdk.HubID | |||||
| } | } | ||||
| func NewClient(id cdssdk.NodeID, cfg *stgmq.Config) (*Client, error) { | |||||
| func NewClient(id cdssdk.HubID, cfg *stgmq.Config) (*Client, error) { | |||||
| rabbitCli, err := mq.NewRabbitMQTransport(cfg.MakeConnectingURL(), stgmq.MakeAgentQueueName(int64(id)), "") | rabbitCli, err := mq.NewRabbitMQTransport(cfg.MakeConnectingURL(), stgmq.MakeAgentQueueName(int64(id)), "") | ||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| @@ -30,23 +30,23 @@ func (c *Client) Close() { | |||||
| } | } | ||||
| type Pool interface { | type Pool interface { | ||||
| Acquire(id cdssdk.NodeID) (*Client, error) | |||||
| Acquire(id cdssdk.HubID) (*Client, error) | |||||
| Release(cli *Client) | Release(cli *Client) | ||||
| } | } | ||||
| type pool struct { | type pool struct { | ||||
| mqcfg *stgmq.Config | mqcfg *stgmq.Config | ||||
| shareds map[cdssdk.NodeID]*Client | |||||
| shareds map[cdssdk.HubID]*Client | |||||
| lock sync.Mutex | lock sync.Mutex | ||||
| } | } | ||||
| func NewPool(mqcfg *stgmq.Config) Pool { | func NewPool(mqcfg *stgmq.Config) Pool { | ||||
| return &pool{ | return &pool{ | ||||
| mqcfg: mqcfg, | mqcfg: mqcfg, | ||||
| shareds: make(map[cdssdk.NodeID]*Client), | |||||
| shareds: make(map[cdssdk.HubID]*Client), | |||||
| } | } | ||||
| } | } | ||||
| func (p *pool) Acquire(id cdssdk.NodeID) (*Client, error) { | |||||
| func (p *pool) Acquire(id cdssdk.HubID) (*Client, error) { | |||||
| p.lock.Lock() | p.lock.Lock() | ||||
| defer p.lock.Unlock() | defer p.lock.Unlock() | ||||
| @@ -20,7 +20,7 @@ type Server struct { | |||||
| rabbitSvr mq.RabbitMQServer | rabbitSvr mq.RabbitMQServer | ||||
| } | } | ||||
| func NewServer(svc Service, id cdssdk.NodeID, cfg *mymq.Config) (*Server, error) { | |||||
| func NewServer(svc Service, id cdssdk.HubID, cfg *mymq.Config) (*Server, error) { | |||||
| srv := &Server{ | srv := &Server{ | ||||
| service: svc, | service: svc, | ||||
| } | } | ||||
| @@ -145,26 +145,26 @@ var _ = Register(Service.StartStorageCreatePackage) | |||||
| type StartStorageCreatePackage struct { | type StartStorageCreatePackage struct { | ||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| UserID cdssdk.UserID `json:"userID"` | |||||
| BucketID cdssdk.BucketID `json:"bucketID"` | |||||
| Name string `json:"name"` | |||||
| StorageID cdssdk.StorageID `json:"storageID"` | |||||
| Path string `json:"path"` | |||||
| NodeAffinity *cdssdk.NodeID `json:"nodeAffinity"` | |||||
| UserID cdssdk.UserID `json:"userID"` | |||||
| BucketID cdssdk.BucketID `json:"bucketID"` | |||||
| Name string `json:"name"` | |||||
| StorageID cdssdk.StorageID `json:"storageID"` | |||||
| Path string `json:"path"` | |||||
| StorageAffinity cdssdk.StorageID `json:"storageAffinity"` | |||||
| } | } | ||||
| type StartStorageCreatePackageResp struct { | type StartStorageCreatePackageResp struct { | ||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| TaskID string `json:"taskID"` | TaskID string `json:"taskID"` | ||||
| } | } | ||||
| func NewStartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, nodeAffinity *cdssdk.NodeID) *StartStorageCreatePackage { | |||||
| func NewStartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, stgAffinity cdssdk.StorageID) *StartStorageCreatePackage { | |||||
| return &StartStorageCreatePackage{ | return &StartStorageCreatePackage{ | ||||
| UserID: userID, | |||||
| BucketID: bucketID, | |||||
| Name: name, | |||||
| StorageID: storageID, | |||||
| Path: path, | |||||
| NodeAffinity: nodeAffinity, | |||||
| UserID: userID, | |||||
| BucketID: bucketID, | |||||
| Name: name, | |||||
| StorageID: storageID, | |||||
| Path: path, | |||||
| StorageAffinity: stgAffinity, | |||||
| } | } | ||||
| } | } | ||||
| func NewStartStorageCreatePackageResp(taskID string) *StartStorageCreatePackageResp { | func NewStartStorageCreatePackageResp(taskID string) *StartStorageCreatePackageResp { | ||||
| @@ -1,51 +1,4 @@ | |||||
| package coordinator | package coordinator | ||||
| import "gitlink.org.cn/cloudream/common/pkgs/mq" | |||||
| type AgentService interface { | type AgentService interface { | ||||
| TempCacheReport(msg *TempCacheReport) | |||||
| AgentStatusReport(msg *AgentStatusReport) | |||||
| } | |||||
| // 代理端发给协调端,告知临时缓存的数据 | |||||
| var _ = RegisterNoReply(Service.TempCacheReport) | |||||
| type TempCacheReport struct { | |||||
| mq.MessageBodyBase | |||||
| NodeID int64 `json:"nodeID"` | |||||
| Hashes []string `json:"hashes"` | |||||
| } | |||||
| func NewTempCacheReportBody(nodeID int64, hashes []string) *TempCacheReport { | |||||
| return &TempCacheReport{ | |||||
| NodeID: nodeID, | |||||
| Hashes: hashes, | |||||
| } | |||||
| } | |||||
| func (client *Client) TempCacheReport(msg *TempCacheReport) error { | |||||
| return mq.Send(AgentService.TempCacheReport, client.rabbitCli, msg) | |||||
| } | |||||
| // 代理端发给协调端,告知延迟、ipfs和资源目录的可达性 | |||||
| var _ = RegisterNoReply(Service.AgentStatusReport) | |||||
| type AgentStatusReport struct { | |||||
| mq.MessageBodyBase | |||||
| NodeID int64 `json:"nodeID"` | |||||
| NodeDelayIDs []int64 `json:"nodeDelayIDs"` | |||||
| NodeDelays []int `json:"nodeDelays"` | |||||
| LocalDirStatus string `json:"localDirStatus"` | |||||
| } | |||||
| func NewAgentStatusReportBody(nodeID int64, nodeDelayIDs []int64, nodeDelays []int, localDirStatus string) *AgentStatusReport { | |||||
| return &AgentStatusReport{ | |||||
| NodeID: nodeID, | |||||
| NodeDelayIDs: nodeDelayIDs, | |||||
| NodeDelays: nodeDelays, | |||||
| LocalDirStatus: localDirStatus, | |||||
| } | |||||
| } | |||||
| func (client *Client) AgentStatusReport(msg *AgentStatusReport) error { | |||||
| return mq.Send(AgentService.AgentStatusReport, client.rabbitCli, msg) | |||||
| } | } | ||||
| @@ -6,36 +6,36 @@ import ( | |||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | stgmod "gitlink.org.cn/cloudream/storage/common/models" | ||||
| ) | ) | ||||
| type NodeService interface { | |||||
| type HubService interface { | |||||
| GetHubConfig(msg *GetHubConfig) (*GetHubConfigResp, *mq.CodeMessage) | GetHubConfig(msg *GetHubConfig) (*GetHubConfigResp, *mq.CodeMessage) | ||||
| GetUserNodes(msg *GetUserNodes) (*GetUserNodesResp, *mq.CodeMessage) | |||||
| GetUserHubs(msg *GetUserHubs) (*GetUserHubsResp, *mq.CodeMessage) | |||||
| GetNodes(msg *GetNodes) (*GetNodesResp, *mq.CodeMessage) | |||||
| GetHubs(msg *GetHubs) (*GetHubsResp, *mq.CodeMessage) | |||||
| GetNodeConnectivities(msg *GetNodeConnectivities) (*GetNodeConnectivitiesResp, *mq.CodeMessage) | |||||
| GetHubConnectivities(msg *GetHubConnectivities) (*GetHubConnectivitiesResp, *mq.CodeMessage) | |||||
| UpdateNodeConnectivities(msg *UpdateNodeConnectivities) (*UpdateNodeConnectivitiesResp, *mq.CodeMessage) | |||||
| UpdateHubConnectivities(msg *UpdateHubConnectivities) (*UpdateHubConnectivitiesResp, *mq.CodeMessage) | |||||
| } | } | ||||
| var _ = Register(Service.GetHubConfig) | var _ = Register(Service.GetHubConfig) | ||||
| type GetHubConfig struct { | type GetHubConfig struct { | ||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| HubID cdssdk.NodeID `json:"hubID"` | |||||
| HubID cdssdk.HubID `json:"hubID"` | |||||
| } | } | ||||
| type GetHubConfigResp struct { | type GetHubConfigResp struct { | ||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| Hub cdssdk.Node `json:"hub"` | |||||
| Hub cdssdk.Hub `json:"hub"` | |||||
| Storages []stgmod.StorageDetail `json:"storages"` | Storages []stgmod.StorageDetail `json:"storages"` | ||||
| } | } | ||||
| func ReqGetHubConfig(hubID cdssdk.NodeID) *GetHubConfig { | |||||
| func ReqGetHubConfig(hubID cdssdk.HubID) *GetHubConfig { | |||||
| return &GetHubConfig{ | return &GetHubConfig{ | ||||
| HubID: hubID, | HubID: hubID, | ||||
| } | } | ||||
| } | } | ||||
| func RespGetHubConfig(hub cdssdk.Node, storages []stgmod.StorageDetail) *GetHubConfigResp { | |||||
| func RespGetHubConfig(hub cdssdk.Hub, storages []stgmod.StorageDetail) *GetHubConfigResp { | |||||
| return &GetHubConfigResp{ | return &GetHubConfigResp{ | ||||
| Hub: hub, | Hub: hub, | ||||
| Storages: storages, | Storages: storages, | ||||
| @@ -46,111 +46,111 @@ func (client *Client) GetHubConfig(msg *GetHubConfig) (*GetHubConfigResp, error) | |||||
| } | } | ||||
| // 查询用户可用的节点 | // 查询用户可用的节点 | ||||
| var _ = Register(Service.GetUserNodes) | |||||
| var _ = Register(Service.GetUserHubs) | |||||
| type GetUserNodes struct { | |||||
| type GetUserHubs struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| UserID cdssdk.UserID `json:"userID"` | UserID cdssdk.UserID `json:"userID"` | ||||
| } | } | ||||
| type GetUserNodesResp struct { | |||||
| type GetUserHubsResp struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| Nodes []cdssdk.Node `json:"nodes"` | |||||
| Hubs []cdssdk.Hub `json:"hubs"` | |||||
| } | } | ||||
| func NewGetUserNodes(userID cdssdk.UserID) *GetUserNodes { | |||||
| return &GetUserNodes{ | |||||
| func NewGetUserHubs(userID cdssdk.UserID) *GetUserHubs { | |||||
| return &GetUserHubs{ | |||||
| UserID: userID, | UserID: userID, | ||||
| } | } | ||||
| } | } | ||||
| func NewGetUserNodesResp(nodes []cdssdk.Node) *GetUserNodesResp { | |||||
| return &GetUserNodesResp{ | |||||
| Nodes: nodes, | |||||
| func NewGetUserHubsResp(hubs []cdssdk.Hub) *GetUserHubsResp { | |||||
| return &GetUserHubsResp{ | |||||
| Hubs: hubs, | |||||
| } | } | ||||
| } | } | ||||
| func (client *Client) GetUserNodes(msg *GetUserNodes) (*GetUserNodesResp, error) { | |||||
| return mq.Request(Service.GetUserNodes, client.rabbitCli, msg) | |||||
| func (client *Client) GetUserHubs(msg *GetUserHubs) (*GetUserHubsResp, error) { | |||||
| return mq.Request(Service.GetUserHubs, client.rabbitCli, msg) | |||||
| } | } | ||||
| // 获取指定节点的信息。如果NodeIDs为nil,则返回所有Node | |||||
| var _ = Register(Service.GetNodes) | |||||
| // 获取指定节点的信息。如果HubIDs为nil,则返回所有Hub | |||||
| var _ = Register(Service.GetHubs) | |||||
| type GetNodes struct { | |||||
| type GetHubs struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| NodeIDs []cdssdk.NodeID `json:"nodeIDs"` | |||||
| HubIDs []cdssdk.HubID `json:"hubIDs"` | |||||
| } | } | ||||
| type GetNodesResp struct { | |||||
| type GetHubsResp struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| Nodes []cdssdk.Node `json:"nodes"` | |||||
| Hubs []cdssdk.Hub `json:"hubs"` | |||||
| } | } | ||||
| func NewGetNodes(nodeIDs []cdssdk.NodeID) *GetNodes { | |||||
| return &GetNodes{ | |||||
| NodeIDs: nodeIDs, | |||||
| func NewGetHubs(hubIDs []cdssdk.HubID) *GetHubs { | |||||
| return &GetHubs{ | |||||
| HubIDs: hubIDs, | |||||
| } | } | ||||
| } | } | ||||
| func NewGetNodesResp(nodes []cdssdk.Node) *GetNodesResp { | |||||
| return &GetNodesResp{ | |||||
| Nodes: nodes, | |||||
| func NewGetHubsResp(hubs []cdssdk.Hub) *GetHubsResp { | |||||
| return &GetHubsResp{ | |||||
| Hubs: hubs, | |||||
| } | } | ||||
| } | } | ||||
| func (r *GetNodesResp) GetNode(id cdssdk.NodeID) *cdssdk.Node { | |||||
| for _, n := range r.Nodes { | |||||
| if n.NodeID == id { | |||||
| func (r *GetHubsResp) GetHub(id cdssdk.HubID) *cdssdk.Hub { | |||||
| for _, n := range r.Hubs { | |||||
| if n.HubID == id { | |||||
| return &n | return &n | ||||
| } | } | ||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| func (client *Client) GetNodes(msg *GetNodes) (*GetNodesResp, error) { | |||||
| return mq.Request(Service.GetNodes, client.rabbitCli, msg) | |||||
| func (client *Client) GetHubs(msg *GetHubs) (*GetHubsResp, error) { | |||||
| return mq.Request(Service.GetHubs, client.rabbitCli, msg) | |||||
| } | } | ||||
| // 获取节点连通性信息 | // 获取节点连通性信息 | ||||
| var _ = Register(Service.GetNodeConnectivities) | |||||
| var _ = Register(Service.GetHubConnectivities) | |||||
| type GetNodeConnectivities struct { | |||||
| type GetHubConnectivities struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| NodeIDs []cdssdk.NodeID `json:"nodeIDs"` | |||||
| HubIDs []cdssdk.HubID `json:"hubIDs"` | |||||
| } | } | ||||
| type GetNodeConnectivitiesResp struct { | |||||
| type GetHubConnectivitiesResp struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| Connectivities []cdssdk.NodeConnectivity `json:"nodes"` | |||||
| Connectivities []cdssdk.HubConnectivity `json:"hubs"` | |||||
| } | } | ||||
| func ReqGetNodeConnectivities(nodeIDs []cdssdk.NodeID) *GetNodeConnectivities { | |||||
| return &GetNodeConnectivities{ | |||||
| NodeIDs: nodeIDs, | |||||
| func ReqGetHubConnectivities(hubIDs []cdssdk.HubID) *GetHubConnectivities { | |||||
| return &GetHubConnectivities{ | |||||
| HubIDs: hubIDs, | |||||
| } | } | ||||
| } | } | ||||
| func RespGetNodeConnectivities(cons []cdssdk.NodeConnectivity) *GetNodeConnectivitiesResp { | |||||
| return &GetNodeConnectivitiesResp{ | |||||
| func RespGetHubConnectivities(cons []cdssdk.HubConnectivity) *GetHubConnectivitiesResp { | |||||
| return &GetHubConnectivitiesResp{ | |||||
| Connectivities: cons, | Connectivities: cons, | ||||
| } | } | ||||
| } | } | ||||
| func (client *Client) GetNodeConnectivities(msg *GetNodeConnectivities) (*GetNodeConnectivitiesResp, error) { | |||||
| return mq.Request(Service.GetNodeConnectivities, client.rabbitCli, msg) | |||||
| func (client *Client) GetHubConnectivities(msg *GetHubConnectivities) (*GetHubConnectivitiesResp, error) { | |||||
| return mq.Request(Service.GetHubConnectivities, client.rabbitCli, msg) | |||||
| } | } | ||||
| // 批量更新节点连通性信息 | // 批量更新节点连通性信息 | ||||
| var _ = Register(Service.UpdateNodeConnectivities) | |||||
| var _ = Register(Service.UpdateHubConnectivities) | |||||
| type UpdateNodeConnectivities struct { | |||||
| type UpdateHubConnectivities struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| Connectivities []cdssdk.NodeConnectivity `json:"connectivities"` | |||||
| Connectivities []cdssdk.HubConnectivity `json:"connectivities"` | |||||
| } | } | ||||
| type UpdateNodeConnectivitiesResp struct { | |||||
| type UpdateHubConnectivitiesResp struct { | |||||
| mq.MessageBodyBase | mq.MessageBodyBase | ||||
| } | } | ||||
| func ReqUpdateNodeConnectivities(cons []cdssdk.NodeConnectivity) *UpdateNodeConnectivities { | |||||
| return &UpdateNodeConnectivities{ | |||||
| func ReqUpdateHubConnectivities(cons []cdssdk.HubConnectivity) *UpdateHubConnectivities { | |||||
| return &UpdateHubConnectivities{ | |||||
| Connectivities: cons, | Connectivities: cons, | ||||
| } | } | ||||
| } | } | ||||
| func RespUpdateNodeConnectivities() *UpdateNodeConnectivitiesResp { | |||||
| return &UpdateNodeConnectivitiesResp{} | |||||
| func RespUpdateHubConnectivities() *UpdateHubConnectivitiesResp { | |||||
| return &UpdateHubConnectivitiesResp{} | |||||
| } | } | ||||
| func (client *Client) UpdateNodeConnectivities(msg *UpdateNodeConnectivities) (*UpdateNodeConnectivitiesResp, error) { | |||||
| return mq.Request(Service.UpdateNodeConnectivities, client.rabbitCli, msg) | |||||
| func (client *Client) UpdateHubConnectivities(msg *UpdateHubConnectivities) (*UpdateHubConnectivitiesResp, error) { | |||||
| return mq.Request(Service.UpdateHubConnectivities, client.rabbitCli, msg) | |||||
| } | } | ||||
| @@ -213,10 +213,10 @@ func ReqGetPackageCachedStorages(userID cdssdk.UserID, packageID cdssdk.PackageI | |||||
| } | } | ||||
| } | } | ||||
| func ReqGetPackageCachedStoragesResp(nodeInfos []cdssdk.StoragePackageCachingInfo, packageSize int64) *GetPackageCachedStoragesResp { | |||||
| func ReqGetPackageCachedStoragesResp(stgInfos []cdssdk.StoragePackageCachingInfo, packageSize int64) *GetPackageCachedStoragesResp { | |||||
| return &GetPackageCachedStoragesResp{ | return &GetPackageCachedStoragesResp{ | ||||
| PackageCachingInfo: cdssdk.PackageCachingInfo{ | PackageCachingInfo: cdssdk.PackageCachingInfo{ | ||||
| StorageInfos: nodeInfos, | |||||
| StorageInfos: stgInfos, | |||||
| PackageSize: packageSize, | PackageSize: packageSize, | ||||
| }, | }, | ||||
| } | } | ||||
| @@ -14,7 +14,7 @@ type Service interface { | |||||
| CacheService | CacheService | ||||
| NodeService | |||||
| HubService | |||||
| ObjectService | ObjectService | ||||
| @@ -4,12 +4,12 @@ import cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | |||||
| type AgentCheckState struct { | type AgentCheckState struct { | ||||
| EventBase | EventBase | ||||
| NodeID cdssdk.NodeID `json:"nodeID"` | |||||
| HubID cdssdk.HubID `json:"hubID"` | |||||
| } | } | ||||
| func NewAgentCheckState(nodeID cdssdk.NodeID) *AgentCheckState { | |||||
| func NewAgentCheckState(hubID cdssdk.HubID) *AgentCheckState { | |||||
| return &AgentCheckState{ | return &AgentCheckState{ | ||||
| NodeID: nodeID, | |||||
| HubID: hubID, | |||||
| } | } | ||||
| } | } | ||||
| @@ -4,7 +4,7 @@ import cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | |||||
| type CleanPinned struct { | type CleanPinned struct { | ||||
| EventBase | EventBase | ||||
| PackageID cdssdk.PackageID `json:"nodeID"` | |||||
| PackageID cdssdk.PackageID `json:"hubID"` | |||||
| } | } | ||||
| func NewCleanPinned(packageID cdssdk.PackageID) *CleanPinned { | func NewCleanPinned(packageID cdssdk.PackageID) *CleanPinned { | ||||
| @@ -44,8 +44,8 @@ func migrate(configPath string) { | |||||
| migrateOne(db, cdssdk.Bucket{}) | migrateOne(db, cdssdk.Bucket{}) | ||||
| migrateOne(db, model.Cache{}) | migrateOne(db, model.Cache{}) | ||||
| migrateOne(db, model.Location{}) | migrateOne(db, model.Location{}) | ||||
| migrateOne(db, model.NodeConnectivity{}) | |||||
| migrateOne(db, cdssdk.Node{}) | |||||
| migrateOne(db, model.HubConnectivity{}) | |||||
| migrateOne(db, cdssdk.Hub{}) | |||||
| migrateOne(db, stgmod.ObjectAccessStat{}) | migrateOne(db, stgmod.ObjectAccessStat{}) | ||||
| migrateOne(db, stgmod.ObjectBlock{}) | migrateOne(db, stgmod.ObjectBlock{}) | ||||
| migrateOne(db, cdssdk.Object{}) | migrateOne(db, cdssdk.Object{}) | ||||
| @@ -59,7 +59,7 @@ func migrate(configPath string) { | |||||
| migrateOne(db, model.UserStorage{}) | migrateOne(db, model.UserStorage{}) | ||||
| migrateOne(db, model.UserBucket{}) | migrateOne(db, model.UserBucket{}) | ||||
| migrateOne(db, model.User{}) | migrateOne(db, model.User{}) | ||||
| migrateOne(db, model.UserNode{}) | |||||
| migrateOne(db, model.UserHub{}) | |||||
| fmt.Println("migrate success") | fmt.Println("migrate success") | ||||
| } | } | ||||
| @@ -1,24 +1 @@ | |||||
| package mq | package mq | ||||
| import ( | |||||
| coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator" | |||||
| ) | |||||
| func (service *Service) TempCacheReport(msg *coormq.TempCacheReport) { | |||||
| //service.db.BatchInsertOrUpdateCache(msg.Hashes, msg.NodeID) | |||||
| } | |||||
| func (service *Service) AgentStatusReport(msg *coormq.AgentStatusReport) { | |||||
| //jh:根据command中的Ip,插入节点延迟表,和节点表的NodeStatus | |||||
| //根据command中的Ip,插入节点延迟表 | |||||
| // TODO | |||||
| /* | |||||
| ips := utils.GetAgentIps() | |||||
| Insert_NodeDelay(msg.Body.IP, ips, msg.Body.AgentDelay) | |||||
| //从配置表里读取节点地域NodeLocation | |||||
| //插入节点表的NodeStatus | |||||
| Insert_Node(msg.Body.IP, msg.Body.IP, msg.Body.IPFSStatus, msg.Body.LocalDirStatus) | |||||
| */ | |||||
| } | |||||
| @@ -31,7 +31,7 @@ func (svc *Service) CachePackageMoved(msg *coormq.CachePackageMoved) (*coormq.Ca | |||||
| return nil | return nil | ||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| logger.WithField("PackageID", msg.PackageID).WithField("NodeID", msg.StorageID).Warn(err.Error()) | |||||
| logger.WithField("PackageID", msg.PackageID).WithField("HubID", msg.StorageID).Warn(err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "create package pinned objects failed") | return nil, mq.Failed(errorcode.OperationFailed, "create package pinned objects failed") | ||||
| } | } | ||||
| @@ -52,13 +52,13 @@ func (svc *Service) CacheRemovePackage(msg *coormq.CacheRemovePackage) (*coormq. | |||||
| err = svc.db2.PinnedObject().DeleteInPackageAtStorage(tx, msg.PackageID, msg.StorageID) | err = svc.db2.PinnedObject().DeleteInPackageAtStorage(tx, msg.PackageID, msg.StorageID) | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("delete pinned objects in package at node: %w", err) | |||||
| return fmt.Errorf("delete pinned objects in package at storage: %w", err) | |||||
| } | } | ||||
| return nil | return nil | ||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| logger.WithField("PackageID", msg.PackageID).WithField("NodeID", msg.StorageID).Warn(err.Error()) | |||||
| logger.WithField("PackageID", msg.PackageID).WithField("HubID", msg.StorageID).Warn(err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "remove pinned package failed") | return nil, mq.Failed(errorcode.OperationFailed, "remove pinned package failed") | ||||
| } | } | ||||
| @@ -16,7 +16,7 @@ import ( | |||||
| func (svc *Service) GetHubConfig(msg *coormq.GetHubConfig) (*coormq.GetHubConfigResp, *mq.CodeMessage) { | func (svc *Service) GetHubConfig(msg *coormq.GetHubConfig) (*coormq.GetHubConfigResp, *mq.CodeMessage) { | ||||
| log := logger.WithField("HubID", msg.HubID) | log := logger.WithField("HubID", msg.HubID) | ||||
| hub, err := svc.db2.Node().GetByID(svc.db2.DefCtx(), msg.HubID) | |||||
| hub, err := svc.db2.Hub().GetByID(svc.db2.DefCtx(), msg.HubID) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("getting hub: %v", err) | log.Warnf("getting hub: %v", err) | ||||
| return nil, mq.Failed(errorcode.OperationFailed, fmt.Sprintf("getting hub: %v", err)) | return nil, mq.Failed(errorcode.OperationFailed, fmt.Sprintf("getting hub: %v", err)) | ||||
| @@ -67,78 +67,78 @@ func (svc *Service) GetHubConfig(msg *coormq.GetHubConfig) (*coormq.GetHubConfig | |||||
| return mq.ReplyOK(coormq.RespGetHubConfig(hub, details)) | return mq.ReplyOK(coormq.RespGetHubConfig(hub, details)) | ||||
| } | } | ||||
| func (svc *Service) GetUserNodes(msg *coormq.GetUserNodes) (*coormq.GetUserNodesResp, *mq.CodeMessage) { | |||||
| nodes, err := svc.db2.Node().GetUserNodes(svc.db2.DefCtx(), msg.UserID) | |||||
| func (svc *Service) GetUserHubs(msg *coormq.GetUserHubs) (*coormq.GetUserHubsResp, *mq.CodeMessage) { | |||||
| hubs, err := svc.db2.Hub().GetUserHubs(svc.db2.DefCtx(), msg.UserID) | |||||
| if err != nil { | if err != nil { | ||||
| logger.WithField("UserID", msg.UserID). | logger.WithField("UserID", msg.UserID). | ||||
| Warnf("query user nodes failed, err: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "query user nodes failed") | |||||
| Warnf("query user hubs failed, err: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "query user hubs failed") | |||||
| } | } | ||||
| return mq.ReplyOK(coormq.NewGetUserNodesResp(nodes)) | |||||
| return mq.ReplyOK(coormq.NewGetUserHubsResp(hubs)) | |||||
| } | } | ||||
| func (svc *Service) GetNodes(msg *coormq.GetNodes) (*coormq.GetNodesResp, *mq.CodeMessage) { | |||||
| var nodes []cdssdk.Node | |||||
| func (svc *Service) GetHubs(msg *coormq.GetHubs) (*coormq.GetHubsResp, *mq.CodeMessage) { | |||||
| var hubs []cdssdk.Hub | |||||
| if msg.NodeIDs == nil { | |||||
| if msg.HubIDs == nil { | |||||
| var err error | var err error | ||||
| nodes, err = svc.db2.Node().GetAllNodes(svc.db2.DefCtx()) | |||||
| hubs, err = svc.db2.Hub().GetAllHubs(svc.db2.DefCtx()) | |||||
| if err != nil { | if err != nil { | ||||
| logger.Warnf("getting all nodes: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "get all node failed") | |||||
| logger.Warnf("getting all hubs: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "get all hub failed") | |||||
| } | } | ||||
| } else { | } else { | ||||
| // 可以不用事务 | // 可以不用事务 | ||||
| for _, id := range msg.NodeIDs { | |||||
| node, err := svc.db2.Node().GetByID(svc.db2.DefCtx(), id) | |||||
| for _, id := range msg.HubIDs { | |||||
| hub, err := svc.db2.Hub().GetByID(svc.db2.DefCtx(), id) | |||||
| if err != nil { | if err != nil { | ||||
| logger.WithField("NodeID", id). | |||||
| Warnf("query node failed, err: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "query node failed") | |||||
| logger.WithField("HubID", id). | |||||
| Warnf("query hub failed, err: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "query hub failed") | |||||
| } | } | ||||
| nodes = append(nodes, node) | |||||
| hubs = append(hubs, hub) | |||||
| } | } | ||||
| } | } | ||||
| return mq.ReplyOK(coormq.NewGetNodesResp(nodes)) | |||||
| return mq.ReplyOK(coormq.NewGetHubsResp(hubs)) | |||||
| } | } | ||||
| func (svc *Service) GetNodeConnectivities(msg *coormq.GetNodeConnectivities) (*coormq.GetNodeConnectivitiesResp, *mq.CodeMessage) { | |||||
| cons, err := svc.db2.NodeConnectivity().BatchGetByFromNode(svc.db2.DefCtx(), msg.NodeIDs) | |||||
| func (svc *Service) GetHubConnectivities(msg *coormq.GetHubConnectivities) (*coormq.GetHubConnectivitiesResp, *mq.CodeMessage) { | |||||
| cons, err := svc.db2.HubConnectivity().BatchGetByFromHub(svc.db2.DefCtx(), msg.HubIDs) | |||||
| if err != nil { | if err != nil { | ||||
| logger.Warnf("batch get node connectivities by from node: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "batch get node connectivities by from node failed") | |||||
| logger.Warnf("batch get hub connectivities by from hub: %s", err.Error()) | |||||
| return nil, mq.Failed(errorcode.OperationFailed, "batch get hub connectivities by from hub failed") | |||||
| } | } | ||||
| return mq.ReplyOK(coormq.RespGetNodeConnectivities(cons)) | |||||
| return mq.ReplyOK(coormq.RespGetHubConnectivities(cons)) | |||||
| } | } | ||||
| func (svc *Service) UpdateNodeConnectivities(msg *coormq.UpdateNodeConnectivities) (*coormq.UpdateNodeConnectivitiesResp, *mq.CodeMessage) { | |||||
| func (svc *Service) UpdateHubConnectivities(msg *coormq.UpdateHubConnectivities) (*coormq.UpdateHubConnectivitiesResp, *mq.CodeMessage) { | |||||
| err := svc.db2.DoTx(func(tx db2.SQLContext) error { | err := svc.db2.DoTx(func(tx db2.SQLContext) error { | ||||
| // 只有发起节点和目的节点都存在,才能插入这条记录到数据库 | // 只有发起节点和目的节点都存在,才能插入这条记录到数据库 | ||||
| allNodes, err := svc.db2.Node().GetAllNodes(tx) | |||||
| allHubs, err := svc.db2.Hub().GetAllHubs(tx) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("getting all nodes: %w", err) | |||||
| return fmt.Errorf("getting all hubs: %w", err) | |||||
| } | } | ||||
| allNodeID := make(map[cdssdk.NodeID]bool) | |||||
| for _, node := range allNodes { | |||||
| allNodeID[node.NodeID] = true | |||||
| allHubID := make(map[cdssdk.HubID]bool) | |||||
| for _, hub := range allHubs { | |||||
| allHubID[hub.HubID] = true | |||||
| } | } | ||||
| var avaiCons []cdssdk.NodeConnectivity | |||||
| var avaiCons []cdssdk.HubConnectivity | |||||
| for _, con := range msg.Connectivities { | for _, con := range msg.Connectivities { | ||||
| if allNodeID[con.FromNodeID] && allNodeID[con.ToNodeID] { | |||||
| if allHubID[con.FromHubID] && allHubID[con.ToHubID] { | |||||
| avaiCons = append(avaiCons, con) | avaiCons = append(avaiCons, con) | ||||
| } | } | ||||
| } | } | ||||
| err = svc.db2.NodeConnectivity().BatchUpdateOrCreate(tx, avaiCons) | |||||
| err = svc.db2.HubConnectivity().BatchUpdateOrCreate(tx, avaiCons) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("batch update or create node connectivities: %s", err) | |||||
| return fmt.Errorf("batch update or create hub connectivities: %s", err) | |||||
| } | } | ||||
| return nil | return nil | ||||
| @@ -148,5 +148,5 @@ func (svc *Service) UpdateNodeConnectivities(msg *coormq.UpdateNodeConnectivitie | |||||
| return nil, mq.Failed(errorcode.OperationFailed, err.Error()) | return nil, mq.Failed(errorcode.OperationFailed, err.Error()) | ||||
| } | } | ||||
| return mq.ReplyOK(coormq.RespUpdateNodeConnectivities()) | |||||
| return mq.ReplyOK(coormq.RespUpdateHubConnectivities()) | |||||
| } | } | ||||
| @@ -191,15 +191,15 @@ func (svc *Service) GetPackageCachedStorages(msg *coormq.GetPackageCachedStorage | |||||
| } | } | ||||
| } | } | ||||
| var nodeInfos []cdssdk.StoragePackageCachingInfo | |||||
| for _, nodeInfo := range stgInfoMap { | |||||
| nodeInfos = append(nodeInfos, *nodeInfo) | |||||
| var stgInfos []cdssdk.StoragePackageCachingInfo | |||||
| for _, stgInfo := range stgInfoMap { | |||||
| stgInfos = append(stgInfos, *stgInfo) | |||||
| } | } | ||||
| sort.Slice(nodeInfos, func(i, j int) bool { | |||||
| return nodeInfos[i].StorageID < nodeInfos[j].StorageID | |||||
| sort.Slice(stgInfos, func(i, j int) bool { | |||||
| return stgInfos[i].StorageID < stgInfos[j].StorageID | |||||
| }) | }) | ||||
| return mq.ReplyOK(coormq.ReqGetPackageCachedStoragesResp(nodeInfos, packageSize)) | |||||
| return mq.ReplyOK(coormq.ReqGetPackageCachedStoragesResp(stgInfos, packageSize)) | |||||
| } | } | ||||
| func (svc *Service) GetPackageLoadedStorages(msg *coormq.GetPackageLoadedStorages) (*coormq.GetPackageLoadedStoragesResp, *mq.CodeMessage) { | func (svc *Service) GetPackageLoadedStorages(msg *coormq.GetPackageLoadedStorages) (*coormq.GetPackageLoadedStoragesResp, *mq.CodeMessage) { | ||||
| @@ -1,7 +1,7 @@ | |||||
| { | { | ||||
| "id": 1, | "id": 1, | ||||
| "local": { | "local": { | ||||
| "nodeID": 1, | |||||
| "hubID": 1, | |||||
| "localIP": "127.0.0.1", | "localIP": "127.0.0.1", | ||||
| "externalIP": "127.0.0.1", | "externalIP": "127.0.0.1", | ||||
| "locationID": 1 | "locationID": 1 | ||||
| @@ -1,17 +0,0 @@ | |||||
| 2024-04-10 12:34:16 [INFO] start serving command server | |||||
| 2024-04-10 13:04:14 [WARN] coordinator server err: deserialize error: channel is closed | |||||
| 2024-04-10 13:04:14 [ERRO] command server stopped with error: receive message error: channel is closed | |||||
| 2024-04-10 13:04:14 [INFO] command server stopped | |||||
| 2024-04-10 14:41:25 [INFO] start serving command server | |||||
| 2024-04-10 16:59:00 [WARN] coordinator server err: deserialize error: channel is closed | |||||
| 2024-04-10 16:59:00 [ERRO] command server stopped with error: receive message error: channel is closed | |||||
| 2024-04-10 16:59:00 [INFO] command server stopped | |||||
| 2024-04-10 17:06:56 [INFO] start serving command server | |||||
| 2024-04-10 17:07:36 [INFO] start serving command server | |||||
| 2024-04-10 20:05:49 [WARN] coordinator server err: deserialize error: channel is closed | |||||
| 2024-04-10 20:05:49 [ERRO] command server stopped with error: receive message error: channel is closed | |||||
| 2024-04-10 20:05:49 [INFO] command server stopped | |||||
| 2024-04-11 09:22:23 [INFO] start serving command server | |||||
| 2024-04-11 12:19:52 [WARN] coordinator server err: deserialize error: channel is closed | |||||
| 2024-04-11 12:19:52 [ERRO] command server stopped with error: receive message error: channel is closed | |||||
| 2024-04-11 12:19:52 [INFO] command server stopped | |||||
| @@ -11,7 +11,7 @@ import ( | |||||
| type Config struct { | type Config struct { | ||||
| AccessStatHistoryAmount float64 `json:"accessStatHistoryAmount"` | AccessStatHistoryAmount float64 `json:"accessStatHistoryAmount"` | ||||
| ECFileSizeThreshold int64 `json:"ecFileSizeThreshold"` | ECFileSizeThreshold int64 `json:"ecFileSizeThreshold"` | ||||
| NodeUnavailableSeconds int `json:"nodeUnavailableSeconds"` // 如果节点上次上报时间超过这个值,则认为节点已经不可用 | |||||
| HubUnavailableSeconds int `json:"hubUnavailableSeconds"` // 如果节点上次上报时间超过这个值,则认为节点已经不可用 | |||||
| Logger log.Config `json:"logger"` | Logger log.Config `json:"logger"` | ||||
| DB db.Config `json:"db"` | DB db.Config `json:"db"` | ||||
| RabbitMQ stgmq.Config `json:"rabbitMQ"` | RabbitMQ stgmq.Config `json:"rabbitMQ"` | ||||
| @@ -67,21 +67,21 @@ func (t *AgentCacheGC) Execute(execCtx ExecuteContext) { | |||||
| // 收集需要进行垃圾回收的文件哈希值 | // 收集需要进行垃圾回收的文件哈希值 | ||||
| var allFileHashes []cdssdk.FileHash | var allFileHashes []cdssdk.FileHash | ||||
| var masterHub cdssdk.Node | |||||
| var masterHub cdssdk.Hub | |||||
| err = execCtx.Args.DB.DoTx(func(tx db2.SQLContext) error { | err = execCtx.Args.DB.DoTx(func(tx db2.SQLContext) error { | ||||
| stg, err := execCtx.Args.DB.Storage().GetByID(tx, t.StorageID) | stg, err := execCtx.Args.DB.Storage().GetByID(tx, t.StorageID) | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("getting storage by id: %w", err) | return fmt.Errorf("getting storage by id: %w", err) | ||||
| } | } | ||||
| masterHub, err = execCtx.Args.DB.Node().GetByID(tx, stg.MasterHub) | |||||
| masterHub, err = execCtx.Args.DB.Hub().GetByID(tx, stg.MasterHub) | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("getting master hub by id: %w", err) | return fmt.Errorf("getting master hub by id: %w", err) | ||||
| } | } | ||||
| blocks, err := execCtx.Args.DB.ObjectBlock().GetByStorageID(tx, t.StorageID) | blocks, err := execCtx.Args.DB.ObjectBlock().GetByStorageID(tx, t.StorageID) | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("getting object blocks by node id: %w", err) | |||||
| return fmt.Errorf("getting object blocks by hub id: %w", err) | |||||
| } | } | ||||
| for _, c := range blocks { | for _, c := range blocks { | ||||
| allFileHashes = append(allFileHashes, c.FileHash) | allFileHashes = append(allFileHashes, c.FileHash) | ||||
| @@ -89,7 +89,7 @@ func (t *AgentCacheGC) Execute(execCtx ExecuteContext) { | |||||
| objs, err := execCtx.Args.DB.PinnedObject().GetObjectsByStorageID(tx, t.StorageID) | objs, err := execCtx.Args.DB.PinnedObject().GetObjectsByStorageID(tx, t.StorageID) | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("getting pinned objects by node id: %w", err) | |||||
| return fmt.Errorf("getting pinned objects by hub id: %w", err) | |||||
| } | } | ||||
| for _, o := range objs { | for _, o := range objs { | ||||
| allFileHashes = append(allFileHashes, o.FileHash) | allFileHashes = append(allFileHashes, o.FileHash) | ||||
| @@ -98,14 +98,14 @@ func (t *AgentCacheGC) Execute(execCtx ExecuteContext) { | |||||
| return nil | return nil | ||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.StorageID).Warn(err.Error()) | |||||
| log.WithField("HubID", t.StorageID).Warn(err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| // 获取与节点通信的代理客户端 | // 获取与节点通信的代理客户端 | ||||
| agtCli, err := stgglb.AgentMQPool.Acquire(masterHub.NodeID) | |||||
| agtCli, err := stgglb.AgentMQPool.Acquire(masterHub.HubID) | |||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.StorageID).Warnf("create agent client failed, err: %s", err.Error()) | |||||
| log.WithField("HubID", t.StorageID).Warnf("create agent client failed, err: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| defer stgglb.AgentMQPool.Release(agtCli) | defer stgglb.AgentMQPool.Release(agtCli) | ||||
| @@ -113,7 +113,7 @@ func (t *AgentCacheGC) Execute(execCtx ExecuteContext) { | |||||
| // 向代理发送垃圾回收请求 | // 向代理发送垃圾回收请求 | ||||
| _, err = agtCli.CacheGC(agtmq.ReqCacheGC(t.StorageID, allFileHashes), mq.RequestOption{Timeout: time.Minute}) | _, err = agtCli.CacheGC(agtmq.ReqCacheGC(t.StorageID, allFileHashes), mq.RequestOption{Timeout: time.Minute}) | ||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.StorageID).Warnf("ipfs gc: %s", err.Error()) | |||||
| log.WithField("HubID", t.StorageID).Warnf("ipfs gc: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| } | } | ||||
| @@ -29,7 +29,7 @@ func (t *AgentCheckState) TryMerge(other Event) bool { | |||||
| return false | return false | ||||
| } | } | ||||
| return t.NodeID == event.NodeID | |||||
| return t.HubID == event.HubID | |||||
| } | } | ||||
| func (t *AgentCheckState) Execute(execCtx ExecuteContext) { | func (t *AgentCheckState) Execute(execCtx ExecuteContext) { | ||||
| @@ -37,42 +37,42 @@ func (t *AgentCheckState) Execute(execCtx ExecuteContext) { | |||||
| log.Debugf("begin with %v", logger.FormatStruct(t.AgentCheckState)) | log.Debugf("begin with %v", logger.FormatStruct(t.AgentCheckState)) | ||||
| defer log.Debugf("end") | defer log.Debugf("end") | ||||
| node, err := execCtx.Args.DB.Node().GetByID(execCtx.Args.DB.DefCtx(), t.NodeID) | |||||
| hub, err := execCtx.Args.DB.Hub().GetByID(execCtx.Args.DB.DefCtx(), t.HubID) | |||||
| if err == sql.ErrNoRows { | if err == sql.ErrNoRows { | ||||
| return | return | ||||
| } | } | ||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.NodeID).Warnf("get node by id failed, err: %s", err.Error()) | |||||
| log.WithField("HubID", t.HubID).Warnf("get hub by id failed, err: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| agtCli, err := stgglb.AgentMQPool.Acquire(t.NodeID) | |||||
| agtCli, err := stgglb.AgentMQPool.Acquire(t.HubID) | |||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.NodeID).Warnf("create agent client failed, err: %s", err.Error()) | |||||
| log.WithField("HubID", t.HubID).Warnf("create agent client failed, err: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| defer stgglb.AgentMQPool.Release(agtCli) | defer stgglb.AgentMQPool.Release(agtCli) | ||||
| _, err = agtCli.GetState(agtmq.NewGetState(), mq.RequestOption{Timeout: time.Second * 30}) | _, err = agtCli.GetState(agtmq.NewGetState(), mq.RequestOption{Timeout: time.Second * 30}) | ||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.NodeID).Warnf("getting state: %s", err.Error()) | |||||
| log.WithField("HubID", t.HubID).Warnf("getting state: %s", err.Error()) | |||||
| // 检查上次上报时间,超时的设置为不可用 | // 检查上次上报时间,超时的设置为不可用 | ||||
| // TODO 没有上报过是否要特殊处理? | // TODO 没有上报过是否要特殊处理? | ||||
| if node.LastReportTime != nil && time.Since(*node.LastReportTime) > time.Duration(config.Cfg().NodeUnavailableSeconds)*time.Second { | |||||
| err := execCtx.Args.DB.Node().UpdateState(execCtx.Args.DB.DefCtx(), t.NodeID, consts.NodeStateUnavailable) | |||||
| if hub.LastReportTime != nil && time.Since(*hub.LastReportTime) > time.Duration(config.Cfg().HubUnavailableSeconds)*time.Second { | |||||
| err := execCtx.Args.DB.Hub().UpdateState(execCtx.Args.DB.DefCtx(), t.HubID, consts.HubStateUnavailable) | |||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.NodeID).Warnf("set node state failed, err: %s", err.Error()) | |||||
| log.WithField("HubID", t.HubID).Warnf("set hub state failed, err: %s", err.Error()) | |||||
| } | } | ||||
| } | } | ||||
| return | return | ||||
| } | } | ||||
| // TODO 如果以后还有其他的状态,要判断哪些状态下能设置Normal | // TODO 如果以后还有其他的状态,要判断哪些状态下能设置Normal | ||||
| err = execCtx.Args.DB.Node().UpdateState(execCtx.Args.DB.DefCtx(), t.NodeID, consts.NodeStateNormal) | |||||
| err = execCtx.Args.DB.Hub().UpdateState(execCtx.Args.DB.DefCtx(), t.HubID, consts.HubStateNormal) | |||||
| if err != nil { | if err != nil { | ||||
| log.WithField("NodeID", t.NodeID).Warnf("change node state failed, err: %s", err.Error()) | |||||
| log.WithField("HubID", t.HubID).Warnf("change hub state failed, err: %s", err.Error()) | |||||
| } | } | ||||
| } | } | ||||
| @@ -53,15 +53,15 @@ func (t *AgentCheckStorage) Execute(execCtx ExecuteContext) { | |||||
| return | return | ||||
| } | } | ||||
| node, err := execCtx.Args.DB.Node().GetByID(execCtx.Args.DB.DefCtx(), stg.MasterHub) | |||||
| hub, err := execCtx.Args.DB.Hub().GetByID(execCtx.Args.DB.DefCtx(), stg.MasterHub) | |||||
| if err != nil { | if err != nil { | ||||
| if err != sql.ErrNoRows { | if err != sql.ErrNoRows { | ||||
| log.WithField("StorageID", t.StorageID).Warnf("get storage node failed, err: %s", err.Error()) | |||||
| log.WithField("StorageID", t.StorageID).Warnf("get storage hub failed, err: %s", err.Error()) | |||||
| } | } | ||||
| return | return | ||||
| } | } | ||||
| if node.State != consts.NodeStateNormal { | |||||
| if hub.State != consts.HubStateNormal { | |||||
| return | return | ||||
| } | } | ||||
| @@ -80,12 +80,12 @@ func (t *CheckPackageRedundancy) Execute(execCtx ExecuteContext) { | |||||
| // TODO UserID | // TODO UserID | ||||
| getStgs, err := coorCli.GetUserStorageDetails(coormq.ReqGetUserStorageDetails(1)) | getStgs, err := coorCli.GetUserStorageDetails(coormq.ReqGetUserStorageDetails(1)) | ||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("getting all nodes: %s", err.Error()) | |||||
| log.Warnf("getting all storages: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| if len(getStgs.Storages) == 0 { | if len(getStgs.Storages) == 0 { | ||||
| log.Warnf("no available nodes") | |||||
| log.Warnf("no available storages") | |||||
| return | return | ||||
| } | } | ||||
| @@ -111,18 +111,18 @@ func (t *CheckPackageRedundancy) Execute(execCtx ExecuteContext) { | |||||
| // TODO 目前rep的备份数量固定为2,所以这里直接选出两个节点 | // TODO 目前rep的备份数量固定为2,所以这里直接选出两个节点 | ||||
| // TODO 放到chooseRedundancy函数中 | // TODO 放到chooseRedundancy函数中 | ||||
| mostBlockStgIDs := t.summaryRepObjectBlockNodes(getObjs.Objects, 2) | |||||
| newRepStgs := t.chooseNewNodesForRep(&defRep, userAllStorages) | |||||
| rechoosedRepStgs := t.rechooseNodesForRep(mostBlockStgIDs, &defRep, userAllStorages) | |||||
| newECStgs := t.chooseNewNodesForEC(&defEC, userAllStorages) | |||||
| mostBlockStgIDs := t.summaryRepObjectBlockStorages(getObjs.Objects, 2) | |||||
| newRepStgs := t.chooseNewStoragesForRep(&defRep, userAllStorages) | |||||
| rechoosedRepStgs := t.rechooseStoragesForRep(mostBlockStgIDs, &defRep, userAllStorages) | |||||
| newECStgs := t.chooseNewStoragesForEC(&defEC, userAllStorages) | |||||
| // 加锁 | // 加锁 | ||||
| builder := reqbuilder.NewBuilder() | builder := reqbuilder.NewBuilder() | ||||
| for _, node := range newRepStgs { | |||||
| builder.Shard().Buzy(node.Storage.Storage.StorageID) | |||||
| for _, storage := range newRepStgs { | |||||
| builder.Shard().Buzy(storage.Storage.Storage.StorageID) | |||||
| } | } | ||||
| for _, node := range newECStgs { | |||||
| builder.Shard().Buzy(node.Storage.Storage.StorageID) | |||||
| for _, storage := range newECStgs { | |||||
| builder.Shard().Buzy(storage.Storage.Storage.StorageID) | |||||
| } | } | ||||
| mutex, err := builder.MutexLock(execCtx.Args.DistLock) | mutex, err := builder.MutexLock(execCtx.Args.DistLock) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -135,7 +135,7 @@ func (t *CheckPackageRedundancy) Execute(execCtx ExecuteContext) { | |||||
| var updating *coormq.UpdatingObjectRedundancy | var updating *coormq.UpdatingObjectRedundancy | ||||
| var err error | var err error | ||||
| newRed, selectedNodes := t.chooseRedundancy(obj, userAllStorages) | |||||
| newRed, selectedStorages := t.chooseRedundancy(obj, userAllStorages) | |||||
| switch srcRed := obj.Object.Redundancy.(type) { | switch srcRed := obj.Object.Redundancy.(type) { | ||||
| case *cdssdk.NoneRedundancy: | case *cdssdk.NoneRedundancy: | ||||
| @@ -150,7 +150,7 @@ func (t *CheckPackageRedundancy) Execute(execCtx ExecuteContext) { | |||||
| case *cdssdk.LRCRedundancy: | case *cdssdk.LRCRedundancy: | ||||
| log.WithField("ObjectID", obj.Object.ObjectID).Debugf("redundancy: none -> lrc") | log.WithField("ObjectID", obj.Object.ObjectID).Debugf("redundancy: none -> lrc") | ||||
| updating, err = t.noneToLRC(execCtx, obj, newRed, selectedNodes) | |||||
| updating, err = t.noneToLRC(execCtx, obj, newRed, selectedStorages) | |||||
| } | } | ||||
| case *cdssdk.RepRedundancy: | case *cdssdk.RepRedundancy: | ||||
| @@ -170,15 +170,15 @@ func (t *CheckPackageRedundancy) Execute(execCtx ExecuteContext) { | |||||
| updating, err = t.ecToRep(execCtx, obj, srcRed, newRed, newRepStgs) | updating, err = t.ecToRep(execCtx, obj, srcRed, newRed, newRepStgs) | ||||
| case *cdssdk.ECRedundancy: | case *cdssdk.ECRedundancy: | ||||
| uploadNodes := t.rechooseNodesForEC(obj, srcRed, userAllStorages) | |||||
| updating, err = t.ecToEC(execCtx, obj, srcRed, newRed, uploadNodes) | |||||
| uploadStorages := t.rechooseStoragesForEC(obj, srcRed, userAllStorages) | |||||
| updating, err = t.ecToEC(execCtx, obj, srcRed, newRed, uploadStorages) | |||||
| } | } | ||||
| case *cdssdk.LRCRedundancy: | case *cdssdk.LRCRedundancy: | ||||
| switch newRed := newRed.(type) { | switch newRed := newRed.(type) { | ||||
| case *cdssdk.LRCRedundancy: | case *cdssdk.LRCRedundancy: | ||||
| uploadNodes := t.rechooseNodesForLRC(obj, srcRed, userAllStorages) | |||||
| updating, err = t.lrcToLRC(execCtx, obj, srcRed, newRed, uploadNodes) | |||||
| uploadStorages := t.rechooseStoragesForLRC(obj, srcRed, userAllStorages) | |||||
| updating, err = t.lrcToLRC(execCtx, obj, srcRed, newRed, uploadStorages) | |||||
| } | } | ||||
| } | } | ||||
| @@ -205,22 +205,22 @@ func (t *CheckPackageRedundancy) Execute(execCtx ExecuteContext) { | |||||
| func (t *CheckPackageRedundancy) chooseRedundancy(obj stgmod.ObjectDetail, userAllStgs map[cdssdk.StorageID]*StorageLoadInfo) (cdssdk.Redundancy, []*StorageLoadInfo) { | func (t *CheckPackageRedundancy) chooseRedundancy(obj stgmod.ObjectDetail, userAllStgs map[cdssdk.StorageID]*StorageLoadInfo) (cdssdk.Redundancy, []*StorageLoadInfo) { | ||||
| switch obj.Object.Redundancy.(type) { | switch obj.Object.Redundancy.(type) { | ||||
| case *cdssdk.NoneRedundancy: | case *cdssdk.NoneRedundancy: | ||||
| newStgs := t.chooseNewNodesForEC(&cdssdk.DefaultECRedundancy, userAllStgs) | |||||
| newStgs := t.chooseNewStoragesForEC(&cdssdk.DefaultECRedundancy, userAllStgs) | |||||
| return &cdssdk.DefaultECRedundancy, newStgs | return &cdssdk.DefaultECRedundancy, newStgs | ||||
| // newLRCNodes := t.chooseNewNodesForLRC(&cdssdk.DefaultLRCRedundancy, userAllNodes) | |||||
| // return &cdssdk.DefaultLRCRedundancy, newLRCNodes | |||||
| // newLRCStorages := t.chooseNewStoragesForLRC(&cdssdk.DefaultLRCRedundancy, userAllStorages) | |||||
| // return &cdssdk.DefaultLRCRedundancy, newLRCStorages | |||||
| case *cdssdk.LRCRedundancy: | case *cdssdk.LRCRedundancy: | ||||
| newLRCStgs := t.rechooseNodesForLRC(obj, &cdssdk.DefaultLRCRedundancy, userAllStgs) | |||||
| newLRCStgs := t.rechooseStoragesForLRC(obj, &cdssdk.DefaultLRCRedundancy, userAllStgs) | |||||
| return &cdssdk.DefaultLRCRedundancy, newLRCStgs | return &cdssdk.DefaultLRCRedundancy, newLRCStgs | ||||
| } | } | ||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| // 统计每个对象块所在的节点,选出块最多的不超过nodeCnt个节点 | |||||
| func (t *CheckPackageRedundancy) summaryRepObjectBlockNodes(objs []stgmod.ObjectDetail, nodeCnt int) []cdssdk.StorageID { | |||||
| // 统计每个对象块所在的节点,选出块最多的不超过storageCnt个节点 | |||||
| func (t *CheckPackageRedundancy) summaryRepObjectBlockStorages(objs []stgmod.ObjectDetail, storageCnt int) []cdssdk.StorageID { | |||||
| type stgBlocks struct { | type stgBlocks struct { | ||||
| StorageID cdssdk.StorageID | StorageID cdssdk.StorageID | ||||
| Count int | Count int | ||||
| @@ -242,49 +242,49 @@ func (t *CheckPackageRedundancy) summaryRepObjectBlockNodes(objs []stgmod.Object | |||||
| } | } | ||||
| } | } | ||||
| nodes := lo.Values(stgBlocksMap) | |||||
| sort2.Sort(nodes, func(left *stgBlocks, right *stgBlocks) int { | |||||
| storages := lo.Values(stgBlocksMap) | |||||
| sort2.Sort(storages, func(left *stgBlocks, right *stgBlocks) int { | |||||
| return right.Count - left.Count | return right.Count - left.Count | ||||
| }) | }) | ||||
| ids := lo.Map(nodes, func(item *stgBlocks, idx int) cdssdk.StorageID { return item.StorageID }) | |||||
| if len(ids) > nodeCnt { | |||||
| ids = ids[:nodeCnt] | |||||
| ids := lo.Map(storages, func(item *stgBlocks, idx int) cdssdk.StorageID { return item.StorageID }) | |||||
| if len(ids) > storageCnt { | |||||
| ids = ids[:storageCnt] | |||||
| } | } | ||||
| return ids | return ids | ||||
| } | } | ||||
| func (t *CheckPackageRedundancy) chooseNewNodesForRep(red *cdssdk.RepRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| sortedNodes := sort2.Sort(lo.Values(allStgs), func(left *StorageLoadInfo, right *StorageLoadInfo) int { | |||||
| func (t *CheckPackageRedundancy) chooseNewStoragesForRep(red *cdssdk.RepRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| sortedStorages := sort2.Sort(lo.Values(allStgs), func(left *StorageLoadInfo, right *StorageLoadInfo) int { | |||||
| return sort2.Cmp(right.AccessAmount, left.AccessAmount) | return sort2.Cmp(right.AccessAmount, left.AccessAmount) | ||||
| }) | }) | ||||
| return t.chooseSoManyNodes(red.RepCount, sortedNodes) | |||||
| return t.chooseSoManyStorages(red.RepCount, sortedStorages) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) chooseNewNodesForEC(red *cdssdk.ECRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| sortedNodes := sort2.Sort(lo.Values(allStgs), func(left *StorageLoadInfo, right *StorageLoadInfo) int { | |||||
| func (t *CheckPackageRedundancy) chooseNewStoragesForEC(red *cdssdk.ECRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| sortedStorages := sort2.Sort(lo.Values(allStgs), func(left *StorageLoadInfo, right *StorageLoadInfo) int { | |||||
| return sort2.Cmp(right.AccessAmount, left.AccessAmount) | return sort2.Cmp(right.AccessAmount, left.AccessAmount) | ||||
| }) | }) | ||||
| return t.chooseSoManyNodes(red.N, sortedNodes) | |||||
| return t.chooseSoManyStorages(red.N, sortedStorages) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) chooseNewNodesForLRC(red *cdssdk.LRCRedundancy, allNodes map[cdssdk.NodeID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| sortedNodes := sort2.Sort(lo.Values(allNodes), func(left *StorageLoadInfo, right *StorageLoadInfo) int { | |||||
| func (t *CheckPackageRedundancy) chooseNewStoragesForLRC(red *cdssdk.LRCRedundancy, allStorages map[cdssdk.HubID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| sortedStorages := sort2.Sort(lo.Values(allStorages), func(left *StorageLoadInfo, right *StorageLoadInfo) int { | |||||
| return sort2.Cmp(right.AccessAmount, left.AccessAmount) | return sort2.Cmp(right.AccessAmount, left.AccessAmount) | ||||
| }) | }) | ||||
| return t.chooseSoManyNodes(red.N, sortedNodes) | |||||
| return t.chooseSoManyStorages(red.N, sortedStorages) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) rechooseNodesForRep(mostBlockStgIDs []cdssdk.StorageID, red *cdssdk.RepRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| type rechooseNode struct { | |||||
| func (t *CheckPackageRedundancy) rechooseStoragesForRep(mostBlockStgIDs []cdssdk.StorageID, red *cdssdk.RepRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| type rechooseStorage struct { | |||||
| *StorageLoadInfo | *StorageLoadInfo | ||||
| HasBlock bool | HasBlock bool | ||||
| } | } | ||||
| var rechooseStgs []*rechooseNode | |||||
| var rechooseStgs []*rechooseStorage | |||||
| for _, stg := range allStgs { | for _, stg := range allStgs { | ||||
| hasBlock := false | hasBlock := false | ||||
| for _, id := range mostBlockStgIDs { | for _, id := range mostBlockStgIDs { | ||||
| @@ -294,13 +294,13 @@ func (t *CheckPackageRedundancy) rechooseNodesForRep(mostBlockStgIDs []cdssdk.St | |||||
| } | } | ||||
| } | } | ||||
| rechooseStgs = append(rechooseStgs, &rechooseNode{ | |||||
| rechooseStgs = append(rechooseStgs, &rechooseStorage{ | |||||
| StorageLoadInfo: stg, | StorageLoadInfo: stg, | ||||
| HasBlock: hasBlock, | HasBlock: hasBlock, | ||||
| }) | }) | ||||
| } | } | ||||
| sortedStgs := sort2.Sort(rechooseStgs, func(left *rechooseNode, right *rechooseNode) int { | |||||
| sortedStgs := sort2.Sort(rechooseStgs, func(left *rechooseStorage, right *rechooseStorage) int { | |||||
| // 已经缓存了文件块的节点优先选择 | // 已经缓存了文件块的节点优先选择 | ||||
| v := sort2.CmpBool(right.HasBlock, left.HasBlock) | v := sort2.CmpBool(right.HasBlock, left.HasBlock) | ||||
| if v != 0 { | if v != 0 { | ||||
| @@ -310,10 +310,10 @@ func (t *CheckPackageRedundancy) rechooseNodesForRep(mostBlockStgIDs []cdssdk.St | |||||
| return sort2.Cmp(right.AccessAmount, left.AccessAmount) | return sort2.Cmp(right.AccessAmount, left.AccessAmount) | ||||
| }) | }) | ||||
| return t.chooseSoManyNodes(red.RepCount, lo.Map(sortedStgs, func(node *rechooseNode, idx int) *StorageLoadInfo { return node.StorageLoadInfo })) | |||||
| return t.chooseSoManyStorages(red.RepCount, lo.Map(sortedStgs, func(storage *rechooseStorage, idx int) *StorageLoadInfo { return storage.StorageLoadInfo })) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) rechooseNodesForEC(obj stgmod.ObjectDetail, red *cdssdk.ECRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| func (t *CheckPackageRedundancy) rechooseStoragesForEC(obj stgmod.ObjectDetail, red *cdssdk.ECRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| type rechooseStg struct { | type rechooseStg struct { | ||||
| *StorageLoadInfo | *StorageLoadInfo | ||||
| CachedBlockIndex int | CachedBlockIndex int | ||||
| @@ -346,10 +346,10 @@ func (t *CheckPackageRedundancy) rechooseNodesForEC(obj stgmod.ObjectDetail, red | |||||
| }) | }) | ||||
| // TODO 可以考虑选择已有块的节点时,能依然按照Index顺序选择 | // TODO 可以考虑选择已有块的节点时,能依然按照Index顺序选择 | ||||
| return t.chooseSoManyNodes(red.N, lo.Map(sortedStgs, func(node *rechooseStg, idx int) *StorageLoadInfo { return node.StorageLoadInfo })) | |||||
| return t.chooseSoManyStorages(red.N, lo.Map(sortedStgs, func(storage *rechooseStg, idx int) *StorageLoadInfo { return storage.StorageLoadInfo })) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) rechooseNodesForLRC(obj stgmod.ObjectDetail, red *cdssdk.LRCRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| func (t *CheckPackageRedundancy) rechooseStoragesForLRC(obj stgmod.ObjectDetail, red *cdssdk.LRCRedundancy, allStgs map[cdssdk.StorageID]*StorageLoadInfo) []*StorageLoadInfo { | |||||
| type rechooseStg struct { | type rechooseStg struct { | ||||
| *StorageLoadInfo | *StorageLoadInfo | ||||
| CachedBlockIndex int | CachedBlockIndex int | ||||
| @@ -382,19 +382,19 @@ func (t *CheckPackageRedundancy) rechooseNodesForLRC(obj stgmod.ObjectDetail, re | |||||
| }) | }) | ||||
| // TODO 可以考虑选择已有块的节点时,能依然按照Index顺序选择 | // TODO 可以考虑选择已有块的节点时,能依然按照Index顺序选择 | ||||
| return t.chooseSoManyNodes(red.N, lo.Map(sortedStgs, func(node *rechooseStg, idx int) *StorageLoadInfo { return node.StorageLoadInfo })) | |||||
| return t.chooseSoManyStorages(red.N, lo.Map(sortedStgs, func(storage *rechooseStg, idx int) *StorageLoadInfo { return storage.StorageLoadInfo })) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) chooseSoManyNodes(count int, stgs []*StorageLoadInfo) []*StorageLoadInfo { | |||||
| func (t *CheckPackageRedundancy) chooseSoManyStorages(count int, stgs []*StorageLoadInfo) []*StorageLoadInfo { | |||||
| repeateCount := (count + len(stgs) - 1) / len(stgs) | repeateCount := (count + len(stgs) - 1) / len(stgs) | ||||
| extendStgs := make([]*StorageLoadInfo, repeateCount*len(stgs)) | extendStgs := make([]*StorageLoadInfo, repeateCount*len(stgs)) | ||||
| // 使用复制的方式将节点数扩充到要求的数量 | // 使用复制的方式将节点数扩充到要求的数量 | ||||
| // 复制之后的结构:ABCD -> AAABBBCCCDDD | // 复制之后的结构:ABCD -> AAABBBCCCDDD | ||||
| for p := 0; p < repeateCount; p++ { | for p := 0; p < repeateCount; p++ { | ||||
| for i, node := range stgs { | |||||
| for i, storage := range stgs { | |||||
| putIdx := i*repeateCount + p | putIdx := i*repeateCount + p | ||||
| extendStgs[putIdx] = node | |||||
| extendStgs[putIdx] = storage | |||||
| } | } | ||||
| } | } | ||||
| extendStgs = extendStgs[:count] | extendStgs = extendStgs[:count] | ||||
| @@ -423,7 +423,7 @@ func (t *CheckPackageRedundancy) chooseSoManyNodes(count int, stgs []*StorageLoa | |||||
| func (t *CheckPackageRedundancy) noneToRep(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.RepRedundancy, uploadStgs []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | func (t *CheckPackageRedundancy) noneToRep(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.RepRedundancy, uploadStgs []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | ||||
| if len(obj.Blocks) == 0 { | if len(obj.Blocks) == 0 { | ||||
| return nil, fmt.Errorf("object is not cached on any nodes, cannot change its redundancy to rep") | |||||
| return nil, fmt.Errorf("object is not cached on any storages, cannot change its redundancy to rep") | |||||
| } | } | ||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| @@ -492,7 +492,7 @@ func (t *CheckPackageRedundancy) noneToEC(ctx ExecuteContext, obj stgmod.ObjectD | |||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| if len(obj.Blocks) == 0 { | if len(obj.Blocks) == 0 { | ||||
| return nil, fmt.Errorf("object is not cached on any nodes, cannot change its redundancy to ec") | |||||
| return nil, fmt.Errorf("object is not cached on any storages, cannot change its redundancy to ec") | |||||
| } | } | ||||
| getStgs, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{obj.Blocks[0].StorageID})) | getStgs, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{obj.Blocks[0].StorageID})) | ||||
| @@ -542,7 +542,7 @@ func (t *CheckPackageRedundancy) noneToEC(ctx ExecuteContext, obj stgmod.ObjectD | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| func (t *CheckPackageRedundancy) noneToLRC(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.LRCRedundancy, uploadNodes []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| func (t *CheckPackageRedundancy) noneToLRC(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.LRCRedundancy, uploadStorages []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("new coordinator client: %w", err) | return nil, fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -550,7 +550,7 @@ func (t *CheckPackageRedundancy) noneToLRC(ctx ExecuteContext, obj stgmod.Object | |||||
| defer stgglb.CoordinatorMQPool.Release(coorCli) | defer stgglb.CoordinatorMQPool.Release(coorCli) | ||||
| if len(obj.Blocks) == 0 { | if len(obj.Blocks) == 0 { | ||||
| return nil, fmt.Errorf("object is not cached on any nodes, cannot change its redundancy to ec") | |||||
| return nil, fmt.Errorf("object is not cached on any storages, cannot change its redundancy to ec") | |||||
| } | } | ||||
| getStgs, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{obj.Blocks[0].StorageID})) | getStgs, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{obj.Blocks[0].StorageID})) | ||||
| @@ -566,11 +566,11 @@ func (t *CheckPackageRedundancy) noneToLRC(ctx ExecuteContext, obj stgmod.Object | |||||
| var toes []ioswitchlrc.To | var toes []ioswitchlrc.To | ||||
| for i := 0; i < red.N; i++ { | for i := 0; i < red.N; i++ { | ||||
| toes = append(toes, ioswitchlrc.NewToStorage(*uploadNodes[i].Storage.MasterHub, uploadNodes[i].Storage.Storage, i, fmt.Sprintf("%d", i))) | |||||
| toes = append(toes, ioswitchlrc.NewToStorage(*uploadStorages[i].Storage.MasterHub, uploadStorages[i].Storage.Storage, i, fmt.Sprintf("%d", i))) | |||||
| } | } | ||||
| plans := exec.NewPlanBuilder() | plans := exec.NewPlanBuilder() | ||||
| err = lrcparser.Encode(ioswitchlrc.NewFromNode(obj.Object.FileHash, *getStgs.Storages[0].MasterHub, getStgs.Storages[0].Storage, -1), toes, plans) | |||||
| err = lrcparser.Encode(ioswitchlrc.NewFromStorage(obj.Object.FileHash, *getStgs.Storages[0].MasterHub, getStgs.Storages[0].Storage, -1), toes, plans) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("parsing plan: %w", err) | return nil, fmt.Errorf("parsing plan: %w", err) | ||||
| } | } | ||||
| @@ -587,7 +587,7 @@ func (t *CheckPackageRedundancy) noneToLRC(ctx ExecuteContext, obj stgmod.Object | |||||
| blocks = append(blocks, stgmod.ObjectBlock{ | blocks = append(blocks, stgmod.ObjectBlock{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Index: i, | Index: i, | ||||
| StorageID: uploadNodes[i].Storage.Storage.StorageID, | |||||
| StorageID: uploadStorages[i].Storage.Storage.StorageID, | |||||
| FileHash: ioRet[fmt.Sprintf("%d", i)].(*ops2.FileHashValue).Hash, | FileHash: ioRet[fmt.Sprintf("%d", i)].(*ops2.FileHashValue).Hash, | ||||
| }) | }) | ||||
| } | } | ||||
| @@ -601,7 +601,7 @@ func (t *CheckPackageRedundancy) noneToLRC(ctx ExecuteContext, obj stgmod.Object | |||||
| func (t *CheckPackageRedundancy) repToRep(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.RepRedundancy, uploadStgs []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | func (t *CheckPackageRedundancy) repToRep(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.RepRedundancy, uploadStgs []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | ||||
| if len(obj.Blocks) == 0 { | if len(obj.Blocks) == 0 { | ||||
| return nil, fmt.Errorf("object is not cached on any nodes, cannot change its redundancy to rep") | |||||
| return nil, fmt.Errorf("object is not cached on any storages, cannot change its redundancy to rep") | |||||
| } | } | ||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| @@ -662,8 +662,8 @@ func (t *CheckPackageRedundancy) repToRep(ctx ExecuteContext, obj stgmod.ObjectD | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| func (t *CheckPackageRedundancy) repToEC(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.ECRedundancy, uploadNodes []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| return t.noneToEC(ctx, obj, red, uploadNodes) | |||||
| func (t *CheckPackageRedundancy) repToEC(ctx ExecuteContext, obj stgmod.ObjectDetail, red *cdssdk.ECRedundancy, uploadStorages []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| return t.noneToEC(ctx, obj, red, uploadStorages) | |||||
| } | } | ||||
| func (t *CheckPackageRedundancy) ecToRep(ctx ExecuteContext, obj stgmod.ObjectDetail, srcRed *cdssdk.ECRedundancy, tarRed *cdssdk.RepRedundancy, uploadStgs []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | func (t *CheckPackageRedundancy) ecToRep(ctx ExecuteContext, obj stgmod.ObjectDetail, srcRed *cdssdk.ECRedundancy, tarRed *cdssdk.RepRedundancy, uploadStgs []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | ||||
| @@ -740,7 +740,7 @@ func (t *CheckPackageRedundancy) ecToRep(ctx ExecuteContext, obj stgmod.ObjectDe | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| func (t *CheckPackageRedundancy) ecToEC(ctx ExecuteContext, obj stgmod.ObjectDetail, srcRed *cdssdk.ECRedundancy, tarRed *cdssdk.ECRedundancy, uploadNodes []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| func (t *CheckPackageRedundancy) ecToEC(ctx ExecuteContext, obj stgmod.ObjectDetail, srcRed *cdssdk.ECRedundancy, tarRed *cdssdk.ECRedundancy, uploadStorages []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("new coordinator client: %w", err) | return nil, fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -770,7 +770,7 @@ func (t *CheckPackageRedundancy) ecToEC(ctx ExecuteContext, obj stgmod.ObjectDet | |||||
| var newBlocks []stgmod.ObjectBlock | var newBlocks []stgmod.ObjectBlock | ||||
| shouldUpdateBlocks := false | shouldUpdateBlocks := false | ||||
| for i, stg := range uploadNodes { | |||||
| for i, stg := range uploadStorages { | |||||
| newBlock := stgmod.ObjectBlock{ | newBlock := stgmod.ObjectBlock{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Index: i, | Index: i, | ||||
| @@ -835,7 +835,7 @@ func (t *CheckPackageRedundancy) ecToEC(ctx ExecuteContext, obj stgmod.ObjectDet | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| func (t *CheckPackageRedundancy) lrcToLRC(ctx ExecuteContext, obj stgmod.ObjectDetail, srcRed *cdssdk.LRCRedundancy, tarRed *cdssdk.LRCRedundancy, uploadNodes []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| func (t *CheckPackageRedundancy) lrcToLRC(ctx ExecuteContext, obj stgmod.ObjectDetail, srcRed *cdssdk.LRCRedundancy, tarRed *cdssdk.LRCRedundancy, uploadStorages []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| coorCli, err := stgglb.CoordinatorMQPool.Acquire() | coorCli, err := stgglb.CoordinatorMQPool.Acquire() | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("new coordinator client: %w", err) | return nil, fmt.Errorf("new coordinator client: %w", err) | ||||
| @@ -872,16 +872,16 @@ func (t *CheckPackageRedundancy) lrcToLRC(ctx ExecuteContext, obj stgmod.ObjectD | |||||
| } | } | ||||
| if canGroupReconstruct { | if canGroupReconstruct { | ||||
| // return t.groupReconstructLRC(obj, lostBlocks, lostBlockGrps, blocksGrpByIndex, srcRed, uploadNodes) | |||||
| // return t.groupReconstructLRC(obj, lostBlocks, lostBlockGrps, blocksGrpByIndex, srcRed, uploadStorages) | |||||
| } | } | ||||
| return t.reconstructLRC(ctx, obj, blocksGrpByIndex, srcRed, uploadNodes) | |||||
| return t.reconstructLRC(ctx, obj, blocksGrpByIndex, srcRed, uploadStorages) | |||||
| } | } | ||||
| /* | /* | ||||
| TODO2 修复这一块的代码 | TODO2 修复这一块的代码 | ||||
| func (t *CheckPackageRedundancy) groupReconstructLRC(obj stgmod.ObjectDetail, lostBlocks []int, lostBlockGrps []int, grpedBlocks []stgmod.GrouppedObjectBlock, red *cdssdk.LRCRedundancy, uploadNodes []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| func (t *CheckPackageRedundancy) groupReconstructLRC(obj stgmod.ObjectDetail, lostBlocks []int, lostBlockGrps []int, grpedBlocks []stgmod.GrouppedObjectBlock, red *cdssdk.LRCRedundancy, uploadStorages []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| grped := make(map[int]stgmod.GrouppedObjectBlock) | grped := make(map[int]stgmod.GrouppedObjectBlock) | ||||
| for _, b := range grpedBlocks { | for _, b := range grpedBlocks { | ||||
| grped[b.Index] = b | grped[b.Index] = b | ||||
| @@ -897,11 +897,11 @@ TODO2 修复这一块的代码 | |||||
| continue | continue | ||||
| } | } | ||||
| froms = append(froms, ioswitchlrc.NewFromNode(grped[ele].FileHash, nil, ele)) | |||||
| froms = append(froms, ioswitchlrc.NewFromStorage(grped[ele].FileHash, nil, ele)) | |||||
| } | } | ||||
| err := lrcparser.ReconstructGroup(froms, []ioswitchlrc.To{ | err := lrcparser.ReconstructGroup(froms, []ioswitchlrc.To{ | ||||
| ioswitchlrc.NewToNode(uploadNodes[i].Storage, lostBlocks[i], fmt.Sprintf("%d", lostBlocks[i])), | |||||
| ioswitchlrc.NewToStorage(uploadStorages[i].Storage, lostBlocks[i], fmt.Sprintf("%d", lostBlocks[i])), | |||||
| }, plans) | }, plans) | ||||
| if err != nil { | if err != nil { | ||||
| return nil, fmt.Errorf("parsing plan: %w", err) | return nil, fmt.Errorf("parsing plan: %w", err) | ||||
| @@ -922,16 +922,16 @@ TODO2 修复这一块的代码 | |||||
| newBlocks = append(newBlocks, stgmod.ObjectBlock{ | newBlocks = append(newBlocks, stgmod.ObjectBlock{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Index: i, | Index: i, | ||||
| StorageID: uploadNodes[i].Storage.Storage.StorageID, | |||||
| StorageID: uploadStorages[i].Storage.Storage.StorageID, | |||||
| FileHash: ret[fmt.Sprintf("%d", i)].(*ops2.FileHashValue).Hash, | FileHash: ret[fmt.Sprintf("%d", i)].(*ops2.FileHashValue).Hash, | ||||
| }) | }) | ||||
| } | } | ||||
| for _, b := range grpedBlocks { | for _, b := range grpedBlocks { | ||||
| for _, nodeID := range b.StorageIDs { | |||||
| for _, hubID := range b.StorageIDs { | |||||
| newBlocks = append(newBlocks, stgmod.ObjectBlock{ | newBlocks = append(newBlocks, stgmod.ObjectBlock{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Index: b.Index, | Index: b.Index, | ||||
| StorageID: nodeID, | |||||
| StorageID: hubID, | |||||
| FileHash: b.FileHash, | FileHash: b.FileHash, | ||||
| }) | }) | ||||
| } | } | ||||
| @@ -944,7 +944,7 @@ TODO2 修复这一块的代码 | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| */ | */ | ||||
| func (t *CheckPackageRedundancy) reconstructLRC(ctx ExecuteContext, obj stgmod.ObjectDetail, grpBlocks []stgmod.GrouppedObjectBlock, red *cdssdk.LRCRedundancy, uploadNodes []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| func (t *CheckPackageRedundancy) reconstructLRC(ctx ExecuteContext, obj stgmod.ObjectDetail, grpBlocks []stgmod.GrouppedObjectBlock, red *cdssdk.LRCRedundancy, uploadStorages []*StorageLoadInfo) (*coormq.UpdatingObjectRedundancy, error) { | |||||
| var chosenBlocks []stgmod.GrouppedObjectBlock | var chosenBlocks []stgmod.GrouppedObjectBlock | ||||
| for _, block := range grpBlocks { | for _, block := range grpBlocks { | ||||
| if len(block.StorageIDs) > 0 && block.Index < red.M() { | if len(block.StorageIDs) > 0 && block.Index < red.M() { | ||||
| @@ -967,17 +967,17 @@ func (t *CheckPackageRedundancy) reconstructLRC(ctx ExecuteContext, obj stgmod.O | |||||
| var toes []ioswitchlrc.To | var toes []ioswitchlrc.To | ||||
| var newBlocks []stgmod.ObjectBlock | var newBlocks []stgmod.ObjectBlock | ||||
| shouldUpdateBlocks := false | shouldUpdateBlocks := false | ||||
| for i, node := range uploadNodes { | |||||
| for i, storage := range uploadStorages { | |||||
| newBlock := stgmod.ObjectBlock{ | newBlock := stgmod.ObjectBlock{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Index: i, | Index: i, | ||||
| StorageID: node.Storage.Storage.StorageID, | |||||
| StorageID: storage.Storage.Storage.StorageID, | |||||
| } | } | ||||
| grp, ok := lo.Find(grpBlocks, func(grp stgmod.GrouppedObjectBlock) bool { return grp.Index == i }) | grp, ok := lo.Find(grpBlocks, func(grp stgmod.GrouppedObjectBlock) bool { return grp.Index == i }) | ||||
| // 如果新选中的节点已经记录在Block表中,那么就不需要任何变更 | // 如果新选中的节点已经记录在Block表中,那么就不需要任何变更 | ||||
| if ok && lo.Contains(grp.StorageIDs, node.Storage.Storage.StorageID) { | |||||
| if ok && lo.Contains(grp.StorageIDs, storage.Storage.Storage.StorageID) { | |||||
| newBlock.FileHash = grp.FileHash | newBlock.FileHash = grp.FileHash | ||||
| newBlocks = append(newBlocks, newBlock) | newBlocks = append(newBlocks, newBlock) | ||||
| continue | continue | ||||
| @@ -989,12 +989,12 @@ func (t *CheckPackageRedundancy) reconstructLRC(ctx ExecuteContext, obj stgmod.O | |||||
| for _, block := range chosenBlocks { | for _, block := range chosenBlocks { | ||||
| fmt.Printf("b: %v\n", block.Index) | fmt.Printf("b: %v\n", block.Index) | ||||
| stg := node.Storage | |||||
| froms = append(froms, ioswitchlrc.NewFromNode(block.FileHash, *stg.MasterHub, stg.Storage, block.Index)) | |||||
| stg := storage.Storage | |||||
| froms = append(froms, ioswitchlrc.NewFromStorage(block.FileHash, *stg.MasterHub, stg.Storage, block.Index)) | |||||
| } | } | ||||
| // 输出只需要自己要保存的那一块 | // 输出只需要自己要保存的那一块 | ||||
| toes = append(toes, ioswitchlrc.NewToStorage(*node.Storage.MasterHub, node.Storage.Storage, i, fmt.Sprintf("%d", i))) | |||||
| toes = append(toes, ioswitchlrc.NewToStorage(*storage.Storage.MasterHub, storage.Storage.Storage, i, fmt.Sprintf("%d", i))) | |||||
| newBlocks = append(newBlocks, newBlock) | newBlocks = append(newBlocks, newBlock) | ||||
| } | } | ||||
| @@ -1034,8 +1034,8 @@ func (t *CheckPackageRedundancy) reconstructLRC(ctx ExecuteContext, obj stgmod.O | |||||
| }, nil | }, nil | ||||
| } | } | ||||
| // func (t *CheckPackageRedundancy) pinObject(nodeID cdssdk.NodeID, fileHash string) error { | |||||
| // agtCli, err := stgglb.AgentMQPool.Acquire(nodeID) | |||||
| // func (t *CheckPackageRedundancy) pinObject(hubID cdssdk.HubID, fileHash string) error { | |||||
| // agtCli, err := stgglb.AgentMQPool.Acquire(hubID) | |||||
| // if err != nil { | // if err != nil { | ||||
| // return fmt.Errorf("new agent client: %w", err) | // return fmt.Errorf("new agent client: %w", err) | ||||
| // } | // } | ||||
| @@ -119,11 +119,11 @@ func (t *CleanPinned) Execute(execCtx ExecuteContext) { | |||||
| // 对于rep对象,统计出所有对象块分布最多的两个节点,用这两个节点代表所有rep对象块的分布,去进行退火算法 | // 对于rep对象,统计出所有对象块分布最多的两个节点,用这两个节点代表所有rep对象块的分布,去进行退火算法 | ||||
| var repObjectsUpdating []coormq.UpdatingObjectRedundancy | var repObjectsUpdating []coormq.UpdatingObjectRedundancy | ||||
| repMostNodeIDs := t.summaryRepObjectBlockNodes(repObjects) | |||||
| repMostHubIDs := t.summaryRepObjectBlockNodes(repObjects) | |||||
| solu := t.startAnnealing(allStgInfos, readerStgIDs, annealingObject{ | solu := t.startAnnealing(allStgInfos, readerStgIDs, annealingObject{ | ||||
| totalBlockCount: 1, | totalBlockCount: 1, | ||||
| minBlockCnt: 1, | minBlockCnt: 1, | ||||
| pinnedAt: repMostNodeIDs, | |||||
| pinnedAt: repMostHubIDs, | |||||
| blocks: nil, | blocks: nil, | ||||
| }) | }) | ||||
| for _, obj := range repObjects { | for _, obj := range repObjects { | ||||
| @@ -184,18 +184,18 @@ func (t *CleanPinned) summaryRepObjectBlockNodes(objs []stgmod.ObjectDetail) []c | |||||
| cacheBlockStgs[block.StorageID] = true | cacheBlockStgs[block.StorageID] = true | ||||
| } | } | ||||
| for _, nodeID := range obj.PinnedAt { | |||||
| if cacheBlockStgs[nodeID] { | |||||
| for _, hubID := range obj.PinnedAt { | |||||
| if cacheBlockStgs[hubID] { | |||||
| continue | continue | ||||
| } | } | ||||
| if _, ok := stgBlocksMap[nodeID]; !ok { | |||||
| stgBlocksMap[nodeID] = &stgBlocks{ | |||||
| StorageID: nodeID, | |||||
| if _, ok := stgBlocksMap[hubID]; !ok { | |||||
| stgBlocksMap[hubID] = &stgBlocks{ | |||||
| StorageID: hubID, | |||||
| Count: 0, | Count: 0, | ||||
| } | } | ||||
| } | } | ||||
| stgBlocksMap[nodeID].Count++ | |||||
| stgBlocksMap[hubID].Count++ | |||||
| } | } | ||||
| } | } | ||||
| @@ -278,22 +278,22 @@ func newCombinatorialTree(stgBlocksMaps map[cdssdk.StorageID]*bitmap.Bitmap64) c | |||||
| tree.localStgIDToStgID = append(tree.localStgIDToStgID, id) | tree.localStgIDToStgID = append(tree.localStgIDToStgID, id) | ||||
| } | } | ||||
| tree.nodes[0].localNodeID = -1 | |||||
| tree.nodes[0].localHubID = -1 | |||||
| index := 1 | index := 1 | ||||
| tree.initNode(0, &tree.nodes[0], &index) | tree.initNode(0, &tree.nodes[0], &index) | ||||
| return tree | return tree | ||||
| } | } | ||||
| func (t *combinatorialTree) initNode(minAvaiLocalNodeID int, parent *combinatorialTreeNode, index *int) { | |||||
| for i := minAvaiLocalNodeID; i < len(t.stgIDToLocalStgID); i++ { | |||||
| func (t *combinatorialTree) initNode(minAvaiLocalHubID int, parent *combinatorialTreeNode, index *int) { | |||||
| for i := minAvaiLocalHubID; i < len(t.stgIDToLocalStgID); i++ { | |||||
| curIndex := *index | curIndex := *index | ||||
| *index++ | *index++ | ||||
| bitMp := t.blocksMaps[i] | bitMp := t.blocksMaps[i] | ||||
| bitMp.Or(&parent.blocksBitmap) | bitMp.Or(&parent.blocksBitmap) | ||||
| t.nodes[curIndex] = combinatorialTreeNode{ | t.nodes[curIndex] = combinatorialTreeNode{ | ||||
| localNodeID: i, | |||||
| localHubID: i, | |||||
| parent: parent, | parent: parent, | ||||
| blocksBitmap: bitMp, | blocksBitmap: bitMp, | ||||
| } | } | ||||
| @@ -339,7 +339,7 @@ func (t *combinatorialTree) UpdateBitmap(stgID cdssdk.StorageID, mp bitmap.Bitma | |||||
| index := d + i | index := d + i | ||||
| node := &t.nodes[index] | node := &t.nodes[index] | ||||
| newMp := t.blocksMaps[node.localNodeID] | |||||
| newMp := t.blocksMaps[node.localHubID] | |||||
| newMp.Or(&node.parent.blocksBitmap) | newMp.Or(&node.parent.blocksBitmap) | ||||
| node.blocksBitmap = newMp | node.blocksBitmap = newMp | ||||
| if newMp.Weight() >= k { | if newMp.Weight() >= k { | ||||
| @@ -350,7 +350,7 @@ func (t *combinatorialTree) UpdateBitmap(stgID cdssdk.StorageID, mp bitmap.Bitma | |||||
| curNode := &t.nodes[index] | curNode := &t.nodes[index] | ||||
| parentNode := t.nodes[parentIndex] | parentNode := t.nodes[parentIndex] | ||||
| newMp := t.blocksMaps[curNode.localNodeID] | |||||
| newMp := t.blocksMaps[curNode.localHubID] | |||||
| newMp.Or(&parentNode.blocksBitmap) | newMp.Or(&parentNode.blocksBitmap) | ||||
| curNode.blocksBitmap = newMp | curNode.blocksBitmap = newMp | ||||
| if newMp.Weight() >= k { | if newMp.Weight() >= k { | ||||
| @@ -377,7 +377,7 @@ func (t *combinatorialTree) FindKBlocksMaxDepth(k int) int { | |||||
| // 由于遍历时采用的是深度优先的算法,因此遍历到这个叶子节点时,叶子节点再加一个节点的组合已经在前面搜索过, | // 由于遍历时采用的是深度优先的算法,因此遍历到这个叶子节点时,叶子节点再加一个节点的组合已经在前面搜索过, | ||||
| // 所以用当前叶子节点深度+1来作为当前分支的结果就可以,即使当前情况下增加任意一个节点依然不够K块, | // 所以用当前叶子节点深度+1来作为当前分支的结果就可以,即使当前情况下增加任意一个节点依然不够K块, | ||||
| // 可以使用同样的思路去递推到当前叶子节点增加两个块的情况。 | // 可以使用同样的思路去递推到当前叶子节点增加两个块的情况。 | ||||
| if t.nodes[index].localNodeID == len(t.stgIDToLocalStgID)-1 { | |||||
| if t.nodes[index].localHubID == len(t.stgIDToLocalStgID)-1 { | |||||
| if maxDepth < depth+1 { | if maxDepth < depth+1 { | ||||
| maxDepth = depth + 1 | maxDepth = depth + 1 | ||||
| } | } | ||||
| @@ -409,7 +409,7 @@ func (t *combinatorialTree) iterChildren(index int, do func(index int, parentInd | |||||
| childIndex := index + 1 | childIndex := index + 1 | ||||
| curDepth := t.GetDepth(index) | curDepth := t.GetDepth(index) | ||||
| childCounts := len(t.stgIDToLocalStgID) - 1 - curNode.localNodeID | |||||
| childCounts := len(t.stgIDToLocalStgID) - 1 - curNode.localHubID | |||||
| if childCounts == 0 { | if childCounts == 0 { | ||||
| return | return | ||||
| } | } | ||||
| @@ -438,7 +438,7 @@ func (t *combinatorialTree) itering(index int, parentIndex int, depth int, do fu | |||||
| curNode := &t.nodes[index] | curNode := &t.nodes[index] | ||||
| childIndex := index + 1 | childIndex := index + 1 | ||||
| childCounts := len(t.stgIDToLocalStgID) - 1 - curNode.localNodeID | |||||
| childCounts := len(t.stgIDToLocalStgID) - 1 - curNode.localHubID | |||||
| if childCounts == 0 { | if childCounts == 0 { | ||||
| return iterActionNone | return iterActionNone | ||||
| } | } | ||||
| @@ -458,7 +458,7 @@ func (t *combinatorialTree) itering(index int, parentIndex int, depth int, do fu | |||||
| } | } | ||||
| type combinatorialTreeNode struct { | type combinatorialTreeNode struct { | ||||
| localNodeID int | |||||
| localHubID int | |||||
| parent *combinatorialTreeNode | parent *combinatorialTreeNode | ||||
| blocksBitmap bitmap.Bitmap64 // 选择了这个中心之后,所有中心一共包含多少种块 | blocksBitmap bitmap.Bitmap64 // 选择了这个中心之后,所有中心一共包含多少种块 | ||||
| } | } | ||||
| @@ -614,19 +614,19 @@ func (t *CleanPinned) sortNodeByReaderDistance(state *annealingState) { | |||||
| // 同节点时距离视为0.1 | // 同节点时距离视为0.1 | ||||
| nodeDists = append(nodeDists, stgDist{ | nodeDists = append(nodeDists, stgDist{ | ||||
| StorageID: n, | StorageID: n, | ||||
| Distance: consts.NodeDistanceSameNode, | |||||
| Distance: consts.StorageDistanceSameStorage, | |||||
| }) | }) | ||||
| } else if state.allStgInfos[r].MasterHub.LocationID == state.allStgInfos[n].MasterHub.LocationID { | } else if state.allStgInfos[r].MasterHub.LocationID == state.allStgInfos[n].MasterHub.LocationID { | ||||
| // 同地区时距离视为1 | // 同地区时距离视为1 | ||||
| nodeDists = append(nodeDists, stgDist{ | nodeDists = append(nodeDists, stgDist{ | ||||
| StorageID: n, | StorageID: n, | ||||
| Distance: consts.NodeDistanceSameLocation, | |||||
| Distance: consts.StorageDistanceSameLocation, | |||||
| }) | }) | ||||
| } else { | } else { | ||||
| // 不同地区时距离视为5 | // 不同地区时距离视为5 | ||||
| nodeDists = append(nodeDists, stgDist{ | nodeDists = append(nodeDists, stgDist{ | ||||
| StorageID: n, | StorageID: n, | ||||
| Distance: consts.NodeDistanceOther, | |||||
| Distance: consts.StorageDistanceOther, | |||||
| }) | }) | ||||
| } | } | ||||
| } | } | ||||
| @@ -724,7 +724,7 @@ func (t *CleanPinned) alwaysAccept(curTemp float64, dScore float64, coolingRate | |||||
| return v > rand.Float64() | return v > rand.Float64() | ||||
| } | } | ||||
| func (t *CleanPinned) makePlansForRepObject(allStgInfos map[cdssdk.StorageID]*stgmod.StorageDetail, solu annealingSolution, obj stgmod.ObjectDetail, planBld *exec.PlanBuilder, planningNodeIDs map[cdssdk.StorageID]bool) coormq.UpdatingObjectRedundancy { | |||||
| func (t *CleanPinned) makePlansForRepObject(allStgInfos map[cdssdk.StorageID]*stgmod.StorageDetail, solu annealingSolution, obj stgmod.ObjectDetail, planBld *exec.PlanBuilder, planningHubIDs map[cdssdk.StorageID]bool) coormq.UpdatingObjectRedundancy { | |||||
| entry := coormq.UpdatingObjectRedundancy{ | entry := coormq.UpdatingObjectRedundancy{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Redundancy: obj.Object.Redundancy, | Redundancy: obj.Object.Redundancy, | ||||
| @@ -751,7 +751,7 @@ func (t *CleanPinned) makePlansForRepObject(allStgInfos map[cdssdk.StorageID]*st | |||||
| // TODO 错误处理 | // TODO 错误处理 | ||||
| continue | continue | ||||
| } | } | ||||
| planningNodeIDs[solu.blockList[i].StorageID] = true | |||||
| planningHubIDs[solu.blockList[i].StorageID] = true | |||||
| } | } | ||||
| entry.Blocks = append(entry.Blocks, stgmod.ObjectBlock{ | entry.Blocks = append(entry.Blocks, stgmod.ObjectBlock{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| @@ -765,7 +765,7 @@ func (t *CleanPinned) makePlansForRepObject(allStgInfos map[cdssdk.StorageID]*st | |||||
| return entry | return entry | ||||
| } | } | ||||
| func (t *CleanPinned) makePlansForECObject(allStgInfos map[cdssdk.StorageID]*stgmod.StorageDetail, solu annealingSolution, obj stgmod.ObjectDetail, planBld *exec.PlanBuilder, planningNodeIDs map[cdssdk.StorageID]bool) coormq.UpdatingObjectRedundancy { | |||||
| func (t *CleanPinned) makePlansForECObject(allStgInfos map[cdssdk.StorageID]*stgmod.StorageDetail, solu annealingSolution, obj stgmod.ObjectDetail, planBld *exec.PlanBuilder, planningHubIDs map[cdssdk.StorageID]bool) coormq.UpdatingObjectRedundancy { | |||||
| entry := coormq.UpdatingObjectRedundancy{ | entry := coormq.UpdatingObjectRedundancy{ | ||||
| ObjectID: obj.Object.ObjectID, | ObjectID: obj.Object.ObjectID, | ||||
| Redundancy: obj.Object.Redundancy, | Redundancy: obj.Object.Redundancy, | ||||
| @@ -812,7 +812,7 @@ func (t *CleanPinned) makePlansForECObject(allStgInfos map[cdssdk.StorageID]*stg | |||||
| continue | continue | ||||
| } | } | ||||
| planningNodeIDs[id] = true | |||||
| planningHubIDs[id] = true | |||||
| } | } | ||||
| return entry | return entry | ||||
| } | } | ||||
| @@ -21,7 +21,7 @@ func newTreeTest(nodeBlocksMap []bitmap.Bitmap64) combinatorialTree { | |||||
| tree.localStgIDToStgID = append(tree.localStgIDToStgID, cdssdk.StorageID(id)) | tree.localStgIDToStgID = append(tree.localStgIDToStgID, cdssdk.StorageID(id)) | ||||
| } | } | ||||
| tree.nodes[0].localNodeID = -1 | |||||
| tree.nodes[0].localHubID = -1 | |||||
| index := 1 | index := 1 | ||||
| tree.initNode(0, &tree.nodes[0], &index) | tree.initNode(0, &tree.nodes[0], &index) | ||||
| @@ -111,7 +111,7 @@ func Test_newCombinatorialTree(t *testing.T) { | |||||
| var localIDs []int | var localIDs []int | ||||
| var bitmaps []int | var bitmaps []int | ||||
| for _, n := range t.nodes { | for _, n := range t.nodes { | ||||
| localIDs = append(localIDs, n.localNodeID) | |||||
| localIDs = append(localIDs, n.localHubID) | |||||
| bitmaps = append(bitmaps, int(n.blocksBitmap)) | bitmaps = append(bitmaps, int(n.blocksBitmap)) | ||||
| } | } | ||||
| @@ -125,7 +125,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| testcases := []struct { | testcases := []struct { | ||||
| title string | title string | ||||
| nodeBlocks []bitmap.Bitmap64 | nodeBlocks []bitmap.Bitmap64 | ||||
| updatedNodeID cdssdk.StorageID | |||||
| updatedHubID cdssdk.StorageID | |||||
| updatedBitmap bitmap.Bitmap64 | updatedBitmap bitmap.Bitmap64 | ||||
| k int | k int | ||||
| expectedTreeNodeBitmaps []int | expectedTreeNodeBitmaps []int | ||||
| @@ -134,7 +134,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,更新但值不变", | title: "4个节点,更新但值不变", | ||||
| nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | ||||
| updatedNodeID: cdssdk.StorageID(0), | |||||
| updatedHubID: cdssdk.StorageID(0), | |||||
| updatedBitmap: bitmap.Bitmap64(1), | updatedBitmap: bitmap.Bitmap64(1), | ||||
| k: 4, | k: 4, | ||||
| expectedTreeNodeBitmaps: []int{0, 1, 3, 7, 15, 11, 5, 13, 9, 2, 6, 14, 10, 4, 12, 8}, | expectedTreeNodeBitmaps: []int{0, 1, 3, 7, 15, 11, 5, 13, 9, 2, 6, 14, 10, 4, 12, 8}, | ||||
| @@ -143,7 +143,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,更新0", | title: "4个节点,更新0", | ||||
| nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | ||||
| updatedNodeID: cdssdk.StorageID(0), | |||||
| updatedHubID: cdssdk.StorageID(0), | |||||
| updatedBitmap: bitmap.Bitmap64(2), | updatedBitmap: bitmap.Bitmap64(2), | ||||
| k: 4, | k: 4, | ||||
| expectedTreeNodeBitmaps: []int{0, 2, 2, 6, 14, 10, 6, 14, 10, 2, 6, 14, 10, 4, 12, 8}, | expectedTreeNodeBitmaps: []int{0, 2, 2, 6, 14, 10, 6, 14, 10, 2, 6, 14, 10, 4, 12, 8}, | ||||
| @@ -152,7 +152,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,更新1", | title: "4个节点,更新1", | ||||
| nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | ||||
| updatedNodeID: cdssdk.StorageID(1), | |||||
| updatedHubID: cdssdk.StorageID(1), | |||||
| updatedBitmap: bitmap.Bitmap64(1), | updatedBitmap: bitmap.Bitmap64(1), | ||||
| k: 4, | k: 4, | ||||
| expectedTreeNodeBitmaps: []int{0, 1, 1, 5, 13, 9, 5, 13, 9, 1, 5, 13, 9, 4, 12, 8}, | expectedTreeNodeBitmaps: []int{0, 1, 1, 5, 13, 9, 5, 13, 9, 1, 5, 13, 9, 4, 12, 8}, | ||||
| @@ -161,7 +161,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,更新2", | title: "4个节点,更新2", | ||||
| nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | ||||
| updatedNodeID: cdssdk.StorageID(2), | |||||
| updatedHubID: cdssdk.StorageID(2), | |||||
| updatedBitmap: bitmap.Bitmap64(1), | updatedBitmap: bitmap.Bitmap64(1), | ||||
| k: 4, | k: 4, | ||||
| expectedTreeNodeBitmaps: []int{0, 1, 3, 3, 11, 11, 1, 9, 9, 2, 3, 11, 10, 1, 9, 8}, | expectedTreeNodeBitmaps: []int{0, 1, 3, 3, 11, 11, 1, 9, 9, 2, 3, 11, 10, 1, 9, 8}, | ||||
| @@ -170,7 +170,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,更新3", | title: "4个节点,更新3", | ||||
| nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | ||||
| updatedNodeID: cdssdk.StorageID(3), | |||||
| updatedHubID: cdssdk.StorageID(3), | |||||
| updatedBitmap: bitmap.Bitmap64(1), | updatedBitmap: bitmap.Bitmap64(1), | ||||
| k: 4, | k: 4, | ||||
| expectedTreeNodeBitmaps: []int{0, 1, 3, 7, 7, 3, 5, 5, 1, 2, 6, 7, 3, 4, 5, 1}, | expectedTreeNodeBitmaps: []int{0, 1, 3, 7, 7, 3, 5, 5, 1, 2, 6, 7, 3, 4, 5, 1}, | ||||
| @@ -179,7 +179,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,k<4,更新0,0之前没有k个块,现在拥有", | title: "4个节点,k<4,更新0,0之前没有k个块,现在拥有", | ||||
| nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | nodeBlocks: []bitmap.Bitmap64{1, 2, 4, 8}, | ||||
| updatedNodeID: cdssdk.StorageID(0), | |||||
| updatedHubID: cdssdk.StorageID(0), | |||||
| updatedBitmap: bitmap.Bitmap64(3), | updatedBitmap: bitmap.Bitmap64(3), | ||||
| k: 2, | k: 2, | ||||
| expectedTreeNodeBitmaps: []int{0, 3, 3, 7, 15, 11, 5, 13, 9, 2, 6, 14, 10, 4, 12, 8}, | expectedTreeNodeBitmaps: []int{0, 3, 3, 7, 15, 11, 5, 13, 9, 2, 6, 14, 10, 4, 12, 8}, | ||||
| @@ -187,7 +187,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| { | { | ||||
| title: "4个节点,k<4,更新0,0之前有k个块,现在没有", | title: "4个节点,k<4,更新0,0之前有k个块,现在没有", | ||||
| nodeBlocks: []bitmap.Bitmap64{3, 4, 0, 0}, | nodeBlocks: []bitmap.Bitmap64{3, 4, 0, 0}, | ||||
| updatedNodeID: cdssdk.StorageID(0), | |||||
| updatedHubID: cdssdk.StorageID(0), | |||||
| updatedBitmap: bitmap.Bitmap64(0), | updatedBitmap: bitmap.Bitmap64(0), | ||||
| k: 2, | k: 2, | ||||
| expectedTreeNodeBitmaps: []int{0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0}, | expectedTreeNodeBitmaps: []int{0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0}, | ||||
| @@ -197,7 +197,7 @@ func Test_UpdateBitmap(t *testing.T) { | |||||
| for _, test := range testcases { | for _, test := range testcases { | ||||
| Convey(test.title, t, func() { | Convey(test.title, t, func() { | ||||
| t := newTreeTest(test.nodeBlocks) | t := newTreeTest(test.nodeBlocks) | ||||
| t.UpdateBitmap(test.updatedNodeID, test.updatedBitmap, test.k) | |||||
| t.UpdateBitmap(test.updatedHubID, test.updatedBitmap, test.k) | |||||
| var bitmaps []int | var bitmaps []int | ||||
| for _, n := range t.nodes { | for _, n := range t.nodes { | ||||
| @@ -14,52 +14,52 @@ func Test_chooseSoManyNodes(t *testing.T) { | |||||
| title string | title string | ||||
| allNodes []*StorageLoadInfo | allNodes []*StorageLoadInfo | ||||
| count int | count int | ||||
| expectedNodeIDs []cdssdk.NodeID | |||||
| expectedHubIDs []cdssdk.HubID | |||||
| }{ | }{ | ||||
| { | { | ||||
| title: "节点数量充足", | title: "节点数量充足", | ||||
| allNodes: []*StorageLoadInfo{ | allNodes: []*StorageLoadInfo{ | ||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(1)}}, | |||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(2)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(1)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(2)}}, | |||||
| }, | }, | ||||
| count: 2, | count: 2, | ||||
| expectedNodeIDs: []cdssdk.NodeID{1, 2}, | |||||
| expectedHubIDs: []cdssdk.HubID{1, 2}, | |||||
| }, | }, | ||||
| { | { | ||||
| title: "节点数量超过", | title: "节点数量超过", | ||||
| allNodes: []*StorageLoadInfo{ | allNodes: []*StorageLoadInfo{ | ||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(1)}}, | |||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(2)}}, | |||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(3)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(1)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(2)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(3)}}, | |||||
| }, | }, | ||||
| count: 2, | count: 2, | ||||
| expectedNodeIDs: []cdssdk.NodeID{1, 2}, | |||||
| expectedHubIDs: []cdssdk.HubID{1, 2}, | |||||
| }, | }, | ||||
| { | { | ||||
| title: "只有一个节点,节点数量不够", | title: "只有一个节点,节点数量不够", | ||||
| allNodes: []*StorageLoadInfo{ | allNodes: []*StorageLoadInfo{ | ||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(1)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(1)}}, | |||||
| }, | }, | ||||
| count: 3, | count: 3, | ||||
| expectedNodeIDs: []cdssdk.NodeID{1, 1, 1}, | |||||
| expectedHubIDs: []cdssdk.HubID{1, 1, 1}, | |||||
| }, | }, | ||||
| { | { | ||||
| title: "多个同地区节点,节点数量不够", | title: "多个同地区节点,节点数量不够", | ||||
| allNodes: []*StorageLoadInfo{ | allNodes: []*StorageLoadInfo{ | ||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(1)}}, | |||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(2)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(1)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(2)}}, | |||||
| }, | }, | ||||
| count: 5, | count: 5, | ||||
| expectedNodeIDs: []cdssdk.NodeID{1, 1, 1, 2, 2}, | |||||
| expectedHubIDs: []cdssdk.HubID{1, 1, 1, 2, 2}, | |||||
| }, | }, | ||||
| { | { | ||||
| title: "节点数量不够,且在不同地区", | title: "节点数量不够,且在不同地区", | ||||
| allNodes: []*StorageLoadInfo{ | allNodes: []*StorageLoadInfo{ | ||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(1), LocationID: cdssdk.LocationID(1)}}, | |||||
| {Storage: cdssdk.Node{NodeID: cdssdk.NodeID(2), LocationID: cdssdk.LocationID(2)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(1), LocationID: cdssdk.LocationID(1)}}, | |||||
| {Storage: cdssdk.Node{HubID: cdssdk.HubID(2), LocationID: cdssdk.LocationID(2)}}, | |||||
| }, | }, | ||||
| count: 5, | count: 5, | ||||
| expectedNodeIDs: []cdssdk.NodeID{1, 2, 1, 2, 1}, | |||||
| expectedHubIDs: []cdssdk.HubID{1, 2, 1, 2, 1}, | |||||
| }, | }, | ||||
| } | } | ||||
| @@ -68,9 +68,9 @@ func Test_chooseSoManyNodes(t *testing.T) { | |||||
| var t CheckPackageRedundancy | var t CheckPackageRedundancy | ||||
| chosenNodes := t.chooseSoManyNodes(test.count, test.allNodes) | chosenNodes := t.chooseSoManyNodes(test.count, test.allNodes) | ||||
| chosenNodeIDs := lo.Map(chosenNodes, func(item *StorageLoadInfo, idx int) cdssdk.NodeID { return item.Storage.NodeID }) | |||||
| chosenHubIDs := lo.Map(chosenNodes, func(item *StorageLoadInfo, idx int) cdssdk.HubID { return item.Storage.HubID }) | |||||
| So(chosenNodeIDs, ShouldResemble, test.expectedNodeIDs) | |||||
| So(chosenHubIDs, ShouldResemble, test.expectedHubIDs) | |||||
| }) | }) | ||||
| } | } | ||||
| } | } | ||||
| @@ -25,11 +25,11 @@ func (e *BatchAllAgentCheckCache) Execute(ctx ExecuteContext) { | |||||
| if e.stgIDs == nil || len(e.stgIDs) == 0 { | if e.stgIDs == nil || len(e.stgIDs) == 0 { | ||||
| ids, err := ctx.Args.DB.Storage().GetAllIDs(ctx.Args.DB.DefCtx()) | ids, err := ctx.Args.DB.Storage().GetAllIDs(ctx.Args.DB.DefCtx()) | ||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("get all nodes failed, err: %s", err.Error()) | |||||
| log.Warnf("get all storages failed, err: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| log.Debugf("new check start, get all nodes") | |||||
| log.Debugf("new check start, get all storages") | |||||
| e.stgIDs = ids | e.stgIDs = ids | ||||
| } | } | ||||
| @@ -18,14 +18,14 @@ func (e *CheckAgentState) Execute(ctx ExecuteContext) { | |||||
| log.Debugf("begin") | log.Debugf("begin") | ||||
| defer log.Debugf("end") | defer log.Debugf("end") | ||||
| nodes, err := ctx.Args.DB.Node().GetAllNodes(ctx.Args.DB.DefCtx()) | |||||
| hubs, err := ctx.Args.DB.Hub().GetAllHubs(ctx.Args.DB.DefCtx()) | |||||
| if err != nil { | if err != nil { | ||||
| log.Warnf("get all nodes failed, err: %s", err.Error()) | |||||
| log.Warnf("get all hubs failed, err: %s", err.Error()) | |||||
| return | return | ||||
| } | } | ||||
| for _, node := range nodes { | |||||
| ctx.Args.EventExecutor.Post(event.NewAgentCheckState(scevt.NewAgentCheckState(node.NodeID)), event.ExecuteOption{ | |||||
| for _, hub := range hubs { | |||||
| ctx.Args.EventExecutor.Post(event.NewAgentCheckState(scevt.NewAgentCheckState(hub.HubID)), event.ExecuteOption{ | |||||
| IsEmergency: true, | IsEmergency: true, | ||||
| DontMerge: true, | DontMerge: true, | ||||
| }) | }) | ||||