diff --git a/pkg/sessionctx/vardef/tidb_vars.go b/pkg/sessionctx/vardef/tidb_vars.go index 942aeee716..966bc1a545 100644 --- a/pkg/sessionctx/vardef/tidb_vars.go +++ b/pkg/sessionctx/vardef/tidb_vars.go @@ -1658,7 +1658,7 @@ const ( DefOptEnableProjectionPushDown = true DefTiDBEnableSharedLockPromotion = false DefTiDBTSOClientRPCMode = TSOClientRPCModeDefault - DefTiDBCircuitBreakerPDMetaErrorRatePct = 0 + DefTiDBCircuitBreakerPDMetaErrorRatePct = 0.0 DefTiDBAccelerateUserCreationUpdate = false DefTiDBEnableTSValidation = true ) @@ -1788,6 +1788,8 @@ var ( SchemaCacheSize = atomic.NewUint64(DefTiDBSchemaCacheSize) SchemaCacheSizeOriginText = atomic.NewString(strconv.Itoa(DefTiDBSchemaCacheSize)) AccelerateUserCreationUpdate = atomic.NewBool(DefTiDBAccelerateUserCreationUpdate) + + CircuitBreakerPDMetadataErrorRateThresholdPct = atomic.NewFloat64(0.0) ) func serverMemoryLimitDefaultValue() string { diff --git a/pkg/sessionctx/variable/sysvar.go b/pkg/sessionctx/variable/sysvar.go index 4ccb275e93..96ef7ea530 100644 --- a/pkg/sessionctx/variable/sysvar.go +++ b/pkg/sessionctx/variable/sysvar.go @@ -3563,14 +3563,24 @@ var defaultSysVars = []*SysVar{ return (*SetPDClientDynamicOption.Load())(vardef.TiDBTSOClientRPCMode, val) }, }, - {Scope: vardef.ScopeGlobal, Name: vardef.TiDBCircuitBreakerPDMetadataErrorRateThresholdPct, Value: strconv.Itoa(vardef.DefTiDBCircuitBreakerPDMetaErrorRatePct), Type: vardef.TypeUnsigned, MinValue: 0, MaxValue: 100, + {Scope: vardef.ScopeGlobal, Name: vardef.TiDBCircuitBreakerPDMetadataErrorRateThresholdPct, Value: strconv.FormatFloat(vardef.DefTiDBCircuitBreakerPDMetaErrorRatePct, 'f', -1, 64), + Type: vardef.TypeFloat, MinValue: 0, MaxValue: 1, + GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { + return strconv.FormatFloat(vardef.CircuitBreakerPDMetadataErrorRateThresholdPct.Load(), 'f', -1, 64), nil + }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + v := tidbOptFloat64(val, vardef.DefTiDBCircuitBreakerPDMetaErrorRatePct) + if v < 0 || v > 1 { + return errors.Errorf("invalid tidb_cb_pd_metadata_error_rate_threshold_pct value %s", val) + } + vardef.CircuitBreakerPDMetadataErrorRateThresholdPct.Store(v) if ChangePDMetadataCircuitBreakerErrorRateThresholdPct != nil { - ChangePDMetadataCircuitBreakerErrorRateThresholdPct(uint32(tidbOptPositiveInt32(val, vardef.DefTiDBCircuitBreakerPDMetaErrorRatePct))) + ChangePDMetadataCircuitBreakerErrorRateThresholdPct(uint32(v * 100)) } return nil }, }, + {Scope: vardef.ScopeGlobal, Name: vardef.TiDBAccelerateUserCreationUpdate, Value: BoolToOnOff(vardef.DefTiDBAccelerateUserCreationUpdate), Type: vardef.TypeBool, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { vardef.AccelerateUserCreationUpdate.Store(TiDBOptOn(val)) diff --git a/pkg/sessionctx/variable/sysvar_test.go b/pkg/sessionctx/variable/sysvar_test.go index 6391132ffb..e5527d6c6c 100644 --- a/pkg/sessionctx/variable/sysvar_test.go +++ b/pkg/sessionctx/variable/sysvar_test.go @@ -1773,16 +1773,20 @@ func TestTiDBCircuitBreakerPDMetadataErrorRateThresholdPct(t *testing.T) { require.Equal(t, "[variable:1292]Truncated incorrect tidb_cb_pd_metadata_error_rate_threshold_pct value: '-1'", warn.Error()) // Too high, will get lowered to the max value - val, err = sv.Validate(vars, "101", vardef.ScopeGlobal) + val, err = sv.Validate(vars, "1.1", vardef.ScopeGlobal) require.NoError(t, err) require.Equal(t, strconv.FormatUint(GetSysVar(vardef.TiDBCircuitBreakerPDMetadataErrorRateThresholdPct).MaxValue, 10), val) warn = vars.StmtCtx.GetWarnings()[1].Err - require.Equal(t, "[variable:1292]Truncated incorrect tidb_cb_pd_metadata_error_rate_threshold_pct value: '101'", warn.Error()) + require.Equal(t, "[variable:1292]Truncated incorrect tidb_cb_pd_metadata_error_rate_threshold_pct value: '1.1'", warn.Error()) // valid - val, err = sv.Validate(vars, "10", vardef.ScopeGlobal) + val, err = sv.Validate(vars, "0.9", vardef.ScopeGlobal) require.NoError(t, err) - require.Equal(t, "10", val) + require.Equal(t, "0.9", val) + + val, err = sv.Validate(vars, "0.0", vardef.ScopeGlobal) + require.NoError(t, err) + require.Equal(t, "0.0", val) } func TestEnableWindowFunction(t *testing.T) {