From ce6715627befafb26e68ac73c995422ad3d61ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A5=E5=89=91?= <1045931706@qq.com> Date: Wed, 11 Jun 2025 18:57:26 +0800 Subject: [PATCH 1/4] http MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 童剑 <1045931706@qq.com> --- pkg/apiserver/profiling/service.go | 2 -- pkg/httpc/client.go | 3 ++- pkg/tidb/client.go | 2 ++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/apiserver/profiling/service.go b/pkg/apiserver/profiling/service.go index 7b02a325bc..eaff9b432a 100644 --- a/pkg/apiserver/profiling/service.go +++ b/pkg/apiserver/profiling/service.go @@ -16,7 +16,6 @@ import ( "github.com/pingcap/tidb-dashboard/pkg/apiserver/model" "github.com/pingcap/tidb-dashboard/pkg/config" "github.com/pingcap/tidb-dashboard/pkg/dbstore" - "github.com/pingcap/tidb-dashboard/pkg/httpc" "github.com/pingcap/tidb-dashboard/pkg/pd" ) @@ -50,7 +49,6 @@ type ServiceParams struct { ConfigManager *config.DynamicConfigManager LocalStore *dbstore.DB - HTTPClient *httpc.Client EtcdClient *clientv3.Client PDClient *pd.Client } diff --git a/pkg/httpc/client.go b/pkg/httpc/client.go index d41285b0ec..3e50b6a871 100644 --- a/pkg/httpc/client.go +++ b/pkg/httpc/client.go @@ -88,7 +88,8 @@ func (c *Client) SendRequest( if err != nil { return nil, err } - return res.Body() + defer res.Response.Body.Close() + return io.ReadAll(res.Response.Body) } func (c *Client) Send( diff --git a/pkg/tidb/client.go b/pkg/tidb/client.go index dfd5b5b782..4bc2afcb57 100644 --- a/pkg/tidb/client.go +++ b/pkg/tidb/client.go @@ -22,6 +22,7 @@ import ( mysqlDriver "gorm.io/driver/mysql" "gorm.io/gorm" + "github.com/pingcap/tidb-dashboard/pkg/apiserver/utils" "github.com/pingcap/tidb-dashboard/pkg/config" "github.com/pingcap/tidb-dashboard/pkg/httpc" "github.com/pingcap/tidb-dashboard/util/distro" @@ -163,6 +164,7 @@ func (c *Client) OpenSQLConn(user string, pass string) (*gorm.DB, error) { if err := db.Exec(fmt.Sprintf("SET SESSION max_execution_time = '%d'", defaultTiDBSQLExecutionTimeoutMs)).Error; err != nil { log.Error("Failed to set max_execution_time", zap.Error(err)) + defer utils.CloseTiDBConnection(db) //nolint:errcheck return nil, ErrTiDBClientRequestFailed.Wrap(err, "failed to set max_execution_time") } From 0d2dba5a1a42b3fb6a4eca19217e3df5daf017dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A5=E5=89=91?= <1045931706@qq.com> Date: Wed, 11 Jun 2025 19:39:59 +0800 Subject: [PATCH 2/4] leak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 童剑 <1045931706@qq.com> --- pkg/apiserver/statement/queries.go | 6 ++++-- pkg/tidb/proxy.go | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pkg/apiserver/statement/queries.go b/pkg/apiserver/statement/queries.go index 16deb6a0a3..b01b77e1dd 100644 --- a/pkg/apiserver/statement/queries.go +++ b/pkg/apiserver/statement/queries.go @@ -3,6 +3,7 @@ package statement import ( + "context" "fmt" "regexp" "strings" @@ -90,8 +91,9 @@ func (s *Service) queryStatements( ) } } - - err = query.Find(&result).Error + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + err = query.WithContext(ctx).Find(&result).Error return } diff --git a/pkg/tidb/proxy.go b/pkg/tidb/proxy.go index 3a2effa7b3..965f8db4f9 100644 --- a/pkg/tidb/proxy.go +++ b/pkg/tidb/proxy.go @@ -111,15 +111,29 @@ func (p *proxy) serve(in net.Conn) { _ = in.Close() return } + deadline := time.Now().Add(10 * time.Minute) + if err := in.SetDeadline(deadline); err != nil { + log.Warn("input set deadline failed", zap.Error(err)) + _ = in.Close() + return + } + if err := out.SetReadDeadline(deadline); err != nil { + log.Warn("output set deadline failed", zap.Error(err)) + _ = in.Close() + return + } + done := make(chan struct{}) // bidirectional copy go func() { + defer func() { + done <- struct{}{} + }() // nolint io.Copy(in, out) - _ = in.Close() - _ = out.Close() }() // nolint io.Copy(out, in) + <-done _ = out.Close() _ = in.Close() } From ac97607e474601fbc5ad429e6f5f87f024ff8c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A5=E5=89=91?= <1045931706@qq.com> Date: Thu, 12 Jun 2025 17:16:04 +0800 Subject: [PATCH 3/4] cycle import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 童剑 <1045931706@qq.com> --- pkg/tidb/client.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/tidb/client.go b/pkg/tidb/client.go index 4bc2afcb57..1fb73e1565 100644 --- a/pkg/tidb/client.go +++ b/pkg/tidb/client.go @@ -22,7 +22,6 @@ import ( mysqlDriver "gorm.io/driver/mysql" "gorm.io/gorm" - "github.com/pingcap/tidb-dashboard/pkg/apiserver/utils" "github.com/pingcap/tidb-dashboard/pkg/config" "github.com/pingcap/tidb-dashboard/pkg/httpc" "github.com/pingcap/tidb-dashboard/util/distro" @@ -164,7 +163,9 @@ func (c *Client) OpenSQLConn(user string, pass string) (*gorm.DB, error) { if err := db.Exec(fmt.Sprintf("SET SESSION max_execution_time = '%d'", defaultTiDBSQLExecutionTimeoutMs)).Error; err != nil { log.Error("Failed to set max_execution_time", zap.Error(err)) - defer utils.CloseTiDBConnection(db) //nolint:errcheck + if d, err := db.DB(); err == nil && db != nil { + d.Close() //nolint:errcheck + } return nil, ErrTiDBClientRequestFailed.Wrap(err, "failed to set max_execution_time") } From 41812193a91560c5d468204a14471a3c5d99d26b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A5=E5=89=91?= <1045931706@qq.com> Date: Wed, 18 Jun 2025 15:21:06 +0800 Subject: [PATCH 4/4] log close error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 童剑 <1045931706@qq.com> --- pkg/tidb/client.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/tidb/client.go b/pkg/tidb/client.go index 1fb73e1565..b7ff9e463d 100644 --- a/pkg/tidb/client.go +++ b/pkg/tidb/client.go @@ -164,7 +164,9 @@ func (c *Client) OpenSQLConn(user string, pass string) (*gorm.DB, error) { if err := db.Exec(fmt.Sprintf("SET SESSION max_execution_time = '%d'", defaultTiDBSQLExecutionTimeoutMs)).Error; err != nil { log.Error("Failed to set max_execution_time", zap.Error(err)) if d, err := db.DB(); err == nil && db != nil { - d.Close() //nolint:errcheck + if cerr := d.Close(); cerr != nil { + log.Error("Failed to close database after setting max_execution_time", zap.Error(cerr)) + } } return nil, ErrTiDBClientRequestFailed.Wrap(err, "failed to set max_execution_time") }