2
0

fix keepalive/read race

This commit is contained in:
Nikolay Pavlovich
2023-05-02 21:51:30 +03:00
parent 999166f7bd
commit cef058fc84
+27 -1
View File
@@ -62,6 +62,7 @@ type RecConn struct {
dialErr error
dialer *websocket.Dialer
keepAliveResponse *keepAliveResponse
manualReconnect bool
*websocket.Conn
}
@@ -87,6 +88,16 @@ func (rc *RecConn) handleReconnect() {
// CloseAndReconnect will try to reconnect.
func (rc *RecConn) CloseAndReconnect() {
if !rc.getManualReconnect() {
rc.Close()
rc.handleReconnect()
go rc.connect()
}
}
// ManualCloseAndReconnect will try to reconnect.
func (rc *RecConn) ManualCloseAndReconnect() {
rc.setManualReconnect(true)
rc.Close()
rc.handleReconnect()
go rc.connect()
@@ -130,6 +141,19 @@ func (rc *RecConn) Shutdown(writeWait time.Duration) {
}
}
func (rc *RecConn) getManualReconnect() bool {
rc.mu.RLock()
defer rc.mu.RUnlock()
return rc.manualReconnect
}
func (rc *RecConn) setManualReconnect(v bool) {
rc.mu.Lock()
rc.manualReconnect = v
defer rc.mu.Unlock()
}
// ReadMessage is a helper method for getting a reader
// using NextReader and reading from that reader to a buffer.
//
@@ -462,7 +486,7 @@ func (rc *RecConn) keepAlive() {
timeoutOffset := time.Millisecond * 500
if time.Since(rc.getKeepAliveResponse().getLastResponse()) > rc.getKeepAliveTimeout()+timeoutOffset {
rc.log(LogValues{Err: errors.New("keepalive timeout"), Msg: "Reconnect", Url: rc.url})
rc.CloseAndReconnect()
rc.ManualCloseAndReconnect()
return
}
}
@@ -480,6 +504,8 @@ func (rc *RecConn) connect() {
}
wsConn, httpResp, err := rc.dialer.Dial(rc.url, rc.reqHeader)
rc.setManualReconnect(false)
rc.mu.Lock()
rc.Conn = wsConn
rc.dialErr = err