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

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

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