From 34bac1ba4ab2e139b02167ea5aab603d32b2372d 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 a34246f1bf..4fa56e1178 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 5da43891dd..cae0c70184 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 a670b9a2e2..48ca7bcb50 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 1953c6a246c65896beb7ccafb6a649a50f6eafe5 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 a63637cbef..d92c67b51f 100644 --- a/pkg/apiserver/statement/queries.go +++ b/pkg/apiserver/statement/queries.go @@ -3,6 +3,7 @@ package statement import ( + "context" "fmt" "regexp" "strings" @@ -89,8 +90,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 2b2fa8db58..7be2faa43a 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 89ecc34f301deba9610bdfeea025811ea2cb455e 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 48ca7bcb50..994fece544 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 45b00b49cbb2b93d7995684eaa065af699330a3a 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 994fece544..a63a3abe9d 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") }