in pkg/cluster/healthcheck/healthcheck.go [212:255]
func (c *EndpointChecker) Start() {
defer func() {
if r := recover(); r != nil {
logger.Warnf("[health check] node checker panic %v\n%s", r, string(debug.Stack()))
}
c.checkTimer.Stop()
c.checkTimeout.Stop()
}()
c.checkTimer = gxtime.AfterFunc(c.HealthChecker.initialDelay, c.OnCheck)
for {
select {
case <-c.stop:
return
default:
// prepare a check
currentID := atomic.AddUint64(&c.checkID, 1)
select {
case <-c.stop:
return
case resp := <-c.resp:
if resp.ID == currentID {
if c.checkTimeout != nil {
c.checkTimeout.Stop()
c.checkTimeout = nil
}
if resp.Healthy {
c.HandleSuccess()
} else {
c.HandleFailure(false)
}
c.checkTimer = gxtime.AfterFunc(c.HealthChecker.getCheckInterval(), c.OnCheck)
}
case <-c.timeout:
if c.checkTimer != nil {
c.checkTimer.Stop()
}
c.HandleFailure(true)
c.checkTimer = gxtime.AfterFunc(c.HealthChecker.getCheckInterval(), c.OnCheck)
logger.Infof("[health check] receive a timeout response at id: %d", currentID)
}
}
}
}