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.

agent_check_storage.go 3.6 kB

2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package event
  2. import (
  3. "database/sql"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/logger"
  6. "gitlink.org.cn/cloudream/common/pkgs/mq"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/storage/common/consts"
  9. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/db2"
  11. "gitlink.org.cn/cloudream/storage/common/pkgs/db2/model"
  12. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  13. scevt "gitlink.org.cn/cloudream/storage/common/pkgs/mq/scanner/event"
  14. )
  15. type AgentCheckStorage struct {
  16. *scevt.AgentCheckStorage
  17. }
  18. func NewAgentCheckStorage(evt *scevt.AgentCheckStorage) *AgentCheckStorage {
  19. return &AgentCheckStorage{
  20. AgentCheckStorage: evt,
  21. }
  22. }
  23. func (t *AgentCheckStorage) TryMerge(other Event) bool {
  24. event, ok := other.(*AgentCheckStorage)
  25. if !ok {
  26. return false
  27. }
  28. if t.StorageID != event.StorageID {
  29. return false
  30. }
  31. return true
  32. }
  33. func (t *AgentCheckStorage) Execute(execCtx ExecuteContext) {
  34. log := logger.WithType[AgentCheckStorage]("Event")
  35. log.Debugf("begin with %v", logger.FormatStruct(t.AgentCheckStorage))
  36. defer log.Debugf("end")
  37. // 读取数据的地方就不加锁了,因为check任务会反复执行,单次失败问题不大
  38. stg, err := execCtx.Args.DB.Storage().GetByID(execCtx.Args.DB.DefCtx(), t.StorageID)
  39. if err != nil {
  40. if err != sql.ErrNoRows {
  41. log.WithField("StorageID", t.StorageID).Warnf("get storage failed, err: %s", err.Error())
  42. }
  43. return
  44. }
  45. hub, err := execCtx.Args.DB.Hub().GetByID(execCtx.Args.DB.DefCtx(), stg.MasterHub)
  46. if err != nil {
  47. if err != sql.ErrNoRows {
  48. log.WithField("StorageID", t.StorageID).Warnf("get storage hub failed, err: %s", err.Error())
  49. }
  50. return
  51. }
  52. if hub.State != consts.HubStateNormal {
  53. return
  54. }
  55. agtCli, err := stgglb.AgentMQPool.Acquire(stg.MasterHub)
  56. if err != nil {
  57. log.WithField("MasterHub", stg.MasterHub).Warnf("create agent client failed, err: %s", err.Error())
  58. return
  59. }
  60. defer stgglb.AgentMQPool.Release(agtCli)
  61. checkResp, err := agtCli.StorageCheck(agtmq.NewStorageCheck(stg.StorageID), mq.RequestOption{Timeout: time.Minute})
  62. if err != nil {
  63. log.WithField("MasterHub", stg.MasterHub).Warnf("checking storage: %s", err.Error())
  64. return
  65. }
  66. realPkgs := make(map[cdssdk.UserID]map[cdssdk.PackageID]bool)
  67. for _, pkg := range checkResp.Packages {
  68. pkgs, ok := realPkgs[pkg.UserID]
  69. if !ok {
  70. pkgs = make(map[cdssdk.PackageID]bool)
  71. realPkgs[pkg.UserID] = pkgs
  72. }
  73. pkgs[pkg.PackageID] = true
  74. }
  75. execCtx.Args.DB.DoTx(func(tx db2.SQLContext) error {
  76. packages, err := execCtx.Args.DB.StoragePackage().GetAllByStorageID(tx, t.StorageID)
  77. if err != nil {
  78. log.Warnf("getting storage package: %s", err.Error())
  79. return nil
  80. }
  81. var rms []model.StoragePackage
  82. for _, pkg := range packages {
  83. pkgMap, ok := realPkgs[pkg.UserID]
  84. if !ok {
  85. rms = append(rms, pkg)
  86. continue
  87. }
  88. if !pkgMap[pkg.PackageID] {
  89. rms = append(rms, pkg)
  90. }
  91. }
  92. rmdPkgIDs := make(map[cdssdk.PackageID]bool)
  93. for _, rm := range rms {
  94. err := execCtx.Args.DB.StoragePackage().Delete(tx, rm.StorageID, rm.PackageID, rm.UserID)
  95. if err != nil {
  96. log.Warnf("deleting storage package: %s", err.Error())
  97. continue
  98. }
  99. rmdPkgIDs[rm.PackageID] = true
  100. }
  101. // 彻底删除已经是Deleted状态,且不被再引用的Package
  102. for pkgID := range rmdPkgIDs {
  103. err := execCtx.Args.DB.Package().DeleteUnused(tx, pkgID)
  104. if err != nil {
  105. log.Warnf("deleting unused package: %s", err.Error())
  106. continue
  107. }
  108. }
  109. return nil
  110. })
  111. }
  112. func init() {
  113. RegisterMessageConvertor(NewAgentCheckStorage)
  114. }

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