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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package event
  2. import (
  3. "database/sql"
  4. "github.com/samber/lo"
  5. "gitlink.org.cn/cloudream/common/utils/logger"
  6. "gitlink.org.cn/cloudream/db/model"
  7. mysql "gitlink.org.cn/cloudream/db/sql"
  8. "gitlink.org.cn/cloudream/scanner/internal/config"
  9. agtcli "gitlink.org.cn/cloudream/rabbitmq/client/agent"
  10. agtmsg "gitlink.org.cn/cloudream/rabbitmq/message/agent"
  11. agttsk "gitlink.org.cn/cloudream/rabbitmq/message/agent/event"
  12. )
  13. type AgentCheckCache struct {
  14. NodeID int
  15. FileHashes []string // 需要检查的FileHash列表,如果为nil(不是为空),则代表进行全量检查
  16. }
  17. func NewAgentCheckCache(nodeID int, fileHashes []string) *AgentCheckCache {
  18. return &AgentCheckCache{
  19. NodeID: nodeID,
  20. FileHashes: fileHashes,
  21. }
  22. }
  23. func (t *AgentCheckCache) TryMerge(other Event) bool {
  24. event, ok := other.(*AgentCheckCache)
  25. if !ok {
  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. var isComplete bool
  38. var caches []model.Cache
  39. // TODO unavailable的节点需不需要发送任务?
  40. if t.FileHashes == nil {
  41. var err error
  42. caches, err = mysql.Cache.GetNodeCaches(execCtx.Args.DB.SQLCtx(), t.NodeID)
  43. if err != nil {
  44. logger.WithField("NodeID", t.NodeID).Warnf("get node caches failed, err: %s", err.Error())
  45. return
  46. }
  47. isComplete = true
  48. } else {
  49. for _, hash := range t.FileHashes {
  50. ch, err := mysql.Cache.Get(execCtx.Args.DB.SQLCtx(), hash, t.NodeID)
  51. // 记录不存在则跳过
  52. if err == sql.ErrNoRows {
  53. continue
  54. }
  55. if err != nil {
  56. logger.WithField("FileHash", hash).WithField("NodeID", t.NodeID).Warnf("get cache failed, err: %w", err)
  57. return
  58. }
  59. caches = append(caches, ch)
  60. }
  61. isComplete = false
  62. }
  63. // 然后向代理端发送移动文件的请求
  64. agentClient, err := agtcli.NewAgentClient(t.NodeID, &config.Cfg().RabbitMQ)
  65. if err != nil {
  66. logger.WithField("NodeID", t.NodeID).Warnf("create agent client failed, err: %s", err.Error())
  67. return
  68. }
  69. defer agentClient.Close()
  70. err = agentClient.PostEvent(agtmsg.NewPostEventBody(
  71. agttsk.NewCheckCache(isComplete, caches),
  72. execCtx.Option.IsEmergency, // 继承本任务的执行选项
  73. execCtx.Option.DontMerge))
  74. if err != nil {
  75. logger.WithField("NodeID", t.NodeID).Warnf("request to agent failed, err: %s", err.Error())
  76. return
  77. }
  78. }

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