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_state.go 2.4 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package event
  2. import (
  3. "database/sql"
  4. "time"
  5. "github.com/samber/lo"
  6. "gitlink.org.cn/cloudream/common/consts"
  7. "gitlink.org.cn/cloudream/common/utils/logger"
  8. "gitlink.org.cn/cloudream/db/model"
  9. mysql "gitlink.org.cn/cloudream/db/sql"
  10. agtcli "gitlink.org.cn/cloudream/rabbitmq/client/agent"
  11. agtmsg "gitlink.org.cn/cloudream/rabbitmq/message/agent"
  12. agttsk "gitlink.org.cn/cloudream/rabbitmq/message/agent/event"
  13. "gitlink.org.cn/cloudream/scanner/internal/config"
  14. )
  15. type AgentCheckState struct {
  16. NodeIDs []int
  17. }
  18. func NewAgentCheckState(nodeIDs []int) AgentCheckState {
  19. return AgentCheckState{
  20. NodeIDs: nodeIDs,
  21. }
  22. }
  23. func (t *AgentCheckState) TryMerge(other Event) bool {
  24. event, ok := other.(*AgentCheckState)
  25. if !ok {
  26. return false
  27. }
  28. t.NodeIDs = lo.Union(t.NodeIDs, event.NodeIDs)
  29. return true
  30. }
  31. func (t *AgentCheckState) Execute(execCtx ExecuteContext) {
  32. for _, nodeID := range t.NodeIDs {
  33. node, err := mysql.Node.GetByID(execCtx.Args.DB.SQLCtx(), nodeID)
  34. if err == sql.ErrNoRows {
  35. continue
  36. }
  37. if err != nil {
  38. logger.WithField("NodeID", nodeID).Warnf("get node by id failed, err: %s", err.Error())
  39. continue
  40. }
  41. if node.State != consts.NODE_STATE_NORMAL {
  42. continue
  43. }
  44. // 检查上次上报时间,超时的设置为不可用
  45. if time.Since(node.LastReportTime) > time.Duration(config.Cfg().NodeUnavailableSeconds)*time.Second {
  46. err := mysql.Node.ChangeState(execCtx.Args.DB.SQLCtx(), nodeID, consts.NODE_STATE_UNAVAILABLE)
  47. if err != nil {
  48. logger.WithField("NodeID", nodeID).Warnf("set node state failed, err: %s", err.Error())
  49. continue
  50. }
  51. caches, err := mysql.Cache.GetNodeCaches(execCtx.Args.DB.SQLCtx(), nodeID)
  52. if err != nil {
  53. logger.WithField("NodeID", nodeID).Warnf("get node caches failed, err: %s", err.Error())
  54. continue
  55. }
  56. // 补充备份数
  57. execCtx.Executor.Post(NewCheckRepCount(lo.Map(caches, func(ch model.Cache, index int) string { return ch.HashValue })))
  58. continue
  59. }
  60. agentClient, err := agtcli.NewAgentClient(nodeID, &config.Cfg().RabbitMQ)
  61. if err != nil {
  62. logger.WithField("NodeID", nodeID).Warnf("create agent client failed, err: %s", err.Error())
  63. continue
  64. }
  65. defer agentClient.Close()
  66. // 紧急任务
  67. err = agentClient.PostEvent(agtmsg.NewPostEventBody(agttsk.NewCheckState(), true, true))
  68. if err != nil {
  69. logger.WithField("NodeID", nodeID).Warnf("request to agent failed, err: %s", err.Error())
  70. }
  71. }
  72. }

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