From eec6cb4298905883786d15d7bd8e57df57624f5f Mon Sep 17 00:00:00 2001 From: sagit <36596628+Sagit-chu@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:28:28 +0800 Subject: [PATCH] fix(agent): add port cleanup before resuming paused services (#398) When user traffic quota is exceeded, services are paused with ForceClosePortConnections to kill active connections. However, when admin resets quota and resumes services, the resume logic was missing this cleanup, causing "address already in use" errors. Changes: - Add ForceClosePortConnections call in resumeServices (socket & api) - Add ForceClosePortConnections call in resumeService (api single) - Increase wait time from 100ms to 500ms for port release Fixes #387 --- go-gost/x/api/config_service.go | 12 +++++++++++- go-gost/x/socket/service.go | 7 ++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/go-gost/x/api/config_service.go b/go-gost/x/api/config_service.go index 12c8081..36cd35a 100644 --- a/go-gost/x/api/config_service.go +++ b/go-gost/x/api/config_service.go @@ -624,6 +624,11 @@ func resumeService(ctx *gin.Context) { existingSvc.Close() registry.ServiceRegistry().Unregister(name) + // 强制断开端口的所有连接 + if serviceConfig.Addr != "" { + _ = kill.ForceClosePortConnections(serviceConfig.Addr) + } + // 等待端口释放 time.Sleep(500 * time.Millisecond) @@ -1039,8 +1044,13 @@ func resumeServices(ctx *gin.Context) { str.service.Close() registry.ServiceRegistry().Unregister(str.name) + // 强制断开端口的所有连接 + if str.serviceConfig.Addr != "" { + _ = kill.ForceClosePortConnections(str.serviceConfig.Addr) + } + // 等待端口释放 - time.Sleep(100 * time.Millisecond) + time.Sleep(500 * time.Millisecond) // 重新解析并启动服务 svc, err := parser.ParseService(str.serviceConfig) diff --git a/go-gost/x/socket/service.go b/go-gost/x/socket/service.go index 33b23ae..f2d7d24 100644 --- a/go-gost/x/socket/service.go +++ b/go-gost/x/socket/service.go @@ -397,8 +397,13 @@ func resumeServices(req resumeServicesRequest) error { str.service.Close() registry.ServiceRegistry().Unregister(str.name) + // 强制断开端口的所有连接 + if str.serviceConfig.Addr != "" { + _ = kill.ForceClosePortConnections(str.serviceConfig.Addr) + } + // 等待端口释放 - time.Sleep(100 * time.Millisecond) + time.Sleep(500 * time.Millisecond) // 重新解析并启动服务 svc, err := parser.ParseService(str.serviceConfig)