Skip to content

Commit 2879ab6

Browse files
committed
support unset tidb_enable_stmt_summary in session scope
1 parent fc0be6e commit 2879ab6

File tree

8 files changed

+92
-28
lines changed

8 files changed

+92
-28
lines changed

domain/global_vars_cache.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func checkEnableStmtSummary(rows []chunk.Row, fields []*ast.ResultField) {
8383
}
8484
}
8585

86-
stmtsummary.StmtSummaryByDigestMap.SetEnabled(variable.TiDBOptOn(sVal), false)
86+
stmtsummary.StmtSummaryByDigestMap.SetEnabled(sVal, false)
8787
break
8888
}
8989
}

domain/global_vars_cache_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (gvcSuite *testGVCSuite) TestCheckEnableStmtSummary(c *C) {
127127
Collate: charset.CollationBin,
128128
}
129129

130-
stmtsummary.StmtSummaryByDigestMap.SetEnabled(false, false)
130+
stmtsummary.StmtSummaryByDigestMap.SetEnabled("0", false)
131131
ck := chunk.NewChunkWithCapacity([]*types.FieldType{ft, ft1}, 1024)
132132
ck.AppendString(0, variable.TiDBEnableStmtSummary)
133133
ck.AppendString(1, "1")

executor/set.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ func (e *SetExecutor) setSysVariable(name string, v *expression.VarAssignment) e
192192
}
193193

194194
if name == variable.TiDBEnableStmtSummary {
195-
stmtsummary.StmtSummaryByDigestMap.SetEnabled(variable.TiDBOptOn(valStr), !v.IsGlobal)
195+
stmtsummary.StmtSummaryByDigestMap.SetEnabled(valStr, !v.IsGlobal)
196196
}
197197

198198
return nil

infoschema/perfschema/tables_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,13 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) {
145145
from performance_schema.events_statements_summary_by_digest
146146
where digest_text like 'select * from t%'`,
147147
).Check(testkit.Rows("test 2 0 select * from t where a=2"))
148+
149+
// Unset session variable
150+
tk.MustExec("set session tidb_enable_stmt_summary = ''")
151+
tk.MustQuery("select * from t where a=2")
152+
153+
// Statement summary is disabled
154+
tk.MustQuery(`select schema_name, exec_count, sum_rows_affected, query_sample_text
155+
from performance_schema.events_statements_summary_by_digest`,
156+
).Check(testkit.Rows())
148157
}

sessionctx/variable/sysvar.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func init() {
109109
}
110110
terror.ErrClassToMySQLCodes[terror.ClassVariable] = mySQLErrCodes
111111

112-
stmtsummary.StmtSummaryByDigestMap.SetEnabled(DefTiDBEnableStmtSummary, false)
112+
stmtsummary.StmtSummaryByDigestMap.SetDefaultEnabled(DefTiDBEnableStmtSummary)
113113
}
114114

115115
// BoolToIntStr converts bool to int string, for example "0" or "1".

sessionctx/variable/varsutil.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,7 @@ func ValidateSetSystemVar(vars *SessionVars, name string, value string) (string,
380380
TiDBBatchInsert, TiDBDisableTxnAutoRetry, TiDBEnableStreaming,
381381
TiDBBatchDelete, TiDBBatchCommit, TiDBEnableCascadesPlanner, TiDBEnableWindowFunction,
382382
TiDBCheckMb4ValueInUTF8, TiDBLowResolutionTSO, TiDBEnableIndexMerge, TiDBEnableNoopFuncs,
383-
TiDBScatterRegion, TiDBGeneralLog, TiDBConstraintCheckInPlace, TiDBEnableVectorizedExpression,
384-
TiDBEnableStmtSummary:
383+
TiDBScatterRegion, TiDBGeneralLog, TiDBConstraintCheckInPlace, TiDBEnableVectorizedExpression:
385384
fallthrough
386385
case GeneralLog, AvoidTemporalUpgrade, BigTables, CheckProxyUsers, LogBin,
387386
CoreFile, EndMakersInJSON, SQLLogBin, OfflineMode, PseudoSlaveMode, LowPriorityUpdates,
@@ -583,6 +582,16 @@ func ValidateSetSystemVar(vars *SessionVars, name string, value string) (string,
583582
return "off", nil
584583
}
585584
return value, ErrWrongValueForVar.GenWithStackByArgs(name, value)
585+
case TiDBEnableStmtSummary:
586+
switch {
587+
case strings.EqualFold(value, "ON") || value == "1":
588+
return "1", nil
589+
case strings.EqualFold(value, "OFF") || value == "0":
590+
return "0", nil
591+
case value == "":
592+
return "", nil
593+
}
594+
return value, ErrWrongValueForVar.GenWithStackByArgs(name, value)
586595
}
587596
return value, nil
588597
}

util/stmtsummary/statement_summary.go

+46-15
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ type stmtSummaryByDigestMap struct {
5858
enabledWrapper struct {
5959
sync.RWMutex
6060
// enabled indicates whether statement summary is enabled in current server.
61-
enabled bool
61+
sessionEnabled string
6262
// setInSession indicates whether statement summary has been set in any session.
63-
setInSession bool
63+
globalEnabled string
64+
defaultEnabled bool
6465
}
6566
}
6667

@@ -107,8 +108,9 @@ func newStmtSummaryByDigestMap() *stmtSummaryByDigestMap {
107108
ssMap := &stmtSummaryByDigestMap{
108109
summaryMap: kvcache.NewSimpleLRUCache(maxStmtCount, 0, 0),
109110
}
110-
// enabledWrapper.enabled will be initialized in package variable.
111-
ssMap.enabledWrapper.setInSession = false
111+
// enabledWrapper.defaultEnabled will be initialized in package variable.
112+
ssMap.enabledWrapper.sessionEnabled = ""
113+
ssMap.enabledWrapper.globalEnabled = ""
112114
return ssMap
113115
}
114116

@@ -229,31 +231,60 @@ func (ssMap *stmtSummaryByDigestMap) ToDatum() [][]types.Datum {
229231
return rows
230232
}
231233

232-
// SetEnabled enables or disables statement summary in global(cluster) or session(server) scope.
233-
func (ssMap *stmtSummaryByDigestMap) SetEnabled(enable bool, inSession bool) {
234+
// SetDefaultEnabled sets the enabling status by default.
235+
func (ssMap *stmtSummaryByDigestMap) SetDefaultEnabled(defaultEnabled bool) {
234236
ssMap.enabledWrapper.Lock()
237+
ssMap.enabledWrapper.defaultEnabled = defaultEnabled
238+
ssMap.enabledWrapper.Unlock()
239+
}
235240

241+
// SetEnabled enables or disables statement summary in global(cluster) or session(server) scope.
242+
func (ssMap *stmtSummaryByDigestMap) SetEnabled(enable string, inSession bool) {
243+
ssMap.enabledWrapper.Lock()
244+
var needClear bool
236245
if inSession {
237-
ssMap.enabledWrapper.setInSession = true
238-
} else if ssMap.enabledWrapper.setInSession {
239-
ssMap.enabledWrapper.Unlock()
240-
// If it has been set in session scope, global settings will be ignored.
241-
return
246+
ssMap.enabledWrapper.sessionEnabled = enable
247+
needClear = !ssMap.isEnabled(enable)
248+
} else {
249+
ssMap.enabledWrapper.globalEnabled = enable
250+
if !ssMap.isSet(ssMap.enabledWrapper.sessionEnabled) {
251+
needClear = !ssMap.isEnabled(enable)
252+
}
242253
}
243-
244-
ssMap.enabledWrapper.enabled = enable
245254
ssMap.enabledWrapper.Unlock()
246255

247256
// Clear all summaries once statement summary is disabled.
248-
if !enable {
257+
if needClear {
249258
ssMap.Clear()
250259
}
251260
}
252261

253262
// Enabled returns whether statement summary is enabled.
254263
func (ssMap *stmtSummaryByDigestMap) Enabled() bool {
255264
ssMap.enabledWrapper.RLock()
256-
enabled := ssMap.enabledWrapper.enabled
265+
var enabled bool
266+
if ssMap.isSet(ssMap.enabledWrapper.sessionEnabled) {
267+
enabled = ssMap.isEnabled(ssMap.enabledWrapper.sessionEnabled)
268+
} else {
269+
enabled = ssMap.isEnabled(ssMap.enabledWrapper.globalEnabled)
270+
}
257271
ssMap.enabledWrapper.RUnlock()
258272
return enabled
259273
}
274+
275+
// isEnabled converts a string value to bool.
276+
func (ssMap *stmtSummaryByDigestMap) isEnabled(enable string) bool {
277+
switch {
278+
case strings.EqualFold(enable, "ON") || enable == "1":
279+
return true
280+
case strings.EqualFold(enable, "OFF") || enable == "0":
281+
return false
282+
default:
283+
return ssMap.enabledWrapper.defaultEnabled
284+
}
285+
}
286+
287+
// isSet judges whether the variable is set.
288+
func (ssMap *stmtSummaryByDigestMap) isSet(enable string) bool {
289+
return enable != ""
290+
}

util/stmtsummary/statement_summary_test.go

+22-7
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type testStmtSummarySuite struct {
3434

3535
func (s *testStmtSummarySuite) SetUpSuite(c *C) {
3636
s.ssMap = newStmtSummaryByDigestMap()
37-
s.ssMap.SetEnabled(true, false)
37+
s.ssMap.SetEnabled("1", false)
3838
}
3939

4040
func TestT(t *testing.T) {
@@ -320,7 +320,7 @@ func (s *testStmtSummarySuite) TestMaxSQLLength(c *C) {
320320
func (s *testStmtSummarySuite) TestDisableStmtSummary(c *C) {
321321
s.ssMap.Clear()
322322
// Set false in global scope, it should work.
323-
s.ssMap.SetEnabled(false, false)
323+
s.ssMap.SetEnabled("0", false)
324324

325325
stmtExecInfo1 := &StmtExecInfo{
326326
SchemaName: "schema_name",
@@ -338,26 +338,41 @@ func (s *testStmtSummarySuite) TestDisableStmtSummary(c *C) {
338338
c.Assert(len(datums), Equals, 0)
339339

340340
// Set true in session scope, it will overwrite global scope.
341-
s.ssMap.SetEnabled(true, true)
341+
s.ssMap.SetEnabled("1", true)
342342

343343
s.ssMap.AddStatement(stmtExecInfo1)
344344
datums = s.ssMap.ToDatum()
345345
c.Assert(len(datums), Equals, 1)
346346

347347
// Set false in global scope, it shouldn't work.
348-
s.ssMap.SetEnabled(false, false)
348+
s.ssMap.SetEnabled("0", false)
349349

350350
stmtExecInfo2 := &StmtExecInfo{
351351
SchemaName: "schema_name",
352352
OriginalSQL: "original_sql2",
353-
NormalizedSQL: "normalized_sql",
354-
Digest: "digest",
353+
NormalizedSQL: "normalized_sql2",
354+
Digest: "digest2",
355355
TotalLatency: 50000,
356356
AffectedRows: 500,
357357
SentRows: 500,
358358
StartTime: time.Date(2019, 1, 1, 10, 10, 20, 10, time.UTC),
359359
}
360360
s.ssMap.AddStatement(stmtExecInfo2)
361361
datums = s.ssMap.ToDatum()
362-
c.Assert(len(datums), Equals, 1)
362+
c.Assert(len(datums), Equals, 2)
363+
364+
// Unset in session scope
365+
s.ssMap.SetEnabled("", true)
366+
s.ssMap.AddStatement(stmtExecInfo2)
367+
datums = s.ssMap.ToDatum()
368+
c.Assert(len(datums), Equals, 0)
369+
370+
// Unset in global scope
371+
s.ssMap.SetEnabled("", false)
372+
s.ssMap.AddStatement(stmtExecInfo1)
373+
datums = s.ssMap.ToDatum()
374+
c.Assert(len(datums), Equals, 0)
375+
376+
// Set back
377+
s.ssMap.SetEnabled("1", false)
363378
}

0 commit comments

Comments
 (0)