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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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.GetStorageDetail(coormq.ReqGetStorageDetail(storageID))
  48. if err != nil {
  49. return 0, "", fmt.Errorf("getting storage info: %w", err)
  50. }
  51. if stgResp.Storage.Shard == nil {
  52. return 0, "", fmt.Errorf("shard storage is not enabled")
  53. }
  54. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storage.Shard.MasterHub)
  55. if err != nil {
  56. return 0, "", fmt.Errorf("new agent client: %w", err)
  57. }
  58. defer stgglb.AgentMQPool.Release(agentCli)
  59. startResp, err := agentCli.StartStorageLoadPackage(agtmq.NewStartStorageLoadPackage(userID, packageID, storageID))
  60. if err != nil {
  61. return 0, "", fmt.Errorf("start storage load package: %w", err)
  62. }
  63. return stgResp.Storage.Shard.MasterHub, startResp.TaskID, nil
  64. }
  65. type StorageLoadPackageResult struct {
  66. PackagePath string
  67. LocalBase string
  68. RemoteBase string
  69. }
  70. func (svc *StorageService) WaitStorageLoadPackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, *StorageLoadPackageResult, error) {
  71. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  72. if err != nil {
  73. // TODO 失败是否要当做任务已经结束?
  74. return true, nil, fmt.Errorf("new agent client: %w", err)
  75. }
  76. defer stgglb.AgentMQPool.Release(agentCli)
  77. waitResp, err := agentCli.WaitStorageLoadPackage(agtmq.NewWaitStorageLoadPackage(taskID, waitTimeout.Milliseconds()))
  78. if err != nil {
  79. // TODO 请求失败是否要当做任务已经结束?
  80. return true, nil, fmt.Errorf("wait storage load package: %w", err)
  81. }
  82. if !waitResp.IsComplete {
  83. return false, nil, nil
  84. }
  85. if waitResp.Error != "" {
  86. return true, nil, fmt.Errorf("%s", waitResp.Error)
  87. }
  88. return true, &StorageLoadPackageResult{
  89. PackagePath: waitResp.PackagePath,
  90. LocalBase: waitResp.LocalBase,
  91. RemoteBase: waitResp.RemoteBase,
  92. }, nil
  93. }
  94. func (svc *StorageService) DeleteStoragePackage(userID int64, packageID int64, storageID int64) error {
  95. // TODO
  96. panic("not implement yet")
  97. }
  98. // 请求节点启动从Storage中上传文件的任务。会返回节点ID和任务ID
  99. func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, nodeAffinity *cdssdk.NodeID) (cdssdk.NodeID, string, error) {
  100. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  101. if err != nil {
  102. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  103. }
  104. defer stgglb.CoordinatorMQPool.Release(coorCli)
  105. stgResp, err := coorCli.GetStorageDetail(coormq.ReqGetStorageDetail(storageID))
  106. if err != nil {
  107. return 0, "", fmt.Errorf("getting storage info: %w", err)
  108. }
  109. if stgResp.Storage.Shard == nil {
  110. return 0, "", fmt.Errorf("shard storage is not enabled")
  111. }
  112. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.Storage.Shard.MasterHub)
  113. if err != nil {
  114. return 0, "", fmt.Errorf("new agent client: %w", err)
  115. }
  116. defer stgglb.AgentMQPool.Release(agentCli)
  117. startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, nodeAffinity))
  118. if err != nil {
  119. return 0, "", fmt.Errorf("start storage upload package: %w", err)
  120. }
  121. return stgResp.Storage.Shard.MasterHub, startResp.TaskID, nil
  122. }
  123. func (svc *StorageService) WaitStorageCreatePackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, cdssdk.PackageID, error) {
  124. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  125. if err != nil {
  126. // TODO 失败是否要当做任务已经结束?
  127. return true, 0, fmt.Errorf("new agent client: %w", err)
  128. }
  129. defer stgglb.AgentMQPool.Release(agentCli)
  130. waitResp, err := agentCli.WaitStorageCreatePackage(agtmq.NewWaitStorageCreatePackage(taskID, waitTimeout.Milliseconds()))
  131. if err != nil {
  132. // TODO 请求失败是否要当做任务已经结束?
  133. return true, 0, fmt.Errorf("wait storage upload package: %w", err)
  134. }
  135. if !waitResp.IsComplete {
  136. return false, 0, nil
  137. }
  138. if waitResp.Error != "" {
  139. return true, 0, fmt.Errorf("%s", waitResp.Error)
  140. }
  141. return true, waitResp.PackageID, nil
  142. }

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