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.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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/pkg/logger"
  8. "gitlink.org.cn/cloudream/db/model"
  9. agtcli "gitlink.org.cn/cloudream/rabbitmq/client/agent"
  10. agtmsg "gitlink.org.cn/cloudream/rabbitmq/message/agent"
  11. scevt "gitlink.org.cn/cloudream/rabbitmq/message/scanner/event"
  12. "gitlink.org.cn/cloudream/scanner/internal/config"
  13. )
  14. type AgentCheckState struct {
  15. scevt.AgentCheckState
  16. }
  17. func NewAgentCheckState(nodeID int) *AgentCheckState {
  18. return &AgentCheckState{
  19. AgentCheckState: scevt.NewAgentCheckState(nodeID),
  20. }
  21. }
  22. func (t *AgentCheckState) TryMerge(other Event) bool {
  23. event, ok := other.(*AgentCheckState)
  24. if !ok {
  25. return false
  26. }
  27. return t.NodeID == event.NodeID
  28. }
  29. func (t *AgentCheckState) Execute(execCtx ExecuteContext) {
  30. log := logger.WithType[AgentCheckState]("Event")
  31. log.Debugf("begin with %v", logger.FormatStruct(t))
  32. node, err := execCtx.Args.DB.Node().GetByID(execCtx.Args.DB.SQLCtx(), t.NodeID)
  33. if err == sql.ErrNoRows {
  34. return
  35. }
  36. if err != nil {
  37. log.WithField("NodeID", t.NodeID).Warnf("get node by id failed, err: %s", err.Error())
  38. return
  39. }
  40. if node.State != consts.NODE_STATE_NORMAL {
  41. return
  42. }
  43. // 检查上次上报时间,超时的设置为不可用
  44. // TODO 没有上报过是否要特殊处理?
  45. if node.LastReportTime == nil && time.Since(*node.LastReportTime) > time.Duration(config.Cfg().NodeUnavailableSeconds)*time.Second {
  46. err := execCtx.Args.DB.Node().ChangeState(execCtx.Args.DB.SQLCtx(), t.NodeID, consts.NODE_STATE_UNAVAILABLE)
  47. if err != nil {
  48. log.WithField("NodeID", t.NodeID).Warnf("set node state failed, err: %s", err.Error())
  49. return
  50. }
  51. caches, err := execCtx.Args.DB.Cache().GetNodeCaches(execCtx.Args.DB.SQLCtx(), t.NodeID)
  52. if err != nil {
  53. log.WithField("NodeID", t.NodeID).Warnf("get node caches failed, err: %s", err.Error())
  54. return
  55. }
  56. // 补充备份数
  57. execCtx.Executor.Post(NewCheckRepCount(lo.Map(caches, func(ch model.Cache, index int) string { return ch.FileHash })))
  58. return
  59. }
  60. agentClient, err := agtcli.NewClient(t.NodeID, &config.Cfg().RabbitMQ)
  61. if err != nil {
  62. log.WithField("NodeID", t.NodeID).Warnf("create agent client failed, err: %s", err.Error())
  63. return
  64. }
  65. defer agentClient.Close()
  66. getResp, err := agentClient.GetState(agtmsg.NewGetStateBody())
  67. if err != nil {
  68. log.WithField("NodeID", t.NodeID).Warnf("request to agent failed, err: %s", err.Error())
  69. }
  70. if getResp.IsFailed() {
  71. log.WithField("NodeID", t.NodeID).Warnf("agent operation failed, err: %s", err.Error())
  72. return
  73. }
  74. // 根据返回结果修改节点状态
  75. if getResp.Body.IPFSState != consts.IPFS_STATE_OK {
  76. log.WithField("NodeID", t.NodeID).Warnf("IPFS status is %s, set node state unavailable", getResp.Body.IPFSState)
  77. err := execCtx.Args.DB.Node().ChangeState(execCtx.Args.DB.SQLCtx(), t.NodeID, consts.NODE_STATE_UNAVAILABLE)
  78. if err != nil {
  79. log.WithField("NodeID", t.NodeID).Warnf("change node state failed, err: %s", err.Error())
  80. }
  81. return
  82. }
  83. // TODO 如果以后还有其他的状态,要判断哪些状态下能设置Normal
  84. err = execCtx.Args.DB.Node().ChangeState(execCtx.Args.DB.SQLCtx(), t.NodeID, consts.NODE_STATE_NORMAL)
  85. if err != nil {
  86. log.WithField("NodeID", t.NodeID).Warnf("change node state failed, err: %s", err.Error())
  87. }
  88. }
  89. func init() {
  90. RegisterMessageConvertor(func(msg scevt.AgentCheckState) Event { return NewAgentCheckState(msg.NodeID) })
  91. }

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