140 lines
4.6 KiB
Go
140 lines
4.6 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
|
|
|
|
stgglb "gitlink.org.cn/cloudream/storage/common/globals"
|
|
"gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
|
|
"gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
|
|
coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
|
|
)
|
|
|
|
// PackageService 提供对包相关操作的服务接口
|
|
type PackageService struct {
|
|
*Service
|
|
}
|
|
|
|
// PackageSvc 创建并返回一个PackageService的实例
|
|
func (svc *Service) PackageSvc() *PackageService {
|
|
return &PackageService{Service: svc}
|
|
}
|
|
|
|
// Get 获取指定用户的指定包信息
|
|
func (svc *PackageService) Get(userID cdssdk.UserID, packageID cdssdk.PackageID) (*model.Package, error) {
|
|
// 从协调器MQ池中获取客户端
|
|
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.GetPackage(coormq.NewGetPackage(userID, packageID))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("requsting to coodinator: %w", err)
|
|
}
|
|
|
|
return &getResp.Package, nil
|
|
}
|
|
|
|
// Create 创建一个新的包
|
|
func (svc *PackageService) Create(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string) (cdssdk.PackageID, error) {
|
|
// 从协调器MQ池中获取客户端
|
|
coorCli, err := stgglb.CoordinatorMQPool.Acquire()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("new coordinator client: %w", err)
|
|
}
|
|
defer stgglb.CoordinatorMQPool.Release(coorCli)
|
|
|
|
// 向协调器发送创建包的请求
|
|
resp, err := coorCli.CreatePackage(coormq.NewCreatePackage(userID, bucketID, name))
|
|
if err != nil {
|
|
return 0, fmt.Errorf("creating package: %w", err)
|
|
}
|
|
|
|
return resp.PackageID, nil
|
|
}
|
|
|
|
// DownloadPackage 下载指定包的内容
|
|
func (svc *PackageService) DownloadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID) (iterator.DownloadingObjectIterator, error) {
|
|
// 从协调器MQ池中获取客户端
|
|
coorCli, err := stgglb.CoordinatorMQPool.Acquire()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("new coordinator client: %w", err)
|
|
}
|
|
defer stgglb.CoordinatorMQPool.Release(coorCli)
|
|
|
|
// 向协调器请求获取包内对象的详情
|
|
getObjsResp, err := coorCli.GetPackageObjectDetails(coormq.NewGetPackageObjectDetails(packageID))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("getting package object details: %w", err)
|
|
}
|
|
|
|
// 创建下载对象的迭代器
|
|
iter := iterator.NewDownloadObjectIterator(getObjsResp.Objects, &iterator.DownloadContext{
|
|
Distlock: svc.DistLock,
|
|
})
|
|
|
|
return iter, nil
|
|
}
|
|
|
|
// DeletePackage 删除指定的包
|
|
func (svc *PackageService) DeletePackage(userID cdssdk.UserID, packageID cdssdk.PackageID) error {
|
|
// 从协调器MQ池中获取客户端
|
|
coorCli, err := stgglb.CoordinatorMQPool.Acquire()
|
|
if err != nil {
|
|
return fmt.Errorf("new coordinator client: %w", err)
|
|
}
|
|
defer stgglb.CoordinatorMQPool.Release(coorCli)
|
|
|
|
// 向协调器发送删除包的请求
|
|
_, err = coorCli.DeletePackage(coormq.NewDeletePackage(userID, packageID))
|
|
if err != nil {
|
|
return fmt.Errorf("deleting package: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetCachedNodes 获取指定包的缓存节点信息
|
|
func (svc *PackageService) GetCachedNodes(userID cdssdk.UserID, packageID cdssdk.PackageID) (cdssdk.PackageCachingInfo, error) {
|
|
// 从协调器MQ池中获取客户端
|
|
coorCli, err := stgglb.CoordinatorMQPool.Acquire()
|
|
if err != nil {
|
|
return cdssdk.PackageCachingInfo{}, fmt.Errorf("new coordinator client: %w", err)
|
|
}
|
|
defer stgglb.CoordinatorMQPool.Release(coorCli)
|
|
|
|
// 向协调器请求获取包的缓存节点信息
|
|
resp, err := coorCli.GetPackageCachedNodes(coormq.NewGetPackageCachedNodes(userID, packageID))
|
|
if err != nil {
|
|
return cdssdk.PackageCachingInfo{}, fmt.Errorf("get package cached nodes: %w", err)
|
|
}
|
|
|
|
// 构造并返回缓存信息
|
|
tmp := cdssdk.PackageCachingInfo{
|
|
NodeInfos: resp.NodeInfos,
|
|
PackageSize: resp.PackageSize,
|
|
}
|
|
return tmp, nil
|
|
}
|
|
|
|
// GetLoadedNodes 获取指定包加载的节点列表
|
|
func (svc *PackageService) GetLoadedNodes(userID cdssdk.UserID, packageID cdssdk.PackageID) ([]cdssdk.NodeID, error) {
|
|
// 从协调器MQ池中获取客户端
|
|
coorCli, err := stgglb.CoordinatorMQPool.Acquire()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("new coordinator client: %w", err)
|
|
}
|
|
defer stgglb.CoordinatorMQPool.Release(coorCli)
|
|
|
|
// 向协调器请求获取加载指定包的节点ID列表
|
|
resp, err := coorCli.GetPackageLoadedNodes(coormq.NewGetPackageLoadedNodes(userID, packageID))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get package loaded nodes: %w", err)
|
|
}
|
|
return resp.NodeIDs, nil
|
|
}
|