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.6 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. type CacheService struct {
  11. *Service
  12. }
  13. func (svc *Service) CacheSvc() *CacheService {
  14. return &CacheService{Service: svc}
  15. }
  16. func (svc *CacheService) StartCacheMovePackage(userID cdssdk.UserID, packageID cdssdk.PackageID, stgID cdssdk.StorageID) (cdssdk.HubID, string, error) {
  17. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  18. if err != nil {
  19. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  20. }
  21. defer stgglb.CoordinatorMQPool.Release(coorCli)
  22. getStg, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{stgID}))
  23. if err != nil {
  24. return 0, "", fmt.Errorf("get storage detail: %w", err)
  25. }
  26. if getStg.Storages[0].Storage.ShardStore == nil {
  27. return 0, "", fmt.Errorf("shard storage is not enabled")
  28. }
  29. agentCli, err := stgglb.AgentMQPool.Acquire(getStg.Storages[0].MasterHub.HubID)
  30. if err != nil {
  31. return 0, "", fmt.Errorf("new agent client: %w", err)
  32. }
  33. defer stgglb.AgentMQPool.Release(agentCli)
  34. startResp, err := agentCli.StartCacheMovePackage(agtmq.NewStartCacheMovePackage(userID, packageID, stgID))
  35. if err != nil {
  36. return 0, "", fmt.Errorf("start cache move package: %w", err)
  37. }
  38. return getStg.Storages[0].MasterHub.HubID, startResp.TaskID, nil
  39. }
  40. func (svc *CacheService) WaitCacheMovePackage(hubID cdssdk.HubID, taskID string, waitTimeout time.Duration) (bool, error) {
  41. agentCli, err := stgglb.AgentMQPool.Acquire(hubID)
  42. if err != nil {
  43. return true, fmt.Errorf("new agent client: %w", err)
  44. }
  45. defer stgglb.AgentMQPool.Release(agentCli)
  46. waitResp, err := agentCli.WaitCacheMovePackage(agtmq.NewWaitCacheMovePackage(taskID, waitTimeout.Milliseconds()))
  47. if err != nil {
  48. return true, fmt.Errorf("wait cache move package: %w", err)
  49. }
  50. if !waitResp.IsComplete {
  51. return false, nil
  52. }
  53. if waitResp.Error != "" {
  54. return true, fmt.Errorf("%s", waitResp.Error)
  55. }
  56. return true, nil
  57. }
  58. func (svc *CacheService) CacheRemovePackage(packageID cdssdk.PackageID, stgID cdssdk.StorageID) error {
  59. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  60. if err != nil {
  61. return fmt.Errorf("new agent client: %w", err)
  62. }
  63. defer stgglb.CoordinatorMQPool.Release(coorCli)
  64. _, err = coorCli.CacheRemovePackage(coormq.ReqCacheRemoveMovedPackage(packageID, stgID))
  65. if err != nil {
  66. return fmt.Errorf("requesting to coordinator: %w", err)
  67. }
  68. return nil
  69. }

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