@@ -16,12 +16,10 @@ package stmtsummary
16
16
import (
17
17
"strings"
18
18
"sync"
19
- "sync/atomic"
20
19
"time"
21
20
22
21
"github.com/pingcap/parser/mysql"
23
22
"github.com/pingcap/tidb/config"
24
- "github.com/pingcap/tidb/sessionctx/variable"
25
23
"github.com/pingcap/tidb/types"
26
24
"github.com/pingcap/tidb/util/hack"
27
25
"github.com/pingcap/tidb/util/kvcache"
@@ -55,6 +53,15 @@ type stmtSummaryByDigestMap struct {
55
53
// It's rare to read concurrently, so RWMutex is not needed.
56
54
sync.Mutex
57
55
summaryMap * kvcache.SimpleLRUCache
56
+
57
+ // enabledWrapper encapsulates variables needed to judge whether statement summary is enabled.
58
+ enabledWrapper struct {
59
+ sync.RWMutex
60
+ // enabled indicates whether statement summary is enabled in current server.
61
+ sessionEnabled string
62
+ // setInSession indicates whether statement summary has been set in any session.
63
+ globalEnabled string
64
+ }
58
65
}
59
66
60
67
// StmtSummaryByDigestMap is a global map containing all statement summaries.
@@ -97,9 +104,13 @@ type StmtExecInfo struct {
97
104
// newStmtSummaryByDigestMap creates an empty stmtSummaryByDigestMap.
98
105
func newStmtSummaryByDigestMap () * stmtSummaryByDigestMap {
99
106
maxStmtCount := config .GetGlobalConfig ().StmtSummary .MaxStmtCount
100
- return & stmtSummaryByDigestMap {
107
+ ssMap := & stmtSummaryByDigestMap {
101
108
summaryMap : kvcache .NewSimpleLRUCache (maxStmtCount , 0 , 0 ),
102
109
}
110
+ // enabledWrapper.defaultEnabled will be initialized in package variable.
111
+ ssMap .enabledWrapper .sessionEnabled = ""
112
+ ssMap .enabledWrapper .globalEnabled = ""
113
+ return ssMap
103
114
}
104
115
105
116
// newStmtSummaryByDigest creates a stmtSummaryByDigest from StmtExecInfo
@@ -164,7 +175,7 @@ func (ssMap *stmtSummaryByDigestMap) AddStatement(sei *StmtExecInfo) {
164
175
165
176
ssMap .Lock ()
166
177
// Check again. Statements could be added before disabling the flag and after Clear()
167
- if atomic . LoadInt32 ( & variable . EnableStmtSummary ) == 0 {
178
+ if ! ssMap . Enabled () {
168
179
ssMap .Unlock ()
169
180
return
170
181
}
@@ -188,7 +199,7 @@ func (ssMap *stmtSummaryByDigestMap) Clear() {
188
199
ssMap .Unlock ()
189
200
}
190
201
191
- // Convert statement summary to Datum
202
+ // ToDatum converts statement summary to Datum
192
203
func (ssMap * stmtSummaryByDigestMap ) ToDatum () [][]types.Datum {
193
204
ssMap .Lock ()
194
205
values := ssMap .summaryMap .Values ()
@@ -219,12 +230,64 @@ func (ssMap *stmtSummaryByDigestMap) ToDatum() [][]types.Datum {
219
230
return rows
220
231
}
221
232
222
- // OnEnableStmtSummaryModified is triggered once EnableStmtSummary is modified.
223
- func OnEnableStmtSummaryModified (newValue string ) {
224
- if variable .TiDBOptOn (newValue ) {
225
- atomic .StoreInt32 (& variable .EnableStmtSummary , 1 )
233
+ // SetEnabled enables or disables statement summary in global(cluster) or session(server) scope.
234
+ func (ssMap * stmtSummaryByDigestMap ) SetEnabled (value string , inSession bool ) {
235
+ value = ssMap .normalizeEnableValue (value )
236
+
237
+ ssMap .enabledWrapper .Lock ()
238
+ if inSession {
239
+ ssMap .enabledWrapper .sessionEnabled = value
240
+ } else {
241
+ ssMap .enabledWrapper .globalEnabled = value
242
+ }
243
+ sessionEnabled := ssMap .enabledWrapper .sessionEnabled
244
+ globalEnabled := ssMap .enabledWrapper .globalEnabled
245
+ ssMap .enabledWrapper .Unlock ()
246
+
247
+ // Clear all summaries once statement summary is disabled.
248
+ var needClear bool
249
+ if ssMap .isSet (sessionEnabled ) {
250
+ needClear = ! ssMap .isEnabled (sessionEnabled )
251
+ } else {
252
+ needClear = ! ssMap .isEnabled (globalEnabled )
253
+ }
254
+ if needClear {
255
+ ssMap .Clear ()
256
+ }
257
+ }
258
+
259
+ // Enabled returns whether statement summary is enabled.
260
+ func (ssMap * stmtSummaryByDigestMap ) Enabled () bool {
261
+ ssMap .enabledWrapper .RLock ()
262
+ var enabled bool
263
+ if ssMap .isSet (ssMap .enabledWrapper .sessionEnabled ) {
264
+ enabled = ssMap .isEnabled (ssMap .enabledWrapper .sessionEnabled )
226
265
} else {
227
- atomic .StoreInt32 (& variable .EnableStmtSummary , 0 )
228
- StmtSummaryByDigestMap .Clear ()
266
+ enabled = ssMap .isEnabled (ssMap .enabledWrapper .globalEnabled )
267
+ }
268
+ ssMap .enabledWrapper .RUnlock ()
269
+ return enabled
270
+ }
271
+
272
+ // normalizeEnableValue converts 'ON' to '1' and 'OFF' to '0'
273
+ func (ssMap * stmtSummaryByDigestMap ) normalizeEnableValue (value string ) string {
274
+ switch {
275
+ case strings .EqualFold (value , "ON" ):
276
+ return "1"
277
+ case strings .EqualFold (value , "OFF" ):
278
+ return "0"
279
+ default :
280
+ return value
229
281
}
230
282
}
283
+
284
+ // isEnabled converts a string value to bool.
285
+ // 1 indicates true, 0 or '' indicates false.
286
+ func (ssMap * stmtSummaryByDigestMap ) isEnabled (value string ) bool {
287
+ return value == "1"
288
+ }
289
+
290
+ // isSet judges whether the variable is set.
291
+ func (ssMap * stmtSummaryByDigestMap ) isSet (value string ) bool {
292
+ return value != ""
293
+ }
0 commit comments