You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cache.go 2.9 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package services
  2. import (
  3. "fmt"
  4. "time"
  5. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  6. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  7. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  8. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  9. )
  10. // CacheService 缓存服务结构体,继承自Service。
  11. type CacheService struct {
  12. *Service
  13. }
  14. // CacheSvc 创建并返回一个CacheService的实例。
  15. func (svc *Service) CacheSvc() *CacheService {
  16. return &CacheService{Service: svc}
  17. }
  18. // StartCacheMovePackage 启动缓存移动包的流程。
  19. // userID: 用户标识符;
  20. // packageID: 包标识符;
  21. // nodeID: 节点标识符;
  22. // 返回任务ID和可能的错误。
  23. func (svc *CacheService) StartCacheMovePackage(userID cdssdk.UserID, packageID cdssdk.PackageID, nodeID cdssdk.NodeID) (string, error) {
  24. // 获取Agent消息队列客户端
  25. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  26. if err != nil {
  27. return "", fmt.Errorf("new agent client: %w", err)
  28. }
  29. defer stgglb.AgentMQPool.Release(agentCli)
  30. // 向Agent发起启动缓存移动包的请求
  31. startResp, err := agentCli.StartCacheMovePackage(agtmq.NewStartCacheMovePackage(userID, packageID))
  32. if err != nil {
  33. return "", fmt.Errorf("start cache move package: %w", err)
  34. }
  35. return startResp.TaskID, nil
  36. }
  37. // WaitCacheMovePackage 等待缓存移动包完成。
  38. // nodeID: 节点标识符;
  39. // taskID: 任务标识符;
  40. // waitTimeout: 等待超时时间;
  41. // 返回任务是否完成和可能的错误。
  42. func (svc *CacheService) WaitCacheMovePackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, error) {
  43. // 获取Agent消息队列客户端
  44. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  45. if err != nil {
  46. return true, fmt.Errorf("new agent client: %w", err)
  47. }
  48. defer stgglb.AgentMQPool.Release(agentCli)
  49. // 向Agent查询缓存移动包状态
  50. waitResp, err := agentCli.WaitCacheMovePackage(agtmq.NewWaitCacheMovePackage(taskID, waitTimeout.Milliseconds()))
  51. if err != nil {
  52. return true, fmt.Errorf("wait cache move package: %w", err)
  53. }
  54. if !waitResp.IsComplete {
  55. return false, nil
  56. }
  57. if waitResp.Error != "" {
  58. return true, fmt.Errorf("%s", waitResp.Error)
  59. }
  60. return true, nil
  61. }
  62. // CacheRemovePackage 请求移除缓存包。
  63. // packageID: 包标识符;
  64. // nodeID: 节点标识符;
  65. // 返回可能的错误。
  66. func (svc *CacheService) CacheRemovePackage(packageID cdssdk.PackageID, nodeID cdssdk.NodeID) error {
  67. // 获取协调器消息队列客户端
  68. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  69. if err != nil {
  70. return fmt.Errorf("new agent client: %w", err)
  71. }
  72. defer stgglb.CoordinatorMQPool.Release(coorCli)
  73. // 向协调器发送移除缓存包的请求
  74. _, err = coorCli.CacheRemovePackage(coormq.ReqCacheRemoveMovedPackage(packageID, nodeID))
  75. if err != nil {
  76. return fmt.Errorf("requesting to coordinator: %w", err)
  77. }
  78. return nil
  79. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。