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.

check_cache.go 3.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package event
  2. import (
  3. shell "github.com/ipfs/go-ipfs-api"
  4. "github.com/samber/lo"
  5. "gitlink.org.cn/cloudream/agent/internal/config"
  6. "gitlink.org.cn/cloudream/common/consts"
  7. evcst "gitlink.org.cn/cloudream/common/consts/event"
  8. "gitlink.org.cn/cloudream/common/utils/logger"
  9. "gitlink.org.cn/cloudream/db/model"
  10. agtevt "gitlink.org.cn/cloudream/rabbitmq/message/agent/event"
  11. scmsg "gitlink.org.cn/cloudream/rabbitmq/message/scanner"
  12. scevt "gitlink.org.cn/cloudream/rabbitmq/message/scanner/event"
  13. )
  14. type CheckCache struct {
  15. IsComplete bool
  16. Caches []model.Cache
  17. }
  18. func NewCheckCache(isComplete bool, caches []model.Cache) *CheckCache {
  19. return &CheckCache{
  20. IsComplete: isComplete,
  21. Caches: caches,
  22. }
  23. }
  24. func (t *CheckCache) TryMerge(other Event) bool {
  25. event, ok := other.(*CheckCache)
  26. if !ok {
  27. return false
  28. }
  29. if event.IsComplete {
  30. t.IsComplete = true
  31. t.Caches = event.Caches
  32. return true
  33. }
  34. if !t.IsComplete {
  35. t.Caches = append(t.Caches, event.Caches...)
  36. t.Caches = lo.UniqBy(t.Caches, func(ch model.Cache) string { return ch.HashValue })
  37. return true
  38. }
  39. return false
  40. }
  41. func (t *CheckCache) Execute(execCtx ExecuteContext) {
  42. filesMap, err := execCtx.Args.IPFS.GetPinnedFiles()
  43. if err != nil {
  44. logger.Warnf("get pinned files from ipfs failed, err: %s", err.Error())
  45. return
  46. }
  47. // TODO 根据锁定清单过滤被锁定的文件的记录
  48. if t.IsComplete {
  49. t.checkComplete(filesMap, execCtx)
  50. } else {
  51. t.checkIncrement(filesMap, execCtx)
  52. }
  53. }
  54. func (t *CheckCache) checkIncrement(filesMap map[string]shell.PinInfo, execCtx ExecuteContext) {
  55. for _, cache := range t.Caches {
  56. _, ok := filesMap[cache.HashValue]
  57. if ok {
  58. if cache.State == consts.CACHE_STATE_PINNED {
  59. // 不处理
  60. } else if cache.State == consts.CACHE_STATE_TEMP {
  61. execCtx.Args.IPFS.Unpin(cache.HashValue)
  62. }
  63. // 删除map中的记录,表示此记录已被检查过
  64. delete(filesMap, cache.HashValue)
  65. } else {
  66. if cache.State == consts.CACHE_STATE_PINNED {
  67. // 需要考虑此处是否是同步的过程
  68. execCtx.Args.IPFS.Pin(cache.HashValue)
  69. } else if cache.State == consts.CACHE_STATE_TEMP {
  70. // 不处理
  71. }
  72. }
  73. }
  74. // 增量情况下,不需要对filesMap中没检查的记录进行处理
  75. }
  76. func (t *CheckCache) checkComplete(filesMap map[string]shell.PinInfo, execCtx ExecuteContext) {
  77. for _, cache := range t.Caches {
  78. _, ok := filesMap[cache.HashValue]
  79. if ok {
  80. if cache.State == consts.CACHE_STATE_PINNED {
  81. // 不处理
  82. } else if cache.State == consts.CACHE_STATE_TEMP {
  83. execCtx.Args.IPFS.Unpin(cache.HashValue)
  84. }
  85. // 删除map中的记录,表示此记录已被检查过
  86. delete(filesMap, cache.HashValue)
  87. } else {
  88. if cache.State == consts.CACHE_STATE_PINNED {
  89. // 需要考虑此处是否是同步的过程
  90. execCtx.Args.IPFS.Pin(cache.HashValue)
  91. } else if cache.State == consts.CACHE_STATE_TEMP {
  92. // 不处理
  93. }
  94. }
  95. }
  96. var updateCacheOps []scevt.UpdateCacheEntry
  97. // map中剩下的数据是没有被遍历过,即Cache中没有记录的
  98. for hash, _ := range filesMap {
  99. updateCacheOps = append(updateCacheOps, scevt.NewUpdateCacheEntry(hash, evcst.UPDATE_CACHE_CREATE_TEMP))
  100. }
  101. execCtx.Args.Scanner.PostEvent(scmsg.NewPostEventBody(
  102. scevt.NewUpdateCache(config.Cfg().ID, updateCacheOps),
  103. execCtx.Option.IsEmergency,
  104. execCtx.Option.DontMerge,
  105. ))
  106. }
  107. func init() {
  108. Register(func(val agtevt.CheckCache) Event { return NewCheckCache(val.IsComplete, val.Caches) })
  109. }

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