Closed
Description
Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (go version
)?
go version go1.9.2 linux/amd64
Does this issue reproduce with the latest release?
i don't know
What operating system and processor architecture are you using (go env
)?
GOARCH="amd64"
GOBIN="/home/doctorq/go-dev/bin"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/doctorq/go-dev"
GORACE=""
GOROOT="/home/doctorq/soft/sf-go"
GOTOOLDIR="/home/doctorq/soft/sf-go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build599015506=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
What did you do?
grpc server application
mysql:https://github.com/go-sql-driver/mysql
func (p *MysqlAdapter) ParserRows(ctx context.Context, rows *sql.Rows) ([]sync.Map, error) {
if rows == nil {
errStr := "rows is nil"
return nil, errors.New(errStr)
}
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
errStr := fmt.Sprintf("rows.Columns error:[%s]", err.Error())
log.Error(ctx, errStr)
return nil, errors.New(errStr)
}
count := len(columns)
values := make([][]byte, count)
scans := make([]interface{}, count)
for i, _ := range columns {
scans[i] = &values[i]
}
var syncMaps []sync.Map
for rows.Next() {
if err := rows.Scan(scans...); err != nil {
errStr := "mysql scan failed"
log.Errorf(ctx, errStr)
return nil, errors.New(errStr)
}
var syncMap sync.Map
for k, v := range values {
key := columns[k]
syncMap.Store(key, string(v))
}
syncMaps = append(syncMaps, syncMap)
}
// log.Infof(ctx, "row size:[%d]", len(syncMaps))
return syncMaps, nil
}
What did you expect to see?
no panic
What did you see instead?
[mysql] 2018/09/02 23:17:35 packets.go:72: read tcp xx:39151->xx:3306: i/o timeout
[mysql] 2018/09/02 23:17:35 packets.go:408: busy buffer
[mysql] 2018/09/02 23:17:35 packets.go:72: read tcp xx:39151->xx:3306: i/o timeout
[mysql] 2018/09/02 23:17:35 packets.go:408: busy buffer
[mysql] 2018/09/02 23:17:35 connection.go:372: invalid connection
[mysql] 2018/09/02 23:17:35 connection.go:372: invalid connection
[mysql] 2018/09/02 23:17:35 packets.go:72: read tcp xx:39151->xx:3306: i/o timeout
[mysql] 2018/09/02 23:17:35 packets.go:408: busy buffer
[mysql] 2018/09/02 23:17:35 connection.go:372: invalid connection
fatal error: concurrent map writes
goroutine 4932 [running]:
runtime.throw(0xcadf03, 0x15)
/home/doctorq/soft/sf-go/src/runtime/panic.go:605 +0x95 fp=0xc422162758 sp=0xc422162738 pc=0x42d415
runtime.mapdelete_fast64(0xb7d760, 0xc420180ff0, 0x91d)
/home/doctorq/soft/sf-go/src/runtime/hashmap_fast.go:755 +0x212 fp=0xc4221627a0 sp=0xc422162758 pc=0x40ed12
database/sql.(*DB).putConnDBLocked(0xc4201beaa0, 0xc4201880e0, 0x0, 0x0, 0x0)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:1109 +0x258 fp=0xc422162888 sp=0xc4221627a0 pc=0x919798
database/sql.(*DB).putConn(0xc4201beaa0, 0xc4201880e0, 0x0, 0x0)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:1079 +0x10d fp=0xc4221628f0 sp=0xc422162888 pc=0x91943d
database/sql.(*driverConn).releaseConn(0xc4201880e0, 0x0, 0x0)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:380 +0x47 fp=0xc422162920 sp=0xc4221628f0 pc=0x915897
database/sql.(*driverConn).(database/sql.releaseConn)-fm(0x0, 0x0)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:643 +0x3e fp=0xc422162948 sp=0xc422162920 pc=0x92437e
database/sql.(*Rows).close(0xc4213c1080, 0x0, 0x0, 0x0, 0x0)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:2767 +0x15c fp=0xc422162998 sp=0xc422162948 pc=0x92261c
database/sql.(*Rows).Close(0xc4213c1080, 0xc4213c10b0, 0xc4221629f0)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:2738 +0x3d fp=0xc4221629d0 sp=0xc422162998 pc=0x92248d
database/sql.(*Rows).Next(0xc4213c1080, 0xc42733f780)
/home/doctorq/soft/sf-go/src/database/sql/sql.go:2445 +0xa4 fp=0xc422162a20 sp=0xc4221629d0 pc=0x920fa4
(*MysqlAdapter).ParserRows(0xc4200115c0, 0x11ca6a0, 0xc4263eab10, 0xc4213c1080, 0x0, 0x0, 0x0, 0x0, 0x0)