Skip to content

Commit

Permalink
server: reduce "growslice" in "dumpRowValuesBinary" (#4916)
Browse files Browse the repository at this point in the history
  • Loading branch information
zz-jason committed Nov 2, 2017
1 parent dbbe720 commit 91196a2
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 116 deletions.
49 changes: 19 additions & 30 deletions server/column.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@

package server

import (
"github.com/pingcap/tidb/util/arena"
)

// ColumnInfo contains information of a column
type ColumnInfo struct {
Schema string
Expand All @@ -34,34 +30,27 @@ type ColumnInfo struct {
}

// Dump dumps ColumnInfo to bytes.
func (column *ColumnInfo) Dump(alloc arena.Allocator) []byte {
l := len(column.Schema) + len(column.Table) + len(column.OrgTable) + len(column.Name) + len(column.OrgName) + len(column.DefaultValue) + 48

data := make([]byte, 0, l)

data = append(data, dumpLengthEncodedString([]byte("def"), alloc)...)

data = append(data, dumpLengthEncodedString([]byte(column.Schema), alloc)...)

data = append(data, dumpLengthEncodedString([]byte(column.Table), alloc)...)
data = append(data, dumpLengthEncodedString([]byte(column.OrgTable), alloc)...)

data = append(data, dumpLengthEncodedString([]byte(column.Name), alloc)...)
data = append(data, dumpLengthEncodedString([]byte(column.OrgName), alloc)...)

data = append(data, 0x0c)

data = append(data, dumpUint16(column.Charset)...)
data = append(data, dumpUint32(column.ColumnLength)...)
data = append(data, column.Type)
data = append(data, dumpUint16(column.Flag)...)
data = append(data, column.Decimal)
data = append(data, 0, 0)
func (column *ColumnInfo) Dump(buffer []byte) []byte {
buffer = dumpLengthEncodedString(buffer, []byte("def"))
buffer = dumpLengthEncodedString(buffer, []byte(column.Schema))
buffer = dumpLengthEncodedString(buffer, []byte(column.Table))
buffer = dumpLengthEncodedString(buffer, []byte(column.OrgTable))
buffer = dumpLengthEncodedString(buffer, []byte(column.Name))
buffer = dumpLengthEncodedString(buffer, []byte(column.OrgName))

buffer = append(buffer, 0x0c)

buffer = dumpUint16(buffer, column.Charset)
buffer = dumpUint32(buffer, column.ColumnLength)
buffer = append(buffer, column.Type)
buffer = dumpUint16(buffer, column.Flag)
buffer = append(buffer, column.Decimal)
buffer = append(buffer, 0, 0)

if column.DefaultValue != nil {
data = append(data, dumpUint64(uint64(len(column.DefaultValue)))...)
data = append(data, column.DefaultValue...)
buffer = dumpUint64(buffer, uint64(len(column.DefaultValue)))
buffer = append(buffer, column.DefaultValue...)
}

return data
return buffer
}
33 changes: 17 additions & 16 deletions server/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func (cc *clientConn) handshake() error {
data = append(data, mysql.OKHeader)
data = append(data, 0, 0)
if cc.capability&mysql.ClientProtocol41 > 0 {
data = append(data, dumpUint16(mysql.ServerStatusAutocommit)...)
data = dumpUint16(data, mysql.ServerStatusAutocommit)
data = append(data, 0, 0)
}

Expand Down Expand Up @@ -151,7 +151,7 @@ func (cc *clientConn) writeInitialHandshake() error {
}
data = append(data, cc.collation)
// status
data = append(data, dumpUint16(mysql.ServerStatusAutocommit)...)
data = dumpUint16(data, mysql.ServerStatusAutocommit)
// below 13 byte may not be used
// capability flag upper 2 bytes, using default capability here
data = append(data, byte(cc.server.capability>>16), byte(cc.server.capability>>24))
Expand Down Expand Up @@ -561,11 +561,11 @@ func (cc *clientConn) flush() error {
func (cc *clientConn) writeOK() error {
data := cc.alloc.AllocWithLen(4, 32)
data = append(data, mysql.OKHeader)
data = append(data, dumpLengthEncodedInt(cc.ctx.AffectedRows())...)
data = append(data, dumpLengthEncodedInt(cc.ctx.LastInsertID())...)
data = dumpLengthEncodedInt(data, cc.ctx.AffectedRows())
data = dumpLengthEncodedInt(data, cc.ctx.LastInsertID())
if cc.capability&mysql.ClientProtocol41 > 0 {
data = append(data, dumpUint16(cc.ctx.Status())...)
data = append(data, dumpUint16(cc.ctx.WarningCount())...)
data = dumpUint16(data, cc.ctx.Status())
data = dumpUint16(data, cc.ctx.WarningCount())
}

err := cc.writePacket(data)
Expand Down Expand Up @@ -616,12 +616,12 @@ func (cc *clientConn) writeEOF(more bool) error {

data = append(data, mysql.EOFHeader)
if cc.capability&mysql.ClientProtocol41 > 0 {
data = append(data, dumpUint16(cc.ctx.WarningCount())...)
data = dumpUint16(data, cc.ctx.WarningCount())
status := cc.ctx.Status()
if more {
status |= mysql.ServerMoreResultsExists
}
data = append(data, dumpUint16(status)...)
data = dumpUint16(data, status)
}

err := cc.writePacket(data)
Expand Down Expand Up @@ -762,7 +762,7 @@ func (cc *clientConn) handleFieldList(sql string) (err error) {
data := make([]byte, 4, 1024)
for _, v := range columns {
data = data[0:4]
data = append(data, v.Dump(cc.alloc)...)
data = v.Dump(data)
if err := cc.writePacket(data); err != nil {
return errors.Trace(err)
}
Expand Down Expand Up @@ -791,16 +791,15 @@ func (cc *clientConn) writeResultset(rs ResultSet, binary bool, more bool) error
return errors.Trace(err)
}

columnLen := dumpLengthEncodedInt(uint64(len(columns)))
data := cc.alloc.AllocWithLen(4, 1024)
data = append(data, columnLen...)
data = dumpLengthEncodedInt(data, uint64(len(columns)))
if err = cc.writePacket(data); err != nil {
return errors.Trace(err)
}

for _, v := range columns {
data = data[0:4]
data = append(data, v.Dump(cc.alloc)...)
data = v.Dump(data)
if err = cc.writePacket(data); err != nil {
return errors.Trace(err)
}
Expand All @@ -810,6 +809,8 @@ func (cc *clientConn) writeResultset(rs ResultSet, binary bool, more bool) error
return errors.Trace(err)
}

numBytes4Null := ((len(columns) + 7 + 2) / 8)
rowBuffer := make([]byte, 1+numBytes4Null, 1+numBytes4Null+8*(len(columns)))
for {
if err != nil {
return errors.Trace(err)
Expand All @@ -819,12 +820,12 @@ func (cc *clientConn) writeResultset(rs ResultSet, binary bool, more bool) error
}
data = data[0:4]
if binary {
var rowData []byte
rowData, err = dumpRowValuesBinary(cc.alloc, columns, row)
rowBuffer = rowBuffer[0 : 1+numBytes4Null : cap(rowBuffer)]
rowBuffer, err = dumpRowValuesBinary(rowBuffer, columns, row)
if err != nil {
return errors.Trace(err)
}
data = append(data, rowData...)
data = append(data, rowBuffer...)
} else {
for i, value := range row {
if value.IsNull() {
Expand All @@ -836,7 +837,7 @@ func (cc *clientConn) writeResultset(rs ResultSet, binary bool, more bool) error
if err != nil {
return errors.Trace(err)
}
data = append(data, dumpLengthEncodedString(valData, cc.alloc)...)
data = dumpLengthEncodedString(data, valData)
}
}

Expand Down
10 changes: 5 additions & 5 deletions server/conn_stmt.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ func (cc *clientConn) handleStmtPrepare(sql string) error {
//status ok
data = append(data, 0)
//stmt id
data = append(data, dumpUint32(uint32(stmt.ID()))...)
data = dumpUint32(data, uint32(stmt.ID()))
//number columns
data = append(data, dumpUint16(uint16(len(columns)))...)
data = dumpUint16(data, uint16(len(columns)))
//number params
data = append(data, dumpUint16(uint16(len(params)))...)
data = dumpUint16(data, uint16(len(params)))
//filter [00]
data = append(data, 0)
//warning count
Expand All @@ -71,7 +71,7 @@ func (cc *clientConn) handleStmtPrepare(sql string) error {
if len(params) > 0 {
for i := 0; i < len(params); i++ {
data = data[0:4]
data = append(data, params[i].Dump(cc.alloc)...)
data = params[i].Dump(data)

if err := cc.writePacket(data); err != nil {
return errors.Trace(err)
Expand All @@ -86,7 +86,7 @@ func (cc *clientConn) handleStmtPrepare(sql string) error {
if len(columns) > 0 {
for i := 0; i < len(columns); i++ {
data = data[0:4]
data = append(data, columns[i].Dump(cc.alloc)...)
data = columns[i].Dump(data)

if err := cc.writePacket(data); err != nil {
return errors.Trace(err)
Expand Down
Loading

0 comments on commit 91196a2

Please sign in to comment.