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.

storage.go 5.6 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  8. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  9. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  10. )
  11. type StorageService struct {
  12. *Service
  13. }
  14. func (svc *Service) StorageSvc() *StorageService {
  15. return &StorageService{Service: svc}
  16. }
  17. func (svc *StorageService) Get(userID cdssdk.UserID, storageID cdssdk.StorageID) (*model.Storage, error) {
  18. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  19. if err != nil {
  20. return nil, fmt.Errorf("new coordinator client: %w", err)
  21. }
  22. defer stgglb.CoordinatorMQPool.Release(coorCli)
  23. getResp, err := coorCli.GetStorage(coormq.ReqGetStorage(userID, storageID))
  24. if err != nil {
  25. return nil, fmt.Errorf("request to coordinator: %w", err)
  26. }
  27. return &getResp.Storage, nil
  28. }
  29. func (svc *StorageService) GetByName(userID cdssdk.UserID, name string) (*model.Storage, error) {
  30. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  31. if err != nil {
  32. return nil, fmt.Errorf("new coordinator client: %w", err)
  33. }
  34. defer stgglb.CoordinatorMQPool.Release(coorCli)
  35. getResp, err := coorCli.GetStorageByName(coormq.ReqGetStorageByName(userID, name))
  36. if err != nil {
  37. return nil, fmt.Errorf("request to coordinator: %w", err)
  38. }
  39. return &getResp.Storage, nil
  40. }
  41. func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID, storageID cdssdk.StorageID) (cdssdk.NodeID, string, error) {
  42. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  43. if err != nil {
  44. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  45. }
  46. defer stgglb.CoordinatorMQPool.Release(coorCli)
  47. stgResp, err := coorCli.GetStorage(coormq.ReqGetStorage(userID, storageID))
  48. if err != nil {
  49. return 0, "", fmt.Errorf("getting storage info: %w", err)
  50. }
  51. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storage.NodeID)
  52. if err != nil {
  53. return 0, "", fmt.Errorf("new agent client: %w", err)
  54. }
  55. defer stgglb.AgentMQPool.Release(agentCli)
  56. startResp, err := agentCli.StartStorageLoadPackage(agtmq.NewStartStorageLoadPackage(userID, packageID, storageID))
  57. if err != nil {
  58. return 0, "", fmt.Errorf("start storage load package: %w", err)
  59. }
  60. return stgResp.Storage.NodeID, startResp.TaskID, nil
  61. }
  62. type StorageLoadPackageResult struct {
  63. PackagePath string
  64. LocalBase string
  65. RemoteBase string
  66. }
  67. func (svc *StorageService) WaitStorageLoadPackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, *StorageLoadPackageResult, error) {
  68. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  69. if err != nil {
  70. // TODO 失败是否要当做任务已经结束?
  71. return true, nil, fmt.Errorf("new agent client: %w", err)
  72. }
  73. defer stgglb.AgentMQPool.Release(agentCli)
  74. waitResp, err := agentCli.WaitStorageLoadPackage(agtmq.NewWaitStorageLoadPackage(taskID, waitTimeout.Milliseconds()))
  75. if err != nil {
  76. // TODO 请求失败是否要当做任务已经结束?
  77. return true, nil, fmt.Errorf("wait storage load package: %w", err)
  78. }
  79. if !waitResp.IsComplete {
  80. return false, nil, nil
  81. }
  82. if waitResp.Error != "" {
  83. return true, nil, fmt.Errorf("%s", waitResp.Error)
  84. }
  85. return true, &StorageLoadPackageResult{
  86. PackagePath: waitResp.PackagePath,
  87. LocalBase: waitResp.LocalBase,
  88. RemoteBase: waitResp.RemoteBase,
  89. }, nil
  90. }
  91. func (svc *StorageService) DeleteStoragePackage(userID int64, packageID int64, storageID int64) error {
  92. // TODO
  93. panic("not implement yet")
  94. }
  95. // 请求节点启动从Storage中上传文件的任务。会返回节点ID和任务ID
  96. func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, nodeAffinity *cdssdk.NodeID) (cdssdk.NodeID, string, error) {
  97. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  98. if err != nil {
  99. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  100. }
  101. defer stgglb.CoordinatorMQPool.Release(coorCli)
  102. stgResp, err := coorCli.GetStorage(coormq.ReqGetStorage(userID, storageID))
  103. if err != nil {
  104. return 0, "", fmt.Errorf("getting storage info: %w", err)
  105. }
  106. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storage.NodeID)
  107. if err != nil {
  108. return 0, "", fmt.Errorf("new agent client: %w", err)
  109. }
  110. defer stgglb.AgentMQPool.Release(agentCli)
  111. startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, nodeAffinity))
  112. if err != nil {
  113. return 0, "", fmt.Errorf("start storage upload package: %w", err)
  114. }
  115. return stgResp.Storage.NodeID, startResp.TaskID, nil
  116. }
  117. func (svc *StorageService) WaitStorageCreatePackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, cdssdk.PackageID, error) {
  118. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  119. if err != nil {
  120. // TODO 失败是否要当做任务已经结束?
  121. return true, 0, fmt.Errorf("new agent client: %w", err)
  122. }
  123. defer stgglb.AgentMQPool.Release(agentCli)
  124. waitResp, err := agentCli.WaitStorageCreatePackage(agtmq.NewWaitStorageCreatePackage(taskID, waitTimeout.Milliseconds()))
  125. if err != nil {
  126. // TODO 请求失败是否要当做任务已经结束?
  127. return true, 0, fmt.Errorf("wait storage upload package: %w", err)
  128. }
  129. if !waitResp.IsComplete {
  130. return false, 0, nil
  131. }
  132. if waitResp.Error != "" {
  133. return true, 0, fmt.Errorf("%s", waitResp.Error)
  134. }
  135. return true, waitResp.PackageID, nil
  136. }

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