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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package services
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  5. "time"
  6. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  7. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  8. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  9. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  10. )
  11. // StorageService 存储服务结构体,继承自Service结构体
  12. type StorageService struct {
  13. *Service
  14. }
  15. // StorageSvc 返回StorageService的实例
  16. func (svc *Service) StorageSvc() *StorageService {
  17. return &StorageService{Service: svc}
  18. }
  19. // StartStorageLoadPackage 开始加载存储包。
  20. // userID: 用户ID,用于标识请求的用户。
  21. // packageID: 包ID,用于标识需要加载的数据包。
  22. // storageID: 存储ID,用于标识数据存储的位置。
  23. // 返回值1: 节点ID,标识进行存储操作的节点。
  24. // 返回值2: 任务ID,标识加载数据包的任务。
  25. // 返回值3: 错误,如果执行过程中出现错误,则返回错误信息。
  26. func (svc *StorageService) StartStorageLoadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID, storageID cdssdk.StorageID) (cdssdk.NodeID, string, error) {
  27. // 获取协调器MQ客户端
  28. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  29. if err != nil {
  30. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  31. }
  32. defer stgglb.CoordinatorMQPool.Release(coorCli)
  33. // 从协调器获取存储信息
  34. stgResp, err := coorCli.GetStorageInfo(coormq.NewGetStorageInfo(userID, storageID))
  35. if err != nil {
  36. return 0, "", fmt.Errorf("getting storage info: %w", err)
  37. }
  38. // 获取代理MQ客户端
  39. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.NodeID)
  40. if err != nil {
  41. return 0, "", fmt.Errorf("new agent client: %w", err)
  42. }
  43. defer stgglb.AgentMQPool.Release(agentCli)
  44. // 向代理发送开始加载存储包的请求
  45. startResp, err := agentCli.StartStorageLoadPackage(agtmq.NewStartStorageLoadPackage(userID, packageID, storageID))
  46. if err != nil {
  47. return 0, "", fmt.Errorf("start storage load package: %w", err)
  48. }
  49. return stgResp.NodeID, startResp.TaskID, nil
  50. }
  51. /*
  52. WaitStorageLoadPackage 等待存储包加载完成。
  53. 参数:
  54. - nodeID:节点ID
  55. - taskID:任务ID
  56. - waitTimeout:等待超时时间
  57. 返回值:
  58. - bool:任务是否完成
  59. - string:错误信息
  60. - error:错误信息
  61. */
  62. func (svc *StorageService) WaitStorageLoadPackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, string, error) {
  63. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  64. if err != nil {
  65. // TODO 失败是否要当做任务已经结束?
  66. return true, "", fmt.Errorf("new agent client: %w", err)
  67. }
  68. defer stgglb.AgentMQPool.Release(agentCli)
  69. waitResp, err := agentCli.WaitStorageLoadPackage(agtmq.NewWaitStorageLoadPackage(taskID, waitTimeout.Milliseconds()))
  70. if err != nil {
  71. // TODO 请求失败是否要当做任务已经结束?
  72. return true, "", fmt.Errorf("wait storage load package: %w", err)
  73. }
  74. if !waitResp.IsComplete {
  75. return false, "", nil
  76. }
  77. if waitResp.Error != "" {
  78. return true, "", fmt.Errorf("%s", waitResp.Error)
  79. }
  80. return true, waitResp.FullPath, nil
  81. }
  82. // DeleteStoragePackage 删除存储包的函数,当前未实现。
  83. func (svc *StorageService) DeleteStoragePackage(userID int64, packageID int64, storageID int64) error {
  84. // TODO
  85. panic("not implement yet")
  86. }
  87. /*
  88. StartStorageCreatePackage 请求节点启动从Storage中上传文件的任务。
  89. 参数:
  90. - userID:用户ID
  91. - bucketID:存储桶ID
  92. - name:文件名
  93. - storageID:存储ID
  94. - path:文件路径
  95. - nodeAffinity:节点亲和性(可选)
  96. 返回值:
  97. - cdssdk.NodeID:节点ID
  98. - string:任务ID
  99. - error:错误信息
  100. */
  101. func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, nodeAffinity *cdssdk.NodeID) (cdssdk.NodeID, string, error) {
  102. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  103. if err != nil {
  104. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  105. }
  106. defer stgglb.CoordinatorMQPool.Release(coorCli)
  107. stgResp, err := coorCli.GetStorageInfo(coormq.NewGetStorageInfo(userID, storageID))
  108. if err != nil {
  109. return 0, "", fmt.Errorf("getting storage info: %w", err)
  110. }
  111. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.NodeID)
  112. if err != nil {
  113. return 0, "", fmt.Errorf("new agent client: %w", err)
  114. }
  115. defer stgglb.AgentMQPool.Release(agentCli)
  116. startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, nodeAffinity))
  117. if err != nil {
  118. return 0, "", fmt.Errorf("start storage upload package: %w", err)
  119. }
  120. return stgResp.NodeID, startResp.TaskID, nil
  121. }
  122. /*
  123. WaitStorageCreatePackage 等待存储包创建完成。
  124. 参数:
  125. - nodeID:节点ID
  126. - taskID:任务ID
  127. - waitTimeout:等待超时时间
  128. 返回值:
  129. - bool:任务是否完成
  130. - cdssdk.PackageID:包ID
  131. - error:错误信息
  132. */
  133. func (svc *StorageService) WaitStorageCreatePackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, cdssdk.PackageID, error) {
  134. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  135. if err != nil {
  136. // TODO 失败是否要当做任务已经结束?
  137. return true, 0, fmt.Errorf("new agent client: %w", err)
  138. }
  139. defer stgglb.AgentMQPool.Release(agentCli)
  140. waitResp, err := agentCli.WaitStorageCreatePackage(agtmq.NewWaitStorageCreatePackage(taskID, waitTimeout.Milliseconds()))
  141. if err != nil {
  142. // TODO 请求失败是否要当做任务已经结束?
  143. return true, 0, fmt.Errorf("wait storage upload package: %w", err)
  144. }
  145. if !waitResp.IsComplete {
  146. return false, 0, nil
  147. }
  148. if waitResp.Error != "" {
  149. return true, 0, fmt.Errorf("%s", waitResp.Error)
  150. }
  151. return true, waitResp.PackageID, nil
  152. }
  153. /*
  154. GetInfo 获取存储信息。
  155. 参数:
  156. - userID:用户ID
  157. - storageID:存储ID
  158. 返回值:
  159. -
  160. */
  161. func (svc *StorageService) GetInfo(userID cdssdk.UserID, storageID cdssdk.StorageID) (*model.Storage, error) {
  162. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  163. if err != nil {
  164. return nil, fmt.Errorf("new coordinator client: %w", err)
  165. }
  166. defer stgglb.CoordinatorMQPool.Release(coorCli)
  167. getResp, err := coorCli.GetStorageInfo(coormq.NewGetStorageInfo(userID, storageID))
  168. if err != nil {
  169. return nil, fmt.Errorf("request to coordinator: %w", err)
  170. }
  171. return &getResp.Storage, nil
  172. }

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