Skip to content

Commit

Permalink
*: support show status
Browse files Browse the repository at this point in the history
  • Loading branch information
zimulala committed Nov 13, 2015
1 parent 301ea1c commit 45f91fd
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 23 deletions.
3 changes: 3 additions & 0 deletions ddl/ddl.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/parser/coldef"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/table"
"github.com/pingcap/tidb/terror"
"github.com/pingcap/tidb/util/charset"
Expand Down Expand Up @@ -107,6 +108,8 @@ func newDDL(store kv.Storage, infoHandle *infoschema.Handle, hook Callback, leas

d.start()

variables.RegisterStatist(d)

return d
}

Expand Down
83 changes: 67 additions & 16 deletions ddl/stat.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,60 @@ import (
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/sessionctx/variable"
)

func (d *ddl) Stat() (map[string]interface{}, error) {
var (
ddl_server_id = "ddl_server_id"
ddl_schema_version = "ddl_schema_version"
ddl_owner_id = "ddl_owner_id"
ddl_owner_last_update_ts = "ddl_owner_last_update_ts"
ddl_job_id = "ddl_job_id"
ddl_job_action = "ddl_job_action"
ddl_job_last_update_ts = "ddl_job_last_update_ts"
ddl_job_state = "ddl_job_state"
ddl_job_error = "ddl_job_error"
ddl_job_schema_state = "ddl_job_schema_state"
ddl_job_schema_id = "ddl_job_schema_id"
ddl_job_table_id = "ddl_job_table_id"
ddl_job_snapshot_ver = "ddl_job_snapshot_ver"
ddl_job_reorg_handle = "ddl_job_reorg_handle"
ddl_job_args = "ddl_job_args"
)

var defaultStatusVars map[string]variables.ScopeFlag = map[string]variables.ScopeFlag{
{ScopeGlobal | ScopeSession, ddl_server_id},
{ScopeGlobal | ScopeSession, ddl_schema_version},
{ScopeGlobal | ScopeSession, ddl_owner_id},
{ScopeGlobal | ScopeSession, ddl_owner_last_update_ts},
{ScopeGlobal | ScopeSession, ddl_job_id},
{ScopeGlobal | ScopeSession, ddl_job_action},
{ScopeGlobal | ScopeSession, ddl_job_last_update_ts},
{ScopeGlobal | ScopeSession, ddl_job_state},
{ScopeGlobal | ScopeSession, ddl_job_error},
{ScopeGlobal | ScopeSession, ddl_job_schema_state},
{ScopeGlobal | ScopeSession, ddl_job_schema_id},
{ScopeGlobal | ScopeSession, ddl_job_table_id},
{ScopeGlobal | ScopeSession, ddl_job_snapshot_ver},
{ScopeGlobal | ScopeSession, ddl_job_reorg_handle},
{ScopeGlobal | ScopeSession, ddl_job_args},
{ScopeGlobal | ScopeSession, ddl_last_reload_schema_ts},
}

func (d *ddl) SetStatusScope(status string, scope variables.ScopeFlag) {
defaultStatusVars[status] = scope
}

func (d *ddl) FillStatusVal(status string, value interface{}) variables.StatusVal {
ok, scope := defaultStatusVars[status]
if !ok {
scope = variables.DefaultScopeFlag
}

return &variables.StatusVal{Scope: scope, Value: value}
}

func (d *ddl) Stat() (map[string]*variables.StatusVal, error) {
var (
owner *model.Owner
job *model.Job
Expand Down Expand Up @@ -59,28 +110,28 @@ func (d *ddl) Stat() (map[string]interface{}, error) {
}

m := make(map[string]interface{})
m["ddl_server_id"] = d.uuid
m[ddl_server_id] = d.FillStatusVal(ddl_server_id, d.uuid)

m["ddl_schema_version"] = schemaVer
m[ddl_schema_version] = d.FillStatusVal(ddl_schema_version, schemaVer)

if owner != nil {
m["ddl_owner_id"] = owner.OwnerID
m[ddl_owner_id] = d.FillStatusVal(ddl_owner_id, owner.OwnerID)
// LastUpdateTs uses nanosecond.
m["ddl_owner_last_update_ts"] = owner.LastUpdateTS / 1e9
m[ddl_owner_last_update_ts] = d.FillStatusVal(ddl_owner_last_update_ts, owner.LastUpdateTS/1e9)
}

if job != nil {
m["ddl_job_id"] = job.ID
m["ddl_job_action"] = job.Type.String()
m["ddl_job_last_update_ts"] = job.LastUpdateTS
m["ddl_job_state"] = job.State.String()
m["ddl_job_error"] = job.Error
m["ddl_job_schema_state"] = job.SchemaState.String()
m["ddl_job_schema_id"] = job.SchemaID
m["ddl_job_table_id"] = job.TableID
m["ddl_job_snapshot_ver"] = job.SnapshotVer
m["ddl_job_reorg_handle"] = reorgHandle
m["ddl_job_args"] = job.Args
m[ddl_job_id] = d.FillStatusVal(ddl_job_id, job.ID)
m[ddl_job_action] = d.FillStatusVal(ddl_job_action, job.Type.String())
m[ddl_job_last_update_ts] = d.FillStatusVal(ddl_job_last_update_ts, job.LastUpdateTS)
m[ddl_job_state] = d.FillStatusVal(ddl_job_state, job.State.String())
m[ddl_job_error] = d.FillStatusVal(ddl_job_error, job.Error)
m[ddl_job_schema_state] = d.FillStatusVal(ddl_job_schema_state, job.SchemaState.String())
m[ddl_job_schema_id] = d.FillStatusVal(ddl_job_schema_id, job.SchemaID)
m[ddl_job_table_id] = d.FillStatusVal(ddl_job_table_id, job.TableID)
m[ddl_job_snapshot_ver] = d.FillStatusVal(ddl_job_snapshot_ver, job.SnapshotVer)
m[ddl_job_reorg_handle] = d.FillStatusVal(ddl_job_reorg_handle, reorgHandle)
m[ddl_job_args] = d.FillStatusVal(ddl_job_args, job.Args)
}

return m, nil
Expand Down
11 changes: 5 additions & 6 deletions plan/plans/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,6 @@ func getSessionStatusVar(ctx context.Context, sessionVars *variable.SessionVars,

func getGlobalStatusVar(ctx context.Context, sessionVars *variable.SessionVars,
globalVars variable.GlobalVarAccessor, name string) (string, error) {

value, err := globalVars.GetGlobalStatusVar(ctx, name)
if err == nil {
return value, nil
Expand All @@ -505,13 +504,13 @@ func (s *ShowPlan) fetchShowStatus(ctx context.Context) error {
globalVars := variable.GetGlobalVarAccessor(ctx)
m := map[interface{}]interface{}{}

for _, v := range variable.StatusVars {
for _, status := range variable.StatusVals {
if s.Pattern != nil {
s.Pattern.Expr = expression.Value{Val: v.Name}
s.Pattern.Expr = expression.Value{Val: status}
} else if s.Where != nil {
m[expression.ExprEvalIdentFunc] = func(name string) (interface{}, error) {
if strings.EqualFold(name, "Variable_name") {
return v.Name, nil
return status, nil
}

return nil, errors.Errorf("unknown field %s", name)
Expand All @@ -528,12 +527,12 @@ func (s *ShowPlan) fetchShowStatus(ctx context.Context) error {

var value string
if !s.GlobalScope {
value, err = getSessionStatusVar(ctx, sessionVars, globalVars, v.Name)
value, err = getSessionStatusVar(ctx, sessionVars, globalVars, status)
if err != nil {
return errors.Trace(err)
}
} else if v.Scope != variable.ScopeSession {
value, err = getGlobalStatusVar(ctx, sessionVars, globalVars, v.Name)
value, err = getGlobalStatusVar(ctx, sessionVars, globalVars, status)
if err != nil {
return errors.Trace(err)
}
Expand Down
25 changes: 24 additions & 1 deletion sessionctx/variable/statusvar.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,30 @@ import (
)

// StatusVars is global status vars map.
var StatusVars map[string]*SysVar
var StatusVars []string
var Statists []Statist

// DefaultScopeFlag is the default scope flag.
var DefaultScopeFlag ScopeFlag = ScopeGlobal | ScopeSession

// StatusVal is the value of the corresponding status variable.
type StatusVal struct {
Scope ScopeFlag
Value interface{}
}

type Statist interface {
GetStatusVars() []string
SetStatusScope(status string, scope ScopeFlag)
FillStatusVal(status string, value interface{})
Stat() (map[string]*StatusVal, error)
}

//
func RegisterStatist(s Statist) {
Statists = append(Statists, s)
StatusVars = append(StatusVars, s.GetStatusVars()...)
}

// GetStatusVar returns status var infomation for name.
func GetStatusVar(name string) *SysVar {
Expand Down

0 comments on commit 45f91fd

Please sign in to comment.