Skip to content

Commit

Permalink
Merge pull request pingcap#770 from yanzhe-chen/connection-id
Browse files Browse the repository at this point in the history
Unify session ID and connection ID
  • Loading branch information
shenli committed Dec 22, 2015
2 parents 7dc33aa + cfe157f commit b44cabe
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 31 deletions.
22 changes: 1 addition & 21 deletions expression/builtin/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/sessionctx/db"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/terror"
)

// See: https://dev.mysql.com/doc/refman/5.7/en/information-functions.html
Expand Down Expand Up @@ -69,30 +68,11 @@ func builtinUser(args []interface{}, data map[interface{}]interface{}) (v interf
return variable.GetSessionVars(ctx).User, nil
}

// connectionIDKeyType is a dummy type to avoid naming collision in context.
type connectionIDKeyType int

// String defines a Stringer function for debugging and pretty printing.
func (k connectionIDKeyType) String() string {
return "connection_id"
}

// ConnectionIDKey is the key for get connection id from context
const ConnectionIDKey connectionIDKeyType = 0

func builtinConnectionID(args []interface{}, data map[interface{}]interface{}) (v interface{}, err error) {
c, ok := data[ExprEvalArgCtx]
if !ok {
return nil, errors.Errorf("Missing ExprEvalArgCtx when evalue builtin")
}
ctx := c.(context.Context)
idValue := ctx.Value(ConnectionIDKey)
if idValue == nil {
return nil, terror.MissConnectionID
}
id, ok := idValue.(int64)
if !ok {
return nil, terror.MissConnectionID.Gen("connection id is not int64 but %T", idValue)
}
return id, nil
return variable.GetSessionVars(ctx).ConnectionID, nil
}
6 changes: 4 additions & 2 deletions expression/builtin/info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,11 @@ func (s *testBuiltinSuite) TestConnectionID(c *C) {
ctx := mock.NewContext()
m := map[interface{}]interface{}{}
variable.BindSessionVars(ctx)
ctx.SetValue(ConnectionIDKey, int64(1))
sessionVars := variable.GetSessionVars(ctx)
sessionVars.ConnectionID = uint64(1)

m[ExprEvalArgCtx] = ctx
v, err := builtinConnectionID(nil, m)
c.Assert(err, IsNil)
c.Assert(v, Equals, int64(1))
c.Assert(v, Equals, uint64(1))
}
9 changes: 5 additions & 4 deletions session.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import (
"github.com/juju/errors"
"github.com/ngaut/log"
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/expression/builtin"
"github.com/pingcap/tidb/field"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
Expand Down Expand Up @@ -65,6 +64,7 @@ type Session interface {
ExecutePreparedStmt(stmtID uint32, param ...interface{}) (rset.Recordset, error)
DropPreparedStmt(stmtID uint32) error
SetClientCapability(uint32) // Set client capability flags
SetConnectionID(uint64)
Close() error
Retry() error
Auth(user string, auth []byte, salt []byte) bool
Expand Down Expand Up @@ -145,6 +145,10 @@ func (s *session) SetClientCapability(capability uint32) {
variable.GetSessionVars(s).ClientCapability = capability
}

func (s *session) SetConnectionID(connectionID uint64) {
variable.GetSessionVars(s).ConnectionID = connectionID
}

func (s *session) FinishTxn(rollback bool) error {
// transaction has already been committed or rolled back
if s.txn == nil {
Expand Down Expand Up @@ -580,9 +584,6 @@ func CreateSession(store kv.Storage) (Session, error) {
variable.BindSessionVars(s)
variable.GetSessionVars(s).SetStatusFlag(mysql.ServerStatusAutocommit, true)

// set connection id
s.SetValue(builtin.ConnectionIDKey, s.sid)

// session implements variable.GlobalVarAccessor. Bind it to ctx.
variable.BindGlobalVarAccessor(s, s)

Expand Down
3 changes: 3 additions & 0 deletions sessionctx/variable/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ type SessionVars struct {
// Client capability
ClientCapability uint32

// Connection ID
ConnectionID uint64

// Found rows
FoundRows uint64

Expand Down
2 changes: 1 addition & 1 deletion tidb-server/server/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ func (cc *clientConn) readHandshakeResponse() error {
}
}
// Open session and do auth
cc.ctx, err = cc.server.driver.OpenCtx(cc.capability, uint8(cc.collation), cc.dbname)
cc.ctx, err = cc.server.driver.OpenCtx(uint64(cc.connectionID), cc.capability, uint8(cc.collation), cc.dbname)
if err != nil {
cc.Close()
return errors.Trace(err)
Expand Down
4 changes: 2 additions & 2 deletions tidb-server/server/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ package server

// IDriver opens IContext.
type IDriver interface {
// OpenCtx opens an IContext with client capability, collation and dbname.
OpenCtx(capability uint32, collation uint8, dbname string) (IContext, error)
// OpenCtx opens an IContext with connection id, client capability, collation and dbname.
OpenCtx(connID uint64, capability uint32, collation uint8, dbname string) (IContext, error)
}

// IContext is the interface to execute commant.
Expand Down
3 changes: 2 additions & 1 deletion tidb-server/server/driver_tidb.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,10 @@ func (ts *TiDBStatement) Close() error {
}

// OpenCtx implements IDriver.
func (qd *TiDBDriver) OpenCtx(capability uint32, collation uint8, dbname string) (IContext, error) {
func (qd *TiDBDriver) OpenCtx(connID uint64, capability uint32, collation uint8, dbname string) (IContext, error) {
session, _ := tidb.CreateSession(qd.store)
session.SetClientCapability(capability)
session.SetConnectionID(connID)
if dbname != "" {
_, err := session.Execute("use " + dbname)
if err != nil {
Expand Down

0 comments on commit b44cabe

Please sign in to comment.