|
- package task
-
- import (
- "database/sql"
- "time"
-
- "github.com/samber/lo"
- "gitlink.org.cn/cloudream/common/consts"
- "gitlink.org.cn/cloudream/db/model"
- mysql "gitlink.org.cn/cloudream/db/sql"
- agtcli "gitlink.org.cn/cloudream/rabbitmq/client/agent"
- agtmsg "gitlink.org.cn/cloudream/rabbitmq/message/agent"
- agttsk "gitlink.org.cn/cloudream/rabbitmq/message/agent/task"
- "gitlink.org.cn/cloudream/scanner/internal/config"
- "gitlink.org.cn/cloudream/utils/logger"
- )
-
- type AgentCheckStateTask struct {
- NodeIDs []int
- }
-
- func NewAgentCheckStateTask(nodeIDs []int) AgentCheckStateTask {
- return AgentCheckStateTask{
- NodeIDs: nodeIDs,
- }
- }
-
- func (t *AgentCheckStateTask) TryMerge(other Task) bool {
- chkTask, ok := other.(*AgentCheckStateTask)
- if !ok {
- return false
- }
-
- t.NodeIDs = lo.Union(t.NodeIDs, chkTask.NodeIDs)
- return true
- }
-
- func (t *AgentCheckStateTask) Execute(execCtx *ExecuteContext, execOpts ExecuteOption) {
- for _, nodeID := range t.NodeIDs {
- node, err := mysql.Node.GetByID(execCtx.DB.SQLCtx(), nodeID)
- if err == sql.ErrNoRows {
- continue
- }
-
- if err != nil {
- logger.WithField("NodeID", nodeID).Warnf("get node by id failed, err: %s", err.Error())
- continue
- }
-
- if node.State != consts.NODE_STATE_NORMAL {
- continue
- }
-
- // 检查上次上报时间,超时的设置为不可用
- if time.Since(node.LastReportTime) > time.Duration(config.Cfg().NodeUnavailableSeconds)*time.Second {
- err := mysql.Node.ChangeState(execCtx.DB.SQLCtx(), nodeID, consts.NODE_STATE_UNAVAILABLE)
- if err != nil {
- logger.WithField("NodeID", nodeID).Warnf("set node state failed, err: %s", err.Error())
- continue
- }
-
- caches, err := mysql.Cache.GetNodeCaches(execCtx.DB.SQLCtx(), nodeID)
- if err != nil {
- logger.WithField("NodeID", nodeID).Warnf("get node caches failed, err: %s", err.Error())
- continue
- }
-
- // 补充备份数
- execCtx.Executor.Post(NewCheckRepCountTask(lo.Map(caches, func(ch model.Cache, index int) string { return ch.HashValue })))
- continue
- }
-
- agentClient, err := agtcli.NewAgentClient(nodeID, &config.Cfg().RabbitMQ)
- if err != nil {
- logger.WithField("NodeID", nodeID).Warnf("create agent client failed, err: %s", err.Error())
- continue
- }
- defer agentClient.Close()
-
- // 紧急任务
- err = agentClient.PostTask(agtmsg.NewPostTaskBody(agttsk.NewCheckStateTask(), true, true))
- if err != nil {
- logger.WithField("NodeID", nodeID).Warnf("request to agent failed, err: %s", err.Error())
- }
- }
- }
|