*: support 'admin show ddl jobs <number>' grammar (#7028)

This commit is contained in:
crazycs
2018-07-12 14:49:14 +08:00
committed by Zhang Jian
parent 5f7fc80389
commit 461663652d
10 changed files with 48 additions and 20 deletions

View File

@ -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
}

View File

@ -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()),
}

View File

@ -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)
}

View File

@ -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)

View File

@ -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{

View File

@ -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},

View File

@ -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.

View File

@ -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:

View File

@ -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)

View File

@ -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