[client] Cancel the context of wg watcher when the go routine exit (#2612)

This commit is contained in:
Zoltan Papp 2024-09-17 12:10:17 +02:00 committed by GitHub
parent 1104c9c048
commit 28cbb4b70f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 7 additions and 6 deletions

View File

@ -484,11 +484,11 @@ func (conn *Conn) onWorkerICEStateDisconnected(newState ConnStatus) {
// switch back to relay connection // switch back to relay connection
if conn.endpointRelay != nil && conn.currentConnPriority != connPriorityRelay { if conn.endpointRelay != nil && conn.currentConnPriority != connPriorityRelay {
conn.log.Debugf("ICE disconnected, set Relay to active connection") conn.log.Debugf("ICE disconnected, set Relay to active connection")
conn.workerRelay.EnableWgWatcher(conn.ctx)
err := conn.configureWGEndpoint(conn.endpointRelay) err := conn.configureWGEndpoint(conn.endpointRelay)
if err != nil { if err != nil {
conn.log.Errorf("failed to switch to relay conn: %v", err) conn.log.Errorf("failed to switch to relay conn: %v", err)
} }
conn.workerRelay.EnableWgWatcher(conn.ctx)
conn.currentConnPriority = connPriorityRelay conn.currentConnPriority = connPriorityRelay
} }
@ -551,7 +551,6 @@ func (conn *Conn) relayConnectionIsReady(rci RelayConnInfo) {
} }
} }
conn.workerRelay.EnableWgWatcher(conn.ctx)
err = conn.configureWGEndpoint(endpointUdpAddr) err = conn.configureWGEndpoint(endpointUdpAddr)
if err != nil { if err != nil {
if err := wgProxy.CloseConn(); err != nil { if err := wgProxy.CloseConn(); err != nil {
@ -560,6 +559,7 @@ func (conn *Conn) relayConnectionIsReady(rci RelayConnInfo) {
conn.log.Errorf("Failed to update wg peer configuration: %v", err) conn.log.Errorf("Failed to update wg peer configuration: %v", err)
return return
} }
conn.workerRelay.EnableWgWatcher(conn.ctx)
wgConfigWorkaround() wgConfigWorkaround()
if conn.wgProxyRelay != nil { if conn.wgProxyRelay != nil {

View File

@ -109,10 +109,10 @@ func (w *WorkerRelay) EnableWgWatcher(ctx context.Context) {
} }
ctx, ctxCancel := context.WithCancel(ctx) ctx, ctxCancel := context.WithCancel(ctx)
w.wgStateCheck(ctx)
w.ctxWgWatch = ctx w.ctxWgWatch = ctx
w.ctxCancelWgWatch = ctxCancel w.ctxCancelWgWatch = ctxCancel
w.wgStateCheck(ctx, ctxCancel)
} }
func (w *WorkerRelay) DisableWgWatcher() { func (w *WorkerRelay) DisableWgWatcher() {
@ -158,21 +158,22 @@ func (w *WorkerRelay) CloseConn() {
} }
// wgStateCheck help to check the state of the WireGuard handshake and relay connection // wgStateCheck help to check the state of the WireGuard handshake and relay connection
func (w *WorkerRelay) wgStateCheck(ctx context.Context) { func (w *WorkerRelay) wgStateCheck(ctx context.Context, ctxCancel context.CancelFunc) {
w.log.Debugf("WireGuard watcher started")
lastHandshake, err := w.wgState() lastHandshake, err := w.wgState()
if err != nil { if err != nil {
w.log.Errorf("failed to read wg stats: %v", err) w.log.Warnf("failed to read wg stats: %v", err)
lastHandshake = time.Time{} lastHandshake = time.Time{}
} }
go func(lastHandshake time.Time) { go func(lastHandshake time.Time) {
timer := time.NewTimer(wgHandshakeOvertime) timer := time.NewTimer(wgHandshakeOvertime)
defer timer.Stop() defer timer.Stop()
defer ctxCancel()
for { for {
select { select {
case <-timer.C: case <-timer.C:
handshake, err := w.wgState() handshake, err := w.wgState()
if err != nil { if err != nil {
w.log.Errorf("failed to read wg stats: %v", err) w.log.Errorf("failed to read wg stats: %v", err)