Skip to content

Commit

Permalink
cherry pick pingcap#16743 to release-3.1
Browse files Browse the repository at this point in the history
Signed-off-by: sre-bot <sre-bot@pingcap.com>
  • Loading branch information
cfzjywxk authored and sre-bot committed Apr 28, 2020
1 parent 7377420 commit 744ea8d
Showing 1 changed file with 53 additions and 4 deletions.
57 changes: 53 additions & 4 deletions executor/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,17 @@ func (a *recordSet) NewChunk() *chunk.Chunk {

func (a *recordSet) Close() error {
err := a.executor.Close()
<<<<<<< HEAD
// `LowSlowQuery` and `SummaryStmt` must be called before recording `PrevStmt`.
a.stmt.LogSlowQuery(a.txnStartTS, a.lastErr == nil, false)
a.stmt.SummaryStmt()
sessVars := a.stmt.Ctx.GetSessionVars()
pps := types.CloneRow(sessVars.PreparedParams)
sessVars.PrevStmt = FormatSQL(a.stmt.OriginText(), pps)
a.stmt.logAudit()
=======
a.stmt.CloseRecordSet(a.txnStartTS, a.lastErr)
>>>>>>> b32e834... server: let select for update could be recorded for slow log and statements (#16743)
return err
}

Expand Down Expand Up @@ -334,10 +338,11 @@ func getMaxExecutionTime(sctx sessionctx.Context, stmtNode ast.StmtNode) uint64
}

type chunkRowRecordSet struct {
rows []chunk.Row
idx int
fields []*ast.ResultField
e Executor
rows []chunk.Row
idx int
fields []*ast.ResultField
e Executor
execStmt *ExecStmt
}

func (c *chunkRowRecordSet) Fields() []*ast.ResultField {
Expand All @@ -358,6 +363,7 @@ func (c *chunkRowRecordSet) NewChunk() *chunk.Chunk {
}

func (c *chunkRowRecordSet) Close() error {
c.execStmt.CloseRecordSet(c.execStmt.Ctx.GetSessionVars().TxnCtx.StartTS, nil)
return nil
}

Expand Down Expand Up @@ -388,8 +394,13 @@ func (a *ExecStmt) runPessimisticSelectForUpdate(ctx context.Context, e Executor
break
}
if req.NumRows() == 0 {
<<<<<<< HEAD
fields := schema2ResultFields(e.Schema(), a.Ctx.GetSessionVars().CurrentDB)
return &chunkRowRecordSet{rows: rows, fields: fields, e: e}, nil
=======
fields := colNames2ResultFields(e.Schema(), a.OutputNames, a.Ctx.GetSessionVars().CurrentDB)
return &chunkRowRecordSet{rows: rows, fields: fields, e: e, execStmt: a}, nil
>>>>>>> b32e834... server: let select for update could be recorded for slow log and statements (#16743)
}
iter := chunk.NewIterator4Chunk(req)
for r := iter.Begin(); r != iter.End(); r = iter.Next() {
Expand Down Expand Up @@ -682,6 +693,44 @@ func FormatSQL(sql string, pps variable.PreparedParams) stringutil.StringerFunc
}
}

<<<<<<< HEAD
=======
var (
sessionExecuteRunDurationInternal = metrics.SessionExecuteRunDuration.WithLabelValues(metrics.LblInternal)
sessionExecuteRunDurationGeneral = metrics.SessionExecuteRunDuration.WithLabelValues(metrics.LblGeneral)
)

// FinishExecuteStmt is used to record some information after `ExecStmt` execution finished:
// 1. record slow log if needed.
// 2. record summary statement.
// 3. record execute duration metric.
// 4. update the `PrevStmt` in session variable.
func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, succ bool, hasMoreResults bool) {
// `LowSlowQuery` and `SummaryStmt` must be called before recording `PrevStmt`.
a.LogSlowQuery(txnTS, succ, hasMoreResults)
a.SummaryStmt(succ)
sessVars := a.Ctx.GetSessionVars()
pps := types.CloneRow(sessVars.PreparedParams)
sessVars.PrevStmt = FormatSQL(a.OriginText(), pps)
executeDuration := time.Since(sessVars.StartTime) - sessVars.DurationCompile
if sessVars.InRestrictedSQL {
sessionExecuteRunDurationInternal.Observe(executeDuration.Seconds())
} else {
sessionExecuteRunDurationGeneral.Observe(executeDuration.Seconds())
}
}

// CloseRecordSet will finish the execution of current statement and do some record work
func (a *ExecStmt) CloseRecordSet(txnStartTS uint64, lastErr error) {
a.FinishExecuteStmt(txnStartTS, lastErr == nil, false)
a.logAudit()
// Detach the disk tracker from GlobalDiskUsageTracker after every execution
if stmtCtx := a.Ctx.GetSessionVars().StmtCtx; stmtCtx != nil && stmtCtx.DiskTracker != nil {
stmtCtx.DiskTracker.DetachFromGlobalTracker()
}
}

>>>>>>> b32e834... server: let select for update could be recorded for slow log and statements (#16743)
// LogSlowQuery is used to print the slow query in the log files.
func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) {
sessVars := a.Ctx.GetSessionVars()
Expand Down

0 comments on commit 744ea8d

Please sign in to comment.