Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

infoschema/executor : add DDLJobs sys table #14837

Merged
merged 88 commits into from
Mar 19, 2020
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
fca2edb
Merge pull request #1 from pingcap/master
reafans Nov 26, 2019
c1d631e
Merge remote-tracking branch 'origin/master'
reafans Nov 26, 2019
43000f4
Merge remote-tracking branch 'origin/master'
reafans Nov 27, 2019
f028aa5
Merge pull request #2 from pingcap/master
reafans Nov 27, 2019
46bd5cd
Merge remote-tracking branch 'origin/master'
reafans Dec 2, 2019
a633220
Merge pull request #4 from pingcap/master
reafans Dec 4, 2019
ff562d4
Merge pull request #6 from pingcap/master
reafans Dec 4, 2019
3cb0499
Merge pull request #7 from pingcap/master
reafans Dec 10, 2019
ccea6bb
Merge pull request #8 from pingcap/master
reafans Dec 12, 2019
9e1ac7e
Merge pull request #10 from pingcap/master
reafans Dec 13, 2019
3a0858b
Merge remote-tracking branch 'origin/master'
reafans Dec 17, 2019
9897e0f
Merge remote-tracking branch 'origin/master'
reafans Dec 19, 2019
5fac8ba
Merge branch 'master' of github.com:pingcap/tidb
reafans Jan 3, 2020
30acb58
Merge pull request #12 from pingcap/master
reafans Jan 6, 2020
4a3b0bd
add ddl_jobs sys table
reafans Jan 9, 2020
a6f081a
update
reafans Jan 9, 2020
028f35c
Merge branch 'add_ddlJob_inforschema' of https://github.com/reafans/t…
reafans Jan 9, 2020
ee8328c
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Feb 11, 2020
f381472
update
reafans Feb 12, 2020
234dca0
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Feb 13, 2020
41b6d9e
add ddljobs sys table
reafans Feb 18, 2020
7261211
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Feb 18, 2020
4fd4d4c
add comment
reafans Feb 18, 2020
61503a2
add Query field
reafans Feb 19, 2020
bf6b9f6
fmt
reafans Feb 19, 2020
8391515
fixd bug
reafans Feb 19, 2020
7b26867
addressd comment
reafans Feb 19, 2020
a95ee13
Merge branch 'master' into add_ddljobs_sys_table
reafans Feb 19, 2020
35dda53
addressd comment
reafans Feb 19, 2020
658538f
add err check
reafans Feb 19, 2020
ea2c89b
Merge branch 'master' into add_ddljobs_sys_table
reafans Feb 19, 2020
dd6c445
add checker
reafans Feb 20, 2020
7af00ab
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Feb 20, 2020
df1af82
Merge branch 'master' into add_ddljobs_sys_table
reafans Feb 20, 2020
c3c0599
fix bug
reafans Feb 20, 2020
f992f65
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Feb 20, 2020
dd3ed4f
fmt import
reafans Feb 21, 2020
014900e
addressd comment
reafans Feb 21, 2020
45bb6fc
fix bug
reafans Feb 21, 2020
51b12e9
fix conflict
reafans Mar 6, 2020
189579b
fix conflict
reafans Mar 6, 2020
1a16c58
fmt
reafans Mar 6, 2020
e79d574
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 6, 2020
10ae282
Merge branch 'master' into add_ddljobs_sys_table
crazycs520 Mar 6, 2020
7884ae9
update
reafans Mar 9, 2020
3f78a5d
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Mar 9, 2020
334f1f8
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Mar 9, 2020
4bc617c
address comment
reafans Mar 9, 2020
308a9ff
address comment
reafans Mar 9, 2020
731faf2
fix conflict
reafans Mar 9, 2020
63dd3c3
fmt
reafans Mar 9, 2020
8a1a69c
fix bug
reafans Mar 9, 2020
a2f65c3
update
reafans Mar 9, 2020
f880c85
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Mar 9, 2020
09ba7bc
fix bug
reafans Mar 9, 2020
a53cfb1
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 10, 2020
cc0dce3
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 10, 2020
a3511dd
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 10, 2020
b8b8b3d
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 10, 2020
5b9ff6e
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 10, 2020
46129ce
update
reafans Mar 10, 2020
bbf1da5
fix bug
reafans Mar 10, 2020
6fd77f6
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Mar 10, 2020
92aabf0
update
reafans Mar 10, 2020
0e73fa9
fix bug
reafans Mar 10, 2020
656093e
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Mar 10, 2020
fcdcf8f
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Mar 10, 2020
8ca7fe6
fi bug
reafans Mar 10, 2020
5eab7cb
fix bug
reafans Mar 10, 2020
c7b4191
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Mar 15, 2020
434f5af
add ut
reafans Mar 15, 2020
b547ea5
fix bug
reafans Mar 15, 2020
4ed63f0
add ut
reafans Mar 15, 2020
b755372
fix ut
reafans Mar 15, 2020
9fecbed
fmt
reafans Mar 15, 2020
c5dc337
add ut
reafans Mar 15, 2020
58059f9
fix
reafans Mar 15, 2020
3f077ba
fix ut
reafans Mar 15, 2020
60b81fb
fix bug
reafans Mar 15, 2020
86682ff
fix ut
reafans Mar 15, 2020
a2cbc98
fmt
reafans Mar 15, 2020
57a72af
fix ut
reafans Mar 15, 2020
70c817c
Merge branch 'master' into add_ddljobs_sys_table
crazycs520 Mar 16, 2020
5a27fa0
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 19, 2020
bff71ca
Merge branch 'master' of https://github.com/pingcap/tidb into add_ddl…
reafans Mar 19, 2020
3291810
addresss comment
reafans Mar 19, 2020
6f0cd18
Merge branch 'add_ddljobs_sys_table' of https://github.com/reafans/ti…
reafans Mar 19, 2020
2880add
Merge branch 'master' into add_ddljobs_sys_table
reafans Mar 19, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -1365,6 +1365,11 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()),
retriever: retriever,
}
case strings.ToLower(infoschema.TableDDLJobs):
return &DDLJobsReaderExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()),
is: b.is,
}
}
}
tb, _ := b.is.TableByID(v.Table.ID)
Expand Down
46 changes: 30 additions & 16 deletions executor/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,14 +339,34 @@ func (e *ShowDDLExec) Next(ctx context.Context, req *chunk.Chunk) error {
// ShowDDLJobsExec represent a show DDL jobs executor.
type ShowDDLJobsExec struct {
baseExecutor
DDLJobExecInitializer

cursor int
cacheJobs []*model.Job
jobNumber int
is infoschema.InfoSchema
done bool
}

// DDLJobExecInitializer initials the DDLJobsExec
reafans marked this conversation as resolved.
Show resolved Hide resolved
type DDLJobExecInitializer struct {
reafans marked this conversation as resolved.
Show resolved Hide resolved
runningJobs []*model.Job
historyJobIter *meta.LastJobIterator
cacheJobs []*model.Job
jobNumber int
is infoschema.InfoSchema
done bool
cursor int
}

func (e *DDLJobExecInitializer) initial(txn kv.Transaction) error {
jobs, err := admin.GetDDLJobs(txn)
if err != nil {
return err
}
m := meta.NewMeta(txn)
e.historyJobIter, err = m.GetLastHistoryDDLJobsIterator()
if err != nil {
return err
}
e.runningJobs = jobs
e.cursor = 0
return nil
}

// ShowDDLJobQueriesExec represents a show DDL job queries executor.
Expand Down Expand Up @@ -414,21 +434,13 @@ func (e *ShowDDLJobsExec) Open(ctx context.Context) error {
if err != nil {
return err
}
jobs, err := admin.GetDDLJobs(txn)
if err != nil {
return err
}
if e.jobNumber == 0 {
e.jobNumber = admin.DefNumHistoryJobs
}

m := meta.NewMeta(txn)
e.historyJobIter, err = m.GetLastHistoryDDLJobsIterator()
err = e.DDLJobExecInitializer.initial(txn)
if err != nil {
return err
}
e.runningJobs = append(e.runningJobs, jobs...)
e.cursor = 0
return nil
}

Expand All @@ -439,6 +451,7 @@ func (e *ShowDDLJobsExec) Next(ctx context.Context, req *chunk.Chunk) error {
return nil
}
count := 0

// Append running ddl jobs.
if e.cursor < len(e.runningJobs) {
numCurBatch := mathutil.Min(req.Capacity(), len(e.runningJobs)-e.cursor)
Expand All @@ -448,13 +461,14 @@ func (e *ShowDDLJobsExec) Next(ctx context.Context, req *chunk.Chunk) error {
e.cursor += numCurBatch
count += numCurBatch
}
var err error

// Append history ddl jobs.
var err error
if count < req.Capacity() {
num := req.Capacity() - count
remainNum := e.jobNumber - (e.cursor - len(e.runningJobs))
num = mathutil.Min(num, remainNum)
e.cacheJobs, err = e.historyJobIter.GetLastJobs(num, e.cacheJobs)
e.cacheJobs, err = e.historyJobIter.GetNextJobs(num, e.cacheJobs)
if err != nil {
return err
}
Expand Down
106 changes: 104 additions & 2 deletions executor/infoschema_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ package executor

import (
"context"
"sort"

"github.com/cznic/mathutil"
"github.com/pingcap/parser/model"
"github.com/pingcap/parser/mysql"
"github.com/pingcap/tidb/infoschema"
"github.com/pingcap/tidb/privilege"
"github.com/pingcap/tidb/sessionctx"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/util/chunk"
"sort"
"strings"
reafans marked this conversation as resolved.
Show resolved Hide resolved
)

type memtableRetriever struct {
Expand Down Expand Up @@ -153,3 +155,103 @@ func dataForViews(ctx sessionctx.Context, schemas []*model.DBInfo) ([][]types.Da
}
return rows, nil
}

// DDLJobsReaderExec executes DDLJobs information retrieving
type DDLJobsReaderExec struct {
reafans marked this conversation as resolved.
Show resolved Hide resolved
baseExecutor
DDLJobExecInitializer

cacheJobs []*model.Job
reafans marked this conversation as resolved.
Show resolved Hide resolved
is infoschema.InfoSchema
}

// Open implements the Executor Next interface.
func (e *DDLJobsReaderExec) Open(ctx context.Context) error {
if err := e.baseExecutor.Open(ctx); err != nil {
return err
}
txn, err := e.ctx.Txn(true)
if err != nil {
return err
}
err = e.DDLJobExecInitializer.initial(txn)
if err != nil {
return err
}
return nil
}

// Next implements the Executor Next interface.
func (e *DDLJobsReaderExec) Next(ctx context.Context, req *chunk.Chunk) error {
req.GrowAndReset(e.maxChunkSize)
checker := privilege.GetPrivilegeManager(e.ctx)
count := 0

// Append running ddl jobs.
if e.cursor < len(e.runningJobs) {
num := mathutil.Min(req.Capacity(), len(e.runningJobs)-e.cursor)
for i := e.cursor; i < e.cursor+num; i++ {
e.appendJobToChunk(req, e.runningJobs[i], checker)
}
e.cursor += num
count += num
}
var err error

// Append history ddl jobs.
reafans marked this conversation as resolved.
Show resolved Hide resolved
if count < req.Capacity() {
e.cacheJobs, err = e.historyJobIter.GetNextJobs(req.Capacity()-count, e.cacheJobs)
if err != nil {
return err
}
for _, job := range e.cacheJobs {
e.appendJobToChunk(req, job, checker)
}
e.cursor += len(e.cacheJobs)
}
return nil
}

func (e *DDLJobsReaderExec) appendJobToChunk(req *chunk.Chunk, job *model.Job, checker privilege.Manager) {
schemaName := job.SchemaName
tableName := ""
finishTS := uint64(0)
reafans marked this conversation as resolved.
Show resolved Hide resolved
if job.BinlogInfo != nil {
finishTS = job.BinlogInfo.FinishedTS
if job.BinlogInfo.TableInfo != nil {
tableName = job.BinlogInfo.TableInfo.Name.L
}
if len(schemaName) == 0 && job.BinlogInfo.DBInfo != nil {
schemaName = job.BinlogInfo.DBInfo.Name.L
}
}
// For compatibility, the old version of DDL Job wasn't store the schema name and table name.
if len(schemaName) == 0 {
schemaName = getSchemaName(e.is, job.SchemaID)
}
if len(tableName) == 0 {
tableName = getTableName(e.is, job.TableID)
}

//check the privilege
reafans marked this conversation as resolved.
Show resolved Hide resolved
if checker != nil && !checker.RequestVerification(e.ctx.GetSessionVars().ActiveRoles, strings.ToLower(schemaName), strings.ToLower(tableName), "", mysql.AllPrivMask) {
return
}

req.AppendInt64(0, job.ID)
req.AppendString(1, schemaName)
req.AppendString(2, tableName)
req.AppendString(3, job.Type.String())
req.AppendString(4, job.SchemaState.String())
req.AppendInt64(5, job.SchemaID)
req.AppendInt64(6, job.TableID)
req.AppendInt64(7, job.RowCount)
req.AppendString(8, model.TSConvert2Time(job.StartTS).String())
if finishTS > 0 {
req.AppendString(9, model.TSConvert2Time(finishTS).String())
} else {
req.AppendString(9, "")
}
req.AppendString(10, job.State.String())
req.AppendString(11, job.Query)
}
33 changes: 33 additions & 0 deletions executor/infoschema_reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,36 @@ func (s *testInfoschemaTableSuite) TestViews(c *C) {
tk.MustQuery("SELECT * FROM information_schema.views WHERE table_schema='test' AND table_name='v1'").Check(testkit.Rows("def test v1 SELECT 1 CASCADED NO root@localhost DEFINER utf8mb4 utf8mb4_bin"))
tk.MustQuery("SELECT table_catalog, table_schema, table_name, table_type, engine, version, row_format, table_rows, avg_row_length, data_length, max_data_length, index_length, data_free, auto_increment, update_time, check_time, table_collation, checksum, create_options, table_comment FROM information_schema.tables WHERE table_schema='test' AND table_name='v1'").Check(testkit.Rows("def test v1 VIEW <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> VIEW"))
}

func (s *testInfoschemaTableSuite) TestDDLJobs(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("create database if not exists test_ddl_jobs")
tk.MustQuery("select db_name, job_type from information_schema.DDL_JOBS limit 1").Check(
testkit.Rows("test_ddl_jobs create schema"))

tk.MustExec("use test_ddl_jobs")
tk.MustExec("create table t (a int);")
tk.MustQuery("select db_name, table_name, job_type from information_schema.DDL_JOBS where table_name = 't'").Check(
testkit.Rows("test_ddl_jobs t create table"))

tk.MustQuery("select job_type from information_schema.DDL_JOBS group by job_type having job_type = 'create table'").Check(
testkit.Rows("create table"))

//test the privilege of new user for information_schema.DDL_JOBS
reafans marked this conversation as resolved.
Show resolved Hide resolved
tk.MustExec("create user DDL_JOBS_tester")
DDLJobsTester := testkit.NewTestKit(c, s.store)
DDLJobsTester.MustExec("use information_schema")
c.Assert(DDLJobsTester.Se.Auth(&auth.UserIdentity{
Username: "DDL_JOBS_tester",
Hostname: "127.0.0.1",
}, nil, nil), IsTrue)
DDLJobsTester.MustQuery("select DB_NAME from information_schema.DDL_JOBS;").Check(
[][]interface{}{})

//test the privilege of user with privilege of mysql for information_schema.ddl_jobs
reafans marked this conversation as resolved.
Show resolved Hide resolved
tk.MustExec("CREATE ROLE mysql_priv;")
tk.MustExec("GRANT ALL PRIVILEGES ON mysql.* TO mysql_priv;")
tk.MustExec("GRANT mysql_priv TO DDL_JOBS_tester;")
DDLJobsTester.MustExec("set role mysql_priv")
DDLJobsTester.MustQuery("select DISTINCT DB_NAME from information_schema.DDL_JOBS where DB_NAME = 'mysql';").Check(testkit.Rows("mysql"))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should test the table that the user doesn't have the privilege to see it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

}
19 changes: 19 additions & 0 deletions infoschema/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ const (
TableMetricSummaryByLabel = "METRICS_SUMMARY_BY_LABEL"
// TableInspectionSummary is the string constant of inspection summary table
TableInspectionSummary = "INSPECTION_SUMMARY"
// TableDDLJobs is the string constant of DDL job table.
TableDDLJobs = "DDL_JOBS"
)

var tableIDMap = map[string]int64{
Expand Down Expand Up @@ -177,6 +179,7 @@ var tableIDMap = map[string]int64{
TableMetricSummaryByLabel: autoid.InformationSchemaDBID + 53,
TableMetricTables: autoid.InformationSchemaDBID + 54,
TableInspectionSummary: autoid.InformationSchemaDBID + 55,
TableDDLJobs: autoid.InformationSchemaDBID + 56,
}

type columnInfo struct {
Expand Down Expand Up @@ -841,6 +844,21 @@ var tableClusterSystemInfoCols = []columnInfo{
{"VALUE", mysql.TypeVarchar, 128, 0, nil, nil},
}

var tableDDLJobsCols = []columnInfo{
{"JOB_ID", mysql.TypeLonglong, 4, 0, nil, nil},
{"DB_NAME", mysql.TypeVarchar, 64, 0, nil, nil},
{"TABLE_NAME", mysql.TypeVarchar, 64, 0, nil, nil},
{"JOB_TYPE", mysql.TypeVarchar, 64, 0, nil, nil},
{"SCHEMA_STATE", mysql.TypeVarchar, 64, 0, nil, nil},
{"SCHEMA_ID", mysql.TypeLonglong, 4, 0, nil, nil},
{"TABLE_ID", mysql.TypeLonglong, 4, 0, nil, nil},
{"ROW_COUNT", mysql.TypeLonglong, 4, 0, nil, nil},
{"START_TIME", mysql.TypeVarchar, 64, 0, nil, nil},
{"END_TIME", mysql.TypeVarchar, 64, 0, nil, nil},
{"STATE", mysql.TypeVarchar, 64, 0, nil, nil},
reafans marked this conversation as resolved.
Show resolved Hide resolved
{"QUERY", mysql.TypeVarchar, 64, 0, nil, nil},
}

func dataForTiKVRegionStatus(ctx sessionctx.Context) (records [][]types.Datum, err error) {
tikvStore, ok := ctx.GetStore().(tikv.Storage)
if !ok {
Expand Down Expand Up @@ -2449,6 +2467,7 @@ var tableNameToColumns = map[string][]columnInfo{
TableMetricSummaryByLabel: tableMetricSummaryByLabelCols,
TableMetricTables: tableMetricTablesCols,
TableInspectionSummary: tableInspectionSummaryCols,
TableDDLJobs: tableDDLJobsCols,
}

func createInfoSchemaTable(_ autoid.Allocators, meta *model.TableInfo) (table.Table, error) {
Expand Down
4 changes: 2 additions & 2 deletions meta/meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -779,8 +779,8 @@ func (m *Meta) GetLastHistoryDDLJobsIterator() (*LastJobIterator, error) {
}, nil
}

// GetLastJobs gets last several jobs.
func (i *LastJobIterator) GetLastJobs(num int, jobs []*model.Job) ([]*model.Job, error) {
// GetNextJobs gets next several jobs.
func (i *LastJobIterator) GetNextJobs(num int, jobs []*model.Job) ([]*model.Job, error) {
reafans marked this conversation as resolved.
Show resolved Hide resolved
if len(jobs) < num {
jobs = make([]*model.Job, 0, num)
}
Expand Down