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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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) StartStorageLoadPackage(userID cdssdk.UserID, packageID cdssdk.PackageID, storageID cdssdk.StorageID) (cdssdk.NodeID, 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. stgResp, err := coorCli.GetStorageInfo(coormq.NewGetStorageInfo(userID, storageID))
  24. if err != nil {
  25. return 0, "", fmt.Errorf("getting storage info: %w", err)
  26. }
  27. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.NodeID)
  28. if err != nil {
  29. return 0, "", fmt.Errorf("new agent client: %w", err)
  30. }
  31. defer stgglb.AgentMQPool.Release(agentCli)
  32. startResp, err := agentCli.StartStorageLoadPackage(agtmq.NewStartStorageLoadPackage(userID, packageID, storageID))
  33. if err != nil {
  34. return 0, "", fmt.Errorf("start storage load package: %w", err)
  35. }
  36. return stgResp.NodeID, startResp.TaskID, nil
  37. }
  38. func (svc *StorageService) WaitStorageLoadPackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, string, error) {
  39. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  40. if err != nil {
  41. // TODO 失败是否要当做任务已经结束?
  42. return true, "", fmt.Errorf("new agent client: %w", err)
  43. }
  44. defer stgglb.AgentMQPool.Release(agentCli)
  45. waitResp, err := agentCli.WaitStorageLoadPackage(agtmq.NewWaitStorageLoadPackage(taskID, waitTimeout.Milliseconds()))
  46. if err != nil {
  47. // TODO 请求失败是否要当做任务已经结束?
  48. return true, "", fmt.Errorf("wait storage load 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, waitResp.FullPath, nil
  57. }
  58. func (svc *StorageService) DeleteStoragePackage(userID int64, packageID int64, storageID int64) error {
  59. // TODO
  60. panic("not implement yet")
  61. }
  62. // 请求节点启动从Storage中上传文件的任务。会返回节点ID和任务ID
  63. func (svc *StorageService) StartStorageCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, storageID cdssdk.StorageID, path string, nodeAffinity *cdssdk.NodeID) (cdssdk.NodeID, string, error) {
  64. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  65. if err != nil {
  66. return 0, "", fmt.Errorf("new coordinator client: %w", err)
  67. }
  68. defer stgglb.CoordinatorMQPool.Release(coorCli)
  69. stgResp, err := coorCli.GetStorageInfo(coormq.NewGetStorageInfo(userID, storageID))
  70. if err != nil {
  71. return 0, "", fmt.Errorf("getting storage info: %w", err)
  72. }
  73. agentCli, err := stgglb.AgentMQPool.Acquire(stgResp.NodeID)
  74. if err != nil {
  75. return 0, "", fmt.Errorf("new agent client: %w", err)
  76. }
  77. defer stgglb.AgentMQPool.Release(agentCli)
  78. startResp, err := agentCli.StartStorageCreatePackage(agtmq.NewStartStorageCreatePackage(userID, bucketID, name, storageID, path, nodeAffinity))
  79. if err != nil {
  80. return 0, "", fmt.Errorf("start storage upload package: %w", err)
  81. }
  82. return stgResp.NodeID, startResp.TaskID, nil
  83. }
  84. func (svc *StorageService) WaitStorageCreatePackage(nodeID cdssdk.NodeID, taskID string, waitTimeout time.Duration) (bool, cdssdk.PackageID, error) {
  85. agentCli, err := stgglb.AgentMQPool.Acquire(nodeID)
  86. if err != nil {
  87. // TODO 失败是否要当做任务已经结束?
  88. return true, 0, fmt.Errorf("new agent client: %w", err)
  89. }
  90. defer stgglb.AgentMQPool.Release(agentCli)
  91. waitResp, err := agentCli.WaitStorageCreatePackage(agtmq.NewWaitStorageCreatePackage(taskID, waitTimeout.Milliseconds()))
  92. if err != nil {
  93. // TODO 请求失败是否要当做任务已经结束?
  94. return true, 0, fmt.Errorf("wait storage upload package: %w", err)
  95. }
  96. if !waitResp.IsComplete {
  97. return false, 0, nil
  98. }
  99. if waitResp.Error != "" {
  100. return true, 0, fmt.Errorf("%s", waitResp.Error)
  101. }
  102. return true, waitResp.PackageID, nil
  103. }
  104. func (svc *StorageService) GetInfo(userID cdssdk.UserID, storageID cdssdk.StorageID) (*model.Storage, error) {
  105. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  106. if err != nil {
  107. return nil, fmt.Errorf("new coordinator client: %w", err)
  108. }
  109. defer stgglb.CoordinatorMQPool.Release(coorCli)
  110. getResp, err := coorCli.GetStorageInfo(coormq.NewGetStorageInfo(userID, storageID))
  111. if err != nil {
  112. return nil, fmt.Errorf("request to coordinator: %w", err)
  113. }
  114. return &getResp.Storage, nil
  115. }

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