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_cache.go 3.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package event
  2. import (
  3. "database/sql"
  4. "github.com/samber/lo"
  5. "gitlink.org.cn/cloudream/common/pkg/logger"
  6. "gitlink.org.cn/cloudream/db/model"
  7. "gitlink.org.cn/cloudream/scanner/internal/config"
  8. agtcli "gitlink.org.cn/cloudream/rabbitmq/client/agent"
  9. agtmsg "gitlink.org.cn/cloudream/rabbitmq/message/agent"
  10. scevt "gitlink.org.cn/cloudream/rabbitmq/message/scanner/event"
  11. )
  12. type AgentCheckCache struct {
  13. scevt.AgentCheckCache
  14. }
  15. func NewAgentCheckCache(nodeID int, fileHashes []string) *AgentCheckCache {
  16. return &AgentCheckCache{
  17. AgentCheckCache: scevt.NewAgentCheckCache(nodeID, fileHashes),
  18. }
  19. }
  20. func (t *AgentCheckCache) TryMerge(other Event) bool {
  21. event, ok := other.(*AgentCheckCache)
  22. if !ok {
  23. return false
  24. }
  25. if event.NodeID != t.NodeID {
  26. return false
  27. }
  28. // FileHashes为nil时代表全量检查
  29. if event.FileHashes == nil {
  30. t.FileHashes = nil
  31. } else if t.FileHashes != nil {
  32. t.FileHashes = lo.Union(t.FileHashes, event.FileHashes)
  33. }
  34. return true
  35. }
  36. func (t *AgentCheckCache) Execute(execCtx ExecuteContext) {
  37. log := logger.WithType[AgentCheckCache]("Event")
  38. log.Debugf("begin with %v", logger.FormatStruct(t))
  39. var isComplete bool
  40. var caches []model.Cache
  41. // TODO unavailable的节点需不需要发送任务?
  42. if t.FileHashes == nil {
  43. var err error
  44. caches, err = execCtx.Args.DB.Cache().GetNodeCaches(execCtx.Args.DB.SQLCtx(), t.NodeID)
  45. if err != nil {
  46. log.WithField("NodeID", t.NodeID).Warnf("get node caches failed, err: %s", err.Error())
  47. return
  48. }
  49. isComplete = true
  50. } else {
  51. for _, hash := range t.FileHashes {
  52. ch, err := execCtx.Args.DB.Cache().Get(execCtx.Args.DB.SQLCtx(), hash, t.NodeID)
  53. // 记录不存在则跳过
  54. if err == sql.ErrNoRows {
  55. continue
  56. }
  57. if err != nil {
  58. log.WithField("FileHash", hash).WithField("NodeID", t.NodeID).Warnf("get cache failed, err: %s", err.Error())
  59. return
  60. }
  61. caches = append(caches, ch)
  62. }
  63. isComplete = false
  64. }
  65. // 然后向代理端发送移动文件的请求
  66. agentClient, err := agtcli.NewClient(t.NodeID, &config.Cfg().RabbitMQ)
  67. if err != nil {
  68. log.WithField("NodeID", t.NodeID).Warnf("create agent client failed, err: %s", err.Error())
  69. return
  70. }
  71. defer agentClient.Close()
  72. checkResp, err := agentClient.CheckIPFS(agtmsg.NewCheckIPFSBody(isComplete, caches))
  73. if err != nil {
  74. log.WithField("NodeID", t.NodeID).Warnf("request to agent failed, err: %s", err.Error())
  75. return
  76. }
  77. if checkResp.IsFailed() {
  78. log.WithField("NodeID", t.NodeID).Warnf("agent operation failed, err: %s", err.Error())
  79. return
  80. }
  81. // 根据返回结果修改数据库
  82. for _, entry := range checkResp.Body.Entries {
  83. switch entry.Operation {
  84. case agtmsg.CHECK_IPFS_RESP_OP_DELETE_TEMP:
  85. err := execCtx.Args.DB.Cache().DeleteTemp(execCtx.Args.DB.SQLCtx(), entry.FileHash, t.NodeID)
  86. if err != nil {
  87. log.WithField("FileHash", entry.FileHash).
  88. WithField("NodeID", t.NodeID).
  89. Warnf("delete temp cache failed, err: %s", err.Error())
  90. }
  91. log.WithField("FileHash", entry.FileHash).
  92. WithField("NodeID", t.NodeID).
  93. Debugf("delete temp cache")
  94. case agtmsg.CHECK_IPFS_RESP_OP_CREATE_TEMP:
  95. err := execCtx.Args.DB.Cache().CreateTemp(execCtx.Args.DB.SQLCtx(), entry.FileHash, t.NodeID)
  96. if err != nil {
  97. log.WithField("FileHash", entry.FileHash).
  98. WithField("NodeID", t.NodeID).
  99. Warnf("create temp cache failed, err: %s", err.Error())
  100. }
  101. log.WithField("FileHash", entry.FileHash).
  102. WithField("NodeID", t.NodeID).
  103. Debugf("create temp cache")
  104. }
  105. }
  106. }
  107. func init() {
  108. RegisterMessageConvertor(func(msg scevt.AgentCheckCache) Event { return NewAgentCheckCache(msg.NodeID, msg.FileHashes) })
  109. }

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