diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index aa09616d8a..069ef3e863 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -19,7 +19,6 @@ import ( "github.com/juju/errors" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/mysql" @@ -234,23 +233,13 @@ func NewHandle(store kv.Storage) *Handle { store: store, } // init memory tables - initMemoryTables(store) - initPerfSchema(store) + initMemoryTables() + initPerfSchema() return h } -func initPerfSchema(store kv.Storage) { - perfHandle = perfschema.NewPerfHandle(store) -} - -func genGlobalID(store kv.Storage) (int64, error) { - var globalID int64 - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - var err error - globalID, err = meta.NewMeta(txn).GenGlobalID() - return errors.Trace(err) - }) - return globalID, errors.Trace(err) +func initPerfSchema() { + perfHandle = perfschema.NewPerfHandle() } var ( @@ -271,39 +260,21 @@ var ( perfHandle perfschema.PerfSchema ) -func setColumnID(meta *model.TableInfo, store kv.Storage) error { - var err error - for _, c := range meta.Columns { - c.ID, err = genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -func initMemoryTables(store kv.Storage) error { +func initMemoryTables() error { // Init Information_Schema var ( err error tbl table.Table ) - dbID, err := genGlobalID(store) - if err != nil { - return errors.Trace(err) - } + dbID := autoid.GenLocalSchemaID() nameToTable = make(map[string]table.Table) isTables := make([]*model.TableInfo, 0, len(tableNameToColumns)) for name, cols := range tableNameToColumns { meta := buildTableMeta(name, cols) isTables = append(isTables, meta) - meta.ID, err = genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - err = setColumnID(meta, store) - if err != nil { - return errors.Trace(err) + meta.ID = autoid.GenLocalSchemaID() + for _, c := range meta.Columns { + c.ID = autoid.GenLocalSchemaID() } alloc := autoid.NewMemoryAllocator(dbID) tbl, err = createMemoryTable(meta, alloc) diff --git a/meta/autoid/autoid.go b/meta/autoid/autoid.go index be1a9a502a..e647299e54 100644 --- a/meta/autoid/autoid.go +++ b/meta/autoid/autoid.go @@ -14,7 +14,9 @@ package autoid import ( + "math" "sync" + "sync/atomic" "github.com/juju/errors" "github.com/ngaut/log" @@ -184,3 +186,10 @@ func NewMemoryAllocator(dbID int64) Allocator { //autoid error codes. const codeInvalidTableID terror.ErrCode = 1 + +var localSchemaID int64 = math.MaxInt64 + +// GenLocalSchemaID generates a local schema ID. +func GenLocalSchemaID() int64 { + return atomic.AddInt64(&localSchemaID, -1) +} diff --git a/perfschema/init.go b/perfschema/init.go index d08317a53d..9a8241c5d9 100644 --- a/perfschema/init.go +++ b/perfschema/init.go @@ -15,8 +15,6 @@ package perfschema import ( "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/mysql" @@ -190,27 +188,6 @@ var stagesCurrentCols = []columnInfo{ {mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}}, } -func setColumnID(meta *model.TableInfo, store kv.Storage) error { - var err error - for _, c := range meta.Columns { - c.ID, err = genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -func genGlobalID(store kv.Storage) (int64, error) { - var globalID int64 - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - var err error - globalID, err = meta.NewMeta(txn).GenGlobalID() - return errors.Trace(err) - }) - return globalID, errors.Trace(err) -} - func createMemoryTable(meta *model.TableInfo, alloc autoid.Allocator) (table.Table, error) { tbl, _ := tables.MemoryTableFromMeta(alloc, meta) return tbl, nil @@ -219,29 +196,21 @@ func createMemoryTable(meta *model.TableInfo, alloc autoid.Allocator) (table.Tab func (ps *perfSchema) buildTables() error { tbls := make([]*model.TableInfo, 0, len(ps.tables)) ps.mTables = make(map[string]table.Table, len(ps.tables)) - dbID, err := genGlobalID(ps.store) - if err != nil { - return errors.Trace(err) - } + dbID := autoid.GenLocalSchemaID() // Set PKIsHandle // TableStmtsCurrent use THREAD_ID as PK and handle tb := ps.tables[TableStmtsHistory] tb.PKIsHandle = true tb.Columns[0].Flag = tb.Columns[0].Flag | mysql.PriKeyFlag - var tbl table.Table for name, meta := range ps.tables { tbls = append(tbls, meta) - meta.ID, err = genGlobalID(ps.store) - if err != nil { - return errors.Trace(err) - } - err = setColumnID(meta, ps.store) - if err != nil { - return errors.Trace(err) + meta.ID = autoid.GenLocalSchemaID() + for _, c := range meta.Columns { + c.ID = autoid.GenLocalSchemaID() } alloc := autoid.NewMemoryAllocator(dbID) - tbl, err = createMemoryTable(meta, alloc) + tbl, err := createMemoryTable(meta, alloc) if err != nil { return errors.Trace(err) } diff --git a/perfschema/perfschema.go b/perfschema/perfschema.go index 384d95cb5a..7aa14f20ab 100644 --- a/perfschema/perfschema.go +++ b/perfschema/perfschema.go @@ -67,9 +67,8 @@ var ( ) // NewPerfHandle creates a new perfSchema on store. -func NewPerfHandle(store kv.Storage) PerfSchema { +func NewPerfHandle() PerfSchema { schema := PerfHandle.(*perfSchema) - schema.store = store schema.historyHandles = make([]int64, 0, stmtsHistoryElemMax) err := schema.initialize() if err != nil {