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

2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. "gitlink.org.cn/cloudream/storage/common/consts"
  8. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  9. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  10. scevt "gitlink.org.cn/cloudream/storage/common/pkgs/mq/scanner/event"
  11. "gitlink.org.cn/cloudream/storage/scanner/internal/config"
  12. )
  13. // AgentCheckState 类封装了扫描器代理检查状态的事件。
  14. type AgentCheckState struct {
  15. *scevt.AgentCheckState
  16. }
  17. // NewAgentCheckState 创建一个新的AgentCheckState实例。
  18. // evt: 传入的AgentCheckState实例。
  19. // 返回: 新创建的AgentCheckState指针。
  20. func NewAgentCheckState(evt *scevt.AgentCheckState) *AgentCheckState {
  21. return &AgentCheckState{
  22. AgentCheckState: evt,
  23. }
  24. }
  25. // TryMerge 尝试合并当前事件与另一个事件。
  26. // other: 待合并的另一个事件。
  27. // 返回: 成功合并返回true,否则返回false。
  28. func (t *AgentCheckState) TryMerge(other Event) bool {
  29. event, ok := other.(*AgentCheckState)
  30. if !ok {
  31. return false
  32. }
  33. return t.NodeID == event.NodeID
  34. }
  35. // Execute 执行节点状态检查操作。
  36. // execCtx: 执行上下文,包含执行时所需的所有参数和环境。
  37. func (t *AgentCheckState) Execute(execCtx ExecuteContext) {
  38. log := logger.WithType[AgentCheckState]("Event")
  39. log.Debugf("begin with %v", logger.FormatStruct(t.AgentCheckState))
  40. defer log.Debugf("end")
  41. // 尝试根据节点ID获取节点信息
  42. node, err := execCtx.Args.DB.Node().GetByID(execCtx.Args.DB.SQLCtx(), t.NodeID)
  43. if err == sql.ErrNoRows {
  44. return
  45. }
  46. // 获取节点失败的处理
  47. if err != nil {
  48. log.WithField("NodeID", t.NodeID).Warnf("get node by id failed, err: %s", err.Error())
  49. return
  50. }
  51. // 获取代理客户端
  52. agtCli, err := stgglb.AgentMQPool.Acquire(t.NodeID)
  53. if err != nil {
  54. log.WithField("NodeID", t.NodeID).Warnf("create agent client failed, err: %s", err.Error())
  55. return
  56. }
  57. defer stgglb.AgentMQPool.Release(agtCli)
  58. // 向代理请求获取当前状态
  59. getResp, err := agtCli.GetState(agtmq.NewGetState(), mq.RequestOption{Timeout: time.Second * 30})
  60. if err != nil {
  61. log.WithField("NodeID", t.NodeID).Warnf("getting state: %s", err.Error())
  62. // 检查节点上次上报时间,若超时则设置节点为不可用状态
  63. if node.LastReportTime != nil && time.Since(*node.LastReportTime) > time.Duration(config.Cfg().NodeUnavailableSeconds)*time.Second {
  64. err := execCtx.Args.DB.Node().UpdateState(execCtx.Args.DB.SQLCtx(), t.NodeID, consts.NodeStateUnavailable)
  65. if err != nil {
  66. log.WithField("NodeID", t.NodeID).Warnf("set node state failed, err: %s", err.Error())
  67. }
  68. }
  69. return
  70. }
  71. // 根据代理返回的节点状态更新节点状态
  72. if getResp.IPFSState != consts.IPFSStateOK {
  73. log.WithField("NodeID", t.NodeID).Warnf("IPFS status is %s, set node state unavailable", getResp.IPFSState)
  74. err := execCtx.Args.DB.Node().UpdateState(execCtx.Args.DB.SQLCtx(), t.NodeID, consts.NodeStateUnavailable)
  75. if err != nil {
  76. log.WithField("NodeID", t.NodeID).Warnf("change node state failed, err: %s", err.Error())
  77. }
  78. return
  79. }
  80. // 更新节点状态为正常
  81. err = execCtx.Args.DB.Node().UpdateState(execCtx.Args.DB.SQLCtx(), t.NodeID, consts.NodeStateNormal)
  82. if err != nil {
  83. log.WithField("NodeID", t.NodeID).Warnf("change node state failed, err: %s", err.Error())
  84. }
  85. }
  86. // init 注册AgentCheckState消息转换器。
  87. func init() {
  88. RegisterMessageConvertor(NewAgentCheckState)
  89. }

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