in gdbclient/internal/pool/conn.go [166:198]
func (cn *ConnWebSocket) connCheck(frequency time.Duration) {
ticker := time.NewTicker(frequency)
defer ticker.Stop()
for {
select {
case <-ticker.C:
// It is possible that ticker and closedCn arrive together,
// and select pseudo-randomly pick ticker case, we double
// check here to prevent being executed after closed.
if cn.closed() {
return
}
err := cn.doping(3)
if err != nil {
cn.pingErrorsNum += 1
internal.Logger.Error("status check", zapPtr(cn), zap.Time("time", time.Now()), zap.Error(err))
if cn.pingErrorsNum >= 3 {
cn._broken = true
cn.lastIoError = err
// wakeup pool to check connection status
_ = cn.notifier != nil && cn.notifier()
internal.Logger.Error("conn ping broken", zapPtr(cn), zap.Time("time", time.Now()))
return
}
} else {
cn.pingErrorsNum = 0
}
case <-cn.closeCn:
return
}
}
}