package ticktock import ( "fmt" "time" "gitlink.org.cn/cloudream/common/pkgs/logger" "gitlink.org.cn/cloudream/common/pkgs/mq" "gitlink.org.cn/cloudream/common/utils/reflect2" "gitlink.org.cn/cloudream/jcs-pub/common/consts" stgglb "gitlink.org.cn/cloudream/jcs-pub/common/globals" hubmq "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/mq/hub" cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types" ) type CheckHubState struct { } func (j *CheckHubState) Name() string { return reflect2.TypeNameOf[CheckHubState]() } func (j *CheckHubState) Execute(t *TickTock) { log := logger.WithType[CheckHubState]("TickTock") log.Debugf("job start") startTime := time.Now() defer func() { log.Debugf("job end, time: %v", time.Since(startTime)) }() hubs, err := t.db.Hub().GetAllHubs(t.db.DefCtx()) if err != nil { log.Warnf("get all hubs: %s", err.Error()) return } for _, hub := range hubs { err := j.checkOne(t, hub) if err != nil { log.Warnf("check one hub %v: %s", hub, err.Error()) } } } func (j *CheckHubState) checkOne(t *TickTock, hub cortypes.Hub) error { log := logger.WithType[CheckHubState]("TickTock") agtCli, err := stgglb.HubMQPool.Acquire(hub.HubID) if err != nil { return fmt.Errorf("new hub mq client: %w", err) } defer stgglb.HubMQPool.Release(agtCli) _, err = agtCli.GetState(hubmq.NewGetState(), mq.RequestOption{Timeout: time.Second * 30}) if err != nil { if hub.LastReportTime != nil { if time.Since(*hub.LastReportTime) > t.cfg.HubUnavailableTime { err := t.db.Hub().UpdateState(t.db.DefCtx(), hub.HubID, consts.HubStateUnavailable) if err != nil { log.Warnf("set hub %v state: %s", hub, err.Error()) } } } else if hub.LastReportTime == nil { err := t.db.Hub().UpdateState(t.db.DefCtx(), hub.HubID, consts.HubStateUnavailable) if err != nil { log.Warnf("set hub %v state: %s", hub, err.Error()) } } return fmt.Errorf("getting state: %w", err) } // TODO 如果以后还有其他的状态,要判断哪些状态下能设置Normal err = t.db.Hub().UpdateState(t.db.DefCtx(), hub.HubID, consts.HubStateNormal) if err != nil { log.Warnf("set hub %v state: %s", hub, err.Error()) } return nil }