*:generate local schema ID for memory table. (#1094)
* *:generate local schema ID for memory table. * meta/autoid: reorder import
This commit is contained in:
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user