diff --git a/config/config.go b/config/config.go index 0a58f7936f397..feb0a48914519 100644 --- a/config/config.go +++ b/config/config.go @@ -88,7 +88,7 @@ type Log struct { File logutil.FileLogConfig `toml:"file" json:"file"` SlowQueryFile string `toml:"slow-query-file" json:"slow-query-file"` - SlowThreshold uint `toml:"slow-threshold" json:"slow-threshold"` + SlowThreshold uint64 `toml:"slow-threshold" json:"slow-threshold"` ExpensiveThreshold uint `toml:"expensive-threshold" json:"expensive-threshold"` QueryLogMaxLen uint `toml:"query-log-max-len" json:"query-log-max-len"` } @@ -275,7 +275,7 @@ var defaultConf = Config{ LogRotate: true, MaxSize: logutil.DefaultLogMaxSize, }, - SlowThreshold: 300, + SlowThreshold: logutil.DefaultSlowThreshold, ExpensiveThreshold: 10000, QueryLogMaxLen: 2048, }, diff --git a/executor/adapter.go b/executor/adapter.go index 17c12a65cf37f..73685ba37129c 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -339,7 +339,7 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool) { } cfg := config.GetGlobalConfig() costTime := time.Since(a.StartTime) - threshold := time.Duration(cfg.Log.SlowThreshold) * time.Millisecond + threshold := time.Duration(atomic.LoadUint64(&cfg.Log.SlowThreshold)) * time.Millisecond if costTime < threshold && level < log.DebugLevel { return } diff --git a/executor/set_test.go b/executor/set_test.go index bcdf6db7cded6..3a564cc0b2ab7 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -239,6 +239,13 @@ func (s *testSuite) TestSetVar(c *C) { tk.MustQuery(`select @@session.tidb_constraint_check_in_place;`).Check(testkit.Rows("1")) tk.MustExec("set global tidb_constraint_check_in_place = 0") tk.MustQuery(`select @@global.tidb_constraint_check_in_place;`).Check(testkit.Rows("0")) + + tk.MustExec("set tidb_slow_log_threshold = 0") + tk.MustQuery("select @@session.tidb_slow_log_threshold;").Check(testkit.Rows("0")) + tk.MustExec("set tidb_slow_log_threshold = 1") + tk.MustQuery("select @@session.tidb_slow_log_threshold;").Check(testkit.Rows("1")) + _, err = tk.Exec("set global tidb_slow_log_threshold = 0") + c.Assert(err, NotNil) } func (s *testSuite) TestSetCharset(c *C) { diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index b1c08416851b0..2582a375641de 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/timeutil" ) @@ -608,6 +609,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.MemQuotaNestedLoopApply = tidbOptInt64(val, DefTiDBMemQuotaNestedLoopApply) case TiDBGeneralLog: atomic.StoreUint32(&ProcessGeneralLog, uint32(tidbOptPositiveInt32(val, DefTiDBGeneralLog))) + case TiDBSlowLogThreshold: + atomic.StoreUint64(&config.GetGlobalConfig().Log.SlowThreshold, uint64(tidbOptInt64(val, logutil.DefaultSlowThreshold))) case TiDBRetryLimit: s.RetryLimit = tidbOptInt64(val, DefTiDBRetryLimit) case TiDBDisableTxnAutoRetry: diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index 63e7991d55371..872f9760e0feb 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/logutil" ) // ScopeFlag is for system variable whether can be changed in global/session dynamically or not. @@ -662,6 +663,7 @@ var defaultSysVars = []*SysVar{ {ScopeSession, TiDBOptimizerSelectivityLevel, strconv.Itoa(DefTiDBOptimizerSelectivityLevel)}, /* The following variable is defined as session scope but is actually server scope. */ {ScopeSession, TiDBGeneralLog, strconv.Itoa(DefTiDBGeneralLog)}, + {ScopeSession, TiDBSlowLogThreshold, strconv.Itoa(logutil.DefaultSlowThreshold)}, {ScopeSession, TiDBConfig, ""}, {ScopeGlobal | ScopeSession, TiDBDDLReorgWorkerCount, strconv.Itoa(DefTiDBDDLReorgWorkerCount)}, {ScopeSession, TiDBDDLReorgPriority, "PRIORITY_LOW"}, diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index 1cde648d31fa0..bd281ab174be5 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -95,7 +95,10 @@ const ( // tidb_general_log is used to log every query in the server in info level. TiDBGeneralLog = "tidb_general_log" - // tidb_retry_limit is the maximun number of retries when committing a transaction. + // tidb_slow_log_threshold is used to set the slow log threshold in the server. + TiDBSlowLogThreshold = "tidb_slow_log_threshold" + + // tidb_retry_limit is the maximum number of retries when committing a transaction. TiDBRetryLimit = "tidb_retry_limit" // tidb_disable_txn_auto_retry disables transaction auto retry. diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index 71ce27cd028ba..78392b9ad692b 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -85,6 +85,8 @@ func GetSessionOnlySysVars(s *SessionVars, key string) (string, bool, error) { return string(j), true, nil case TiDBForcePriority: return mysql.Priority2Str[mysql.PriorityEnum(atomic.LoadInt32(&ForcePriority))], true, nil + case TiDBSlowLogThreshold: + return strconv.FormatUint(atomic.LoadUint64(&config.GetGlobalConfig().Log.SlowThreshold), 10), true, nil } sVal, ok := s.systems[key] if ok { @@ -325,7 +327,7 @@ func ValidateSetSystemVar(vars *SessionVars, name string, value string) (string, TIDBMemQuotaIndexLookupReader, TIDBMemQuotaIndexLookupJoin, TIDBMemQuotaNestedLoopApply, - TiDBRetryLimit: + TiDBRetryLimit, TiDBSlowLogThreshold: _, err := strconv.ParseInt(value, 10, 64) if err != nil { return value, ErrWrongValueForVar.GenWithStackByArgs(name) diff --git a/util/logutil/log.go b/util/logutil/log.go index 5046f74593f44..33051664728bf 100644 --- a/util/logutil/log.go +++ b/util/logutil/log.go @@ -33,6 +33,8 @@ const ( DefaultLogMaxSize = 300 // MB defaultLogFormat = "text" defaultLogLevel = log.InfoLevel + // DefaultSlowThreshold is the default slow log threshold in millisecond. + DefaultSlowThreshold = 300 ) // FileLogConfig serializes file log related config in toml/json.