From d41a595195902832d393bb14a660ec1b7713ed18 Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Tue, 28 Apr 2026 12:24:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=87=AD=E6=8D=AE?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=B8=85=E7=90=86=20goroutine=20=E6=97=A0?= =?UTF-8?q?=E9=99=90=E9=98=BB=E5=A1=9E=E5=AF=BC=E8=87=B4=E7=9A=84=20gorout?= =?UTF-8?q?ine=20=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/services/credential_tester.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/services/credential_tester.go b/plugins/services/credential_tester.go index aa302b6..e7e3394 100644 --- a/plugins/services/credential_tester.go +++ b/plugins/services/credential_tester.go @@ -77,12 +77,18 @@ func TestSingleCredential(ctx context.Context, cred Credential, authFn AuthFunc) case result := <-resultChan: return result case <-ctx.Done(): - // context 被取消,但 goroutine 可能还在运行 - // 启动清理协程:等待结果并关闭连接 + // context 被取消,但 authFn goroutine 可能还阻塞在第三方库 IO 上 + // 限时等待:超过 5 秒直接放弃,避免 goroutine 无限泄漏 go func() { - result := <-resultChan - if result != nil && result.Conn != nil { - _ = result.Conn.Close() + timer := time.NewTimer(5 * time.Second) + defer timer.Stop() + select { + case result := <-resultChan: + if result != nil && result.Conn != nil { + _ = result.Conn.Close() + } + case <-timer.C: + // 第三方库不响应取消,放弃等待 } }() return &AuthResult{