From 7bfceba77fffceb9539e324ce617e2eb59a67e3f Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 5 Dec 2024 19:46:48 +0800 Subject: [PATCH 1/3] handle panic when loading bindings when restaring --- pkg/bindinfo/binding.go | 9 ++++++++- pkg/planner/core/optimizer.go | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/bindinfo/binding.go b/pkg/bindinfo/binding.go index 447e80dd8f778..8f3586f676175 100644 --- a/pkg/bindinfo/binding.go +++ b/pkg/bindinfo/binding.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/hint" + "github.com/pkg/errors" ) const ( @@ -130,7 +131,13 @@ func HasAvailableBinding(br Bindings) bool { // prepareHints builds ID and Hint for Bindings. If sctx is not nil, we check if // the BindSQL is still valid. -func prepareHints(sctx sessionctx.Context, binding *Binding) error { +func prepareHints(sctx sessionctx.Context, binding *Binding) (rerr error) { + defer func() { + if r := recover(); r != nil { + rerr = errors.Errorf("panic when preparing hints for binding %v, panic: %v", binding.BindSQL, r) + } + }() + p := parser.New() if (binding.Hint != nil && binding.ID != "") || binding.Status == deleted { return nil diff --git a/pkg/planner/core/optimizer.go b/pkg/planner/core/optimizer.go index ff914a94a6a3e..071c3499e1e70 100644 --- a/pkg/planner/core/optimizer.go +++ b/pkg/planner/core/optimizer.go @@ -21,6 +21,7 @@ import ( "math" "slices" "strconv" + "strings" "time" "github.com/pingcap/errors" @@ -255,6 +256,11 @@ func doOptimize( logic base.LogicalPlan, ) (base.LogicalPlan, base.PhysicalPlan, float64, error) { sessVars := sctx.GetSessionVars() + + if strings.Contains(sessVars.StmtCtx.OriginalSQL, "EXPLAIN FORMAT='hint'") { + panic("parsing hints panic") + } + flag = adjustOptimizationFlags(flag, logic) logic, err := logicalOptimize(ctx, flag, logic) if err != nil { From 0db79a9e084c7d0884818ea9a1f7df1557a19209 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 5 Dec 2024 19:47:55 +0800 Subject: [PATCH 2/3] handle panic when loading bindings when restaring --- pkg/planner/core/optimizer.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pkg/planner/core/optimizer.go b/pkg/planner/core/optimizer.go index 071c3499e1e70..ff914a94a6a3e 100644 --- a/pkg/planner/core/optimizer.go +++ b/pkg/planner/core/optimizer.go @@ -21,7 +21,6 @@ import ( "math" "slices" "strconv" - "strings" "time" "github.com/pingcap/errors" @@ -256,11 +255,6 @@ func doOptimize( logic base.LogicalPlan, ) (base.LogicalPlan, base.PhysicalPlan, float64, error) { sessVars := sctx.GetSessionVars() - - if strings.Contains(sessVars.StmtCtx.OriginalSQL, "EXPLAIN FORMAT='hint'") { - panic("parsing hints panic") - } - flag = adjustOptimizationFlags(flag, logic) logic, err := logicalOptimize(ctx, flag, logic) if err != nil { From 74f316627b21c2b1ea63b628de59c0b93539e1d4 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 5 Dec 2024 19:56:00 +0800 Subject: [PATCH 3/3] handle panic when loading bindings when restaring --- pkg/bindinfo/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/bindinfo/BUILD.bazel b/pkg/bindinfo/BUILD.bazel index 55b8c67a178c9..fc81b0958b6b9 100644 --- a/pkg/bindinfo/BUILD.bazel +++ b/pkg/bindinfo/BUILD.bazel @@ -45,6 +45,7 @@ go_library( "//pkg/util/table-filter", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pkg_errors//:errors", "@org_golang_x_sync//singleflight", "@org_uber_go_zap//:zap", ],