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

2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package mq
  2. import (
  3. "time"
  4. "gitlink.org.cn/cloudream/common/consts/errorcode"
  5. "gitlink.org.cn/cloudream/common/pkgs/logger"
  6. "gitlink.org.cn/cloudream/common/pkgs/mq"
  7. mytask "gitlink.org.cn/cloudream/storage/agent/internal/task"
  8. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  9. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  10. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  11. )
  12. func (svc *Service) StartStorageLoadPackage(msg *agtmq.StartStorageLoadPackage) (*agtmq.StartStorageLoadPackageResp, *mq.CodeMessage) {
  13. tsk := svc.taskManager.StartNew(mytask.NewStorageLoadPackage(msg.UserID, msg.PackageID, msg.StorageID))
  14. return mq.ReplyOK(agtmq.NewStartStorageLoadPackageResp(tsk.ID()))
  15. }
  16. func (svc *Service) WaitStorageLoadPackage(msg *agtmq.WaitStorageLoadPackage) (*agtmq.WaitStorageLoadPackageResp, *mq.CodeMessage) {
  17. logger.WithField("TaskID", msg.TaskID).Debugf("wait loading package")
  18. tsk := svc.taskManager.FindByID(msg.TaskID)
  19. if tsk == nil {
  20. return nil, mq.Failed(errorcode.TaskNotFound, "task not found")
  21. }
  22. if msg.WaitTimeoutMs == 0 {
  23. tsk.Wait()
  24. errMsg := ""
  25. if tsk.Error() != nil {
  26. errMsg = tsk.Error().Error()
  27. }
  28. loadTsk := tsk.Body().(*mytask.StorageLoadPackage)
  29. return mq.ReplyOK(agtmq.NewWaitStorageLoadPackageResp(true, errMsg, loadTsk.PackagePath, loadTsk.LocalBase, loadTsk.RemoteBase))
  30. } else {
  31. if tsk.WaitTimeout(time.Duration(msg.WaitTimeoutMs) * time.Millisecond) {
  32. errMsg := ""
  33. if tsk.Error() != nil {
  34. errMsg = tsk.Error().Error()
  35. }
  36. loadTsk := tsk.Body().(*mytask.StorageLoadPackage)
  37. return mq.ReplyOK(agtmq.NewWaitStorageLoadPackageResp(true, errMsg, loadTsk.PackagePath, loadTsk.LocalBase, loadTsk.RemoteBase))
  38. }
  39. return mq.ReplyOK(agtmq.NewWaitStorageLoadPackageResp(false, "", "", "", ""))
  40. }
  41. }
  42. func (svc *Service) StorageCheck(msg *agtmq.StorageCheck) (*agtmq.StorageCheckResp, *mq.CodeMessage) {
  43. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  44. if err != nil {
  45. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  46. }
  47. defer stgglb.CoordinatorMQPool.Release(coorCli)
  48. shared, err := svc.stgMgr.GetSharedStore(msg.StorageID)
  49. if err != nil {
  50. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  51. }
  52. loaded, err := shared.ListLoadedPackages()
  53. if err != nil {
  54. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  55. }
  56. return mq.ReplyOK(agtmq.NewStorageCheckResp(loaded))
  57. }
  58. func (svc *Service) StorageGC(msg *agtmq.StorageGC) (*agtmq.StorageGCResp, *mq.CodeMessage) {
  59. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  60. if err != nil {
  61. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  62. }
  63. defer stgglb.CoordinatorMQPool.Release(coorCli)
  64. shared, err := svc.stgMgr.GetSharedStore(msg.StorageID)
  65. if err != nil {
  66. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  67. }
  68. var loadeds []stgmod.LoadedPackageID
  69. for _, pkg := range msg.Packages {
  70. loadeds = append(loadeds, stgmod.LoadedPackageID{
  71. UserID: pkg.UserID,
  72. PackageID: pkg.PackageID,
  73. })
  74. }
  75. err = shared.PackageGC(loadeds)
  76. if err != nil {
  77. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  78. }
  79. return mq.ReplyOK(agtmq.RespStorageGC())
  80. }
  81. func (svc *Service) StartStorageCreatePackage(msg *agtmq.StartStorageCreatePackage) (*agtmq.StartStorageCreatePackageResp, *mq.CodeMessage) {
  82. return nil, mq.Failed(errorcode.OperationFailed, "not implemented")
  83. // coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  84. // if err != nil {
  85. // logger.Warnf("new coordinator client: %s", err.Error())
  86. // return nil, mq.Failed(errorcode.OperationFailed, "new coordinator client failed")
  87. // }
  88. // defer stgglb.CoordinatorMQPool.Release(coorCli)
  89. // getStg, err := coorCli.GetStorageDetails(coormq.ReqGetStorageDetails([]cdssdk.StorageID{msg.StorageID}))
  90. // if err != nil {
  91. // return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  92. // }
  93. // if getStg.Storages[0] == nil {
  94. // return nil, mq.Failed(errorcode.OperationFailed, "storage not found")
  95. // }
  96. // if getStg.Storages[0].Shared == nil {
  97. // return nil, mq.Failed(errorcode.OperationFailed, "storage has no shared storage")
  98. // }
  99. // fullPath := filepath.Clean(filepath.Join(getStg.Storages[0].Shared.LoadBase, msg.Path))
  100. // var uploadFilePathes []string
  101. // err = filepath.WalkDir(fullPath, func(fname string, fi os.DirEntry, err error) error {
  102. // if err != nil {
  103. // return nil
  104. // }
  105. // if !fi.IsDir() {
  106. // uploadFilePathes = append(uploadFilePathes, fname)
  107. // }
  108. // return nil
  109. // })
  110. // if err != nil {
  111. // logger.Warnf("opening directory %s: %s", fullPath, err.Error())
  112. // return nil, mq.Failed(errorcode.OperationFailed, "read directory failed")
  113. // }
  114. // objIter := iterator.NewUploadingObjectIterator(fullPath, uploadFilePathes)
  115. // tsk := svc.taskManager.StartNew(mytask.NewCreatePackage(msg.UserID, msg.BucketID, msg.Name, objIter, msg.StorageAffinity))
  116. // return mq.ReplyOK(agtmq.NewStartStorageCreatePackageResp(tsk.ID()))
  117. }
  118. func (svc *Service) WaitStorageCreatePackage(msg *agtmq.WaitStorageCreatePackage) (*agtmq.WaitStorageCreatePackageResp, *mq.CodeMessage) {
  119. tsk := svc.taskManager.FindByID(msg.TaskID)
  120. if tsk == nil {
  121. return nil, mq.Failed(errorcode.TaskNotFound, "task not found")
  122. }
  123. if msg.WaitTimeoutMs == 0 {
  124. tsk.Wait()
  125. } else if !tsk.WaitTimeout(time.Duration(msg.WaitTimeoutMs) * time.Millisecond) {
  126. return mq.ReplyOK(agtmq.NewWaitStorageCreatePackageResp(false, "", 0))
  127. }
  128. if tsk.Error() != nil {
  129. return mq.ReplyOK(agtmq.NewWaitStorageCreatePackageResp(true, tsk.Error().Error(), 0))
  130. }
  131. taskBody := tsk.Body().(*mytask.CreatePackage)
  132. return mq.ReplyOK(agtmq.NewWaitStorageCreatePackageResp(true, "", taskBody.Result.PackageID))
  133. }

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