package services import ( "fmt" "time" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" stgglb "gitlink.org.cn/cloudream/storage/common/globals" "gitlink.org.cn/cloudream/storage/common/pkgs/db2/model" agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent" coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator" ) type StorageService struct { *Service } func (svc *Service) StorageSvc() *StorageService { return &StorageService{Service: svc} } func (svc *StorageService) Get(userID cdssdk.UserID, storageID cdssdk.StorageID) (*model.Storage, error) { coorCli, err := stgglb.CoordinatorMQPool.Acquire() if err != nil { return nil, fmt.Errorf("new coordinator client: %w", err) } defer stgglb.CoordinatorMQPool.Release(coorCli) getResp, err := coorCli.GetStorage(coormq.ReqGetStorage(userID, storageID)) if err != nil { return nil, fmt.Errorf("request to coordinator: %w", err) } return &getResp.Storage, nil } func (svc *StorageService) GetByName(userID cdssdk.UserID, name string) (*model.Storage, error) { coorCli, err := stgglb.CoordinatorMQPool.Acquire() if err != nil { return nil, fmt.Errorf("new coordinator client: %w", err) } defer stgglb.CoordinatorMQPool.Release(coorCli) getResp, err := coorCli.GetStorageByName(coormq.ReqGetStorageByName(userID, name)) if err != nil { return nil, fmt.Errorf("request to coordinator: %w", err) } return &getResp.Storage, nil } func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID, storageID cdssdk.StorageID) (cdssdk.HubID, string, error) { coorCli, err := stgglb.CoordinatorMQPool.Acquire() if err != nil { return 0, "", fmt.Errorf("new coordinator client: %w", err) } defer stgglb.CoordinatorMQPool.Release(coorCli) stgResp, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{storageID})) if err != nil { return 0, "", fmt.Errorf("getting storage info: %w", err) } if stgResp.Storages[0].Storage.ShardStore == nil { return 0, "", fmt.Errorf("shard storage is not enabled") } agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storages[0].MasterHub.HubID) if err != nil { return 0, "", fmt.Errorf("new agent client: %w", err) } defer stgglb.AgentMQPool.Release(agentCli) startResp, err := agentCli.StartStorageLoadPackage(agtmq.NewStartStorageLoadPackage(userID, packageID, storageID)) if err != nil { return 0, "", fmt.Errorf("start storage load package: %w", err) } return stgResp.Storages[0].MasterHub.HubID, startResp.TaskID, nil } type StorageLoadPackageResult struct { PackagePath string LocalBase string RemoteBase string } func (svc *StorageService) WaitStorageLoadPackage(hubID cdssdk.HubID, taskID string, waitTimeout time.Duration) (bool, *StorageLoadPackageResult, error) { agentCli, err := stgglb.AgentMQPool.Acquire(hubID) if err != nil { // TODO 失败是否要当做任务已经结束? return true, nil, fmt.Errorf("new agent client: %w", err) } defer stgglb.AgentMQPool.Release(agentCli) waitResp, err := agentCli.WaitStorageLoadPackage(agtmq.NewWaitStorageLoadPackage(taskID, waitTimeout.Milliseconds())) if err != nil { // TODO 请求失败是否要当做任务已经结束? return true, nil, fmt.Errorf("wait storage load package: %w", err) } if !waitResp.IsComplete { return false, nil, nil } if waitResp.Error != "" { return true, nil, fmt.Errorf("%s", waitResp.Error) } return true, &StorageLoadPackageResult{ PackagePath: waitResp.PackagePath, LocalBase: waitResp.LocalBase, RemoteBase: waitResp.RemoteBase, }, nil } func (svc *StorageService) DeleteStoragePackage(userID int64, packageID int64, storageID int64) error { // TODO panic("not implement yet") } // 请求节点启动从Storage中上传文件的任务。会返回节点ID和任务ID 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() if err != nil { return 0, "", fmt.Errorf("new coordinator client: %w", err) } defer stgglb.CoordinatorMQPool.Release(coorCli) stgResp, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{storageID})) if err != nil { return 0, "", fmt.Errorf("getting storage info: %w", err) } if stgResp.Storages[0].Storage.ShardStore == nil { return 0, "", fmt.Errorf("shard storage is not enabled") } agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storages[0].MasterHub.HubID) if err != nil { return 0, "", fmt.Errorf("new agent client: %w", err) } defer stgglb.AgentMQPool.Release(agentCli) startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, storageAffinity)) if err != nil { return 0, "", fmt.Errorf("start storage upload package: %w", err) } return stgResp.Storages[0].MasterHub.HubID, startResp.TaskID, nil } 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 { // TODO 失败是否要当做任务已经结束? return true, 0, fmt.Errorf("new agent client: %w", err) } defer stgglb.AgentMQPool.Release(agentCli) waitResp, err := agentCli.WaitStorageCreatePackage(agtmq.NewWaitStorageCreatePackage(taskID, waitTimeout.Milliseconds())) if err != nil { // TODO 请求失败是否要当做任务已经结束? return true, 0, fmt.Errorf("wait storage upload package: %w", err) } if !waitResp.IsComplete { return false, 0, nil } if waitResp.Error != "" { return true, 0, fmt.Errorf("%s", waitResp.Error) } return true, waitResp.PackageID, nil }