From 461663652d7ddfa52eb886ea2e439ec000ed3b89 Mon Sep 17 00:00:00 2001 From: crazycs Date: Thu, 12 Jul 2018 14:49:14 +0800 Subject: [PATCH] *: support 'admin show ddl jobs ' grammar (#7028) --- ast/misc.go | 9 +++++---- executor/builder.go | 1 + executor/executor.go | 16 +++++++++------- executor/executor_test.go | 14 ++++++++++++-- parser/parser.y | 7 +++++++ parser/parser_test.go | 2 ++ plan/common_plans.go | 2 ++ plan/planbuilder.go | 2 +- util/admin/admin.go | 11 +++++++---- util/admin/admin_test.go | 4 ++-- 10 files changed, 48 insertions(+), 20 deletions(-) diff --git a/ast/misc.go b/ast/misc.go index 67d07c32d2..dec9ab4637 100644 --- a/ast/misc.go +++ b/ast/misc.go @@ -630,10 +630,11 @@ type HandleRange struct { type AdminStmt struct { stmtNode - Tp AdminStmtType - Index string - Tables []*TableName - JobIDs []int64 + Tp AdminStmtType + Index string + Tables []*TableName + JobIDs []int64 + JobNumber int64 HandleRanges []HandleRange } diff --git a/executor/builder.go b/executor/builder.go index 6a78212b5d..f794ef0283 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -208,6 +208,7 @@ func (b *executorBuilder) buildShowDDL(v *plan.ShowDDL) Executor { func (b *executorBuilder) buildShowDDLJobs(v *plan.ShowDDLJobs) Executor { e := &ShowDDLJobsExec{ + jobNumber: v.JobNumber, is: b.is, baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()), } diff --git a/executor/executor.go b/executor/executor.go index 6a81f22287..c964538e87 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -221,9 +221,10 @@ func (e *ShowDDLExec) Next(ctx context.Context, chk *chunk.Chunk) error { type ShowDDLJobsExec struct { baseExecutor - cursor int - jobs []*model.Job - is infoschema.InfoSchema + cursor int + jobs []*model.Job + jobNumber int64 + is infoschema.InfoSchema } // ShowDDLJobQueriesExec represents a show DDL job queries executor. @@ -246,8 +247,7 @@ func (e *ShowDDLJobQueriesExec) Open(ctx context.Context) error { if err != nil { return errors.Trace(err) } - // TODO: need to return the job that the user needs. - historyJobs, err := admin.GetHistoryDDLJobs(e.ctx.Txn()) + historyJobs, err := admin.GetHistoryDDLJobs(e.ctx.Txn(), admin.DefNumHistoryJobs) if err != nil { return errors.Trace(err) } @@ -288,8 +288,10 @@ func (e *ShowDDLJobsExec) Open(ctx context.Context) error { if err != nil { return errors.Trace(err) } - - historyJobs, err := admin.GetHistoryDDLJobs(e.ctx.Txn()) + if e.jobNumber == 0 { + e.jobNumber = admin.DefNumHistoryJobs + } + historyJobs, err := admin.GetHistoryDDLJobs(e.ctx.Txn(), int(e.jobNumber)) if err != nil { return errors.Trace(err) } diff --git a/executor/executor_test.go b/executor/executor_test.go index b4678a9e4a..3b8cd21c32 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -181,13 +181,23 @@ func (s *testSuite) TestAdmin(c *C) { c.Assert(row.Len(), Equals, 10) txn, err = s.store.Begin() c.Assert(err, IsNil) - historyJobs, err := admin.GetHistoryDDLJobs(txn) + historyJobs, err := admin.GetHistoryDDLJobs(txn, admin.DefNumHistoryJobs) c.Assert(len(historyJobs), Greater, 1) c.Assert(len(row.GetString(1)), Greater, 0) c.Assert(err, IsNil) c.Assert(row.GetInt64(0), Equals, historyJobs[0].ID) c.Assert(err, IsNil) + r, err = tk.Exec("admin show ddl jobs 20") + c.Assert(err, IsNil) + chk = r.NewChunk() + err = r.Next(ctx, chk) + c.Assert(err, IsNil) + row = chk.GetRow(0) + c.Assert(row.Len(), Equals, 10) + c.Assert(row.GetInt64(0), Equals, historyJobs[0].ID) + c.Assert(err, IsNil) + // show DDL job queries test tk.MustExec("use test") tk.MustExec("drop table if exists admin_test2") @@ -196,7 +206,7 @@ func (s *testSuite) TestAdmin(c *C) { result.Check(testkit.Rows()) result = tk.MustQuery(`admin show ddl job queries 1, 2, 3, 4`) result.Check(testkit.Rows()) - historyJob, err := admin.GetHistoryDDLJobs(txn) + historyJob, err := admin.GetHistoryDDLJobs(txn, admin.DefNumHistoryJobs) result = tk.MustQuery(fmt.Sprintf("admin show ddl job queries %d", historyJob[0].ID)) result.Check(testkit.Rows(historyJob[0].Query)) c.Assert(err, IsNil) diff --git a/parser/parser.y b/parser/parser.y index 09635031f3..88156a729d 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -5096,6 +5096,13 @@ AdminStmt: { $$ = &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} } +| "ADMIN" "SHOW" "DDL" "JOBS" NUM + { + $$ = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobs, + JobNumber: $5.(int64), + } + } | "ADMIN" "CHECK" "TABLE" TableNameList { $$ = &ast.AdminStmt{ diff --git a/parser/parser_test.go b/parser/parser_test.go index 17a3404d42..2c3689671e 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -413,6 +413,8 @@ func (s *testParserSuite) TestDMLStmt(c *C) { // for admin {"admin show ddl;", true}, {"admin show ddl jobs;", true}, + {"admin show ddl jobs 20;", true}, + {"admin show ddl jobs -1;", false}, {"admin show ddl job queries 1", true}, {"admin show ddl job queries 1, 2, 3, 4", true}, {"admin check table t1, t2;", true}, diff --git a/plan/common_plans.go b/plan/common_plans.go index caa1e69603..cd42cb57b6 100644 --- a/plan/common_plans.go +++ b/plan/common_plans.go @@ -39,6 +39,8 @@ type ShowDDL struct { // ShowDDLJobs is for showing DDL job list. type ShowDDLJobs struct { baseSchemaProducer + + JobNumber int64 } // ShowDDLJobQueries is for showing DDL job queries sql. diff --git a/plan/planbuilder.go b/plan/planbuilder.go index 1297b9db36..cd2235b040 100644 --- a/plan/planbuilder.go +++ b/plan/planbuilder.go @@ -469,7 +469,7 @@ func (b *planBuilder) buildAdmin(as *ast.AdminStmt) Plan { p.SetSchema(buildShowDDLFields()) ret = p case ast.AdminShowDDLJobs: - p := &ShowDDLJobs{} + p := &ShowDDLJobs{JobNumber: as.JobNumber} p.SetSchema(buildShowDDLJobsFields()) ret = p case ast.AdminCancelDDLJobs: diff --git a/util/admin/admin.go b/util/admin/admin.go index be7d14b935..da1b8e5d48 100644 --- a/util/admin/admin.go +++ b/util/admin/admin.go @@ -137,9 +137,12 @@ func GetDDLJobs(txn kv.Transaction) ([]*model.Job, error) { // MaxHistoryJobs is exported for testing. const MaxHistoryJobs = 10 +// DefNumHistoryJobs is default value of the default number of history job +const DefNumHistoryJobs = 10 + // GetHistoryDDLJobs returns the DDL history jobs and an error. -// The maximum count of history jobs is MaxHistoryJobs. -func GetHistoryDDLJobs(txn kv.Transaction) ([]*model.Job, error) { +// The maximum count of history jobs is num. +func GetHistoryDDLJobs(txn kv.Transaction, maxNumJobs int) ([]*model.Job, error) { t := meta.NewMeta(txn) jobs, err := t.GetAllHistoryDDLJobs() if err != nil { @@ -147,8 +150,8 @@ func GetHistoryDDLJobs(txn kv.Transaction) ([]*model.Job, error) { } jobsLen := len(jobs) - if jobsLen > MaxHistoryJobs { - start := jobsLen - MaxHistoryJobs + if jobsLen > maxNumJobs { + start := jobsLen - maxNumJobs jobs = jobs[start:] } jobsLen = len(jobs) diff --git a/util/admin/admin_test.go b/util/admin/admin_test.go index 336c783300..306ff367e8 100644 --- a/util/admin/admin_test.go +++ b/util/admin/admin_test.go @@ -172,7 +172,7 @@ func (s *testSuite) TestGetHistoryDDLJobs(c *C) { } err = t.AddHistoryDDLJob(jobs[i]) c.Assert(err, IsNil) - historyJobs, err1 := GetHistoryDDLJobs(txn) + historyJobs, err1 := GetHistoryDDLJobs(txn, DefNumHistoryJobs) c.Assert(err1, IsNil) if i+1 > MaxHistoryJobs { c.Assert(historyJobs, HasLen, MaxHistoryJobs) @@ -182,7 +182,7 @@ func (s *testSuite) TestGetHistoryDDLJobs(c *C) { } delta := cnt - MaxHistoryJobs - historyJobs, err := GetHistoryDDLJobs(txn) + historyJobs, err := GetHistoryDDLJobs(txn, DefNumHistoryJobs) c.Assert(err, IsNil) c.Assert(historyJobs, HasLen, MaxHistoryJobs) l := len(historyJobs) - 1