qiniu / qmgo

Qmgo - The Go driver for MongoDB. It‘s based on official mongo-go-driver but easier to use like Mgo.
Apache License 2.0
1.3k stars 152 forks source link

V1.0.2 exists data race #195

Closed UnderTreeTech closed 3 years ago

UnderTreeTech commented 3 years ago

MongoDB Version: 3.6.23 Qmgo Version: 1.0.2 Test Command: go test -race -coverprofile=coverage.txt -covermode=atomic ./...

Recently I upgrade qmgo to v1.0.2, and I got data race error when I run test with -race flag. Folling is the error output.

Previous read at 0x00c0003af300 by goroutine 7: go.mongodb.org/mongo-driver/x/mongo/driver/topology.(pool).stale() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/pool.go:199 +0x1f5 go.mongodb.org/mongo-driver/x/mongo/driver/topology.connectionExpiredFunc() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/pool.go:97 +0x1b1 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(resourcePool).Get() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/resource_pool.go:125 +0x215 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(pool).get() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/pool.go:388 +0x6b5 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(Server).Connection() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/server.go:268 +0x233 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*SelectedServer).Connection()

:1 +0x6c go.mongodb.org/mongo-driver/x/mongo/driver.Operation.getServerAndConnection() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/operation.go:246 +0x103 go.mongodb.org/mongo-driver/x/mongo/driver.Operation.Execute() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/operation.go:301 +0x107 go.mongodb.org/mongo-driver/x/mongo/driver/operation.(*Command).Execute() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/operation/command.go:104 +0x318 go.mongodb.org/mongo-driver/mongo.(*Database).RunCommand() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/mongo/database.go:203 +0x27a go.mongodb.org/mongo-driver/mongo.(*Client).Ping() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/mongo/client.go:265 +0x23c github.com/qiniu/qmgo.client() /Users/go/pkg/mod/github.com/qiniu/qmgo@v1.0.2/client.go:165 +0x1fe github.com/qiniu/qmgo.NewClient() /Users/go/pkg/mod/github.com/qiniu/qmgo@v1.0.2/client.go:142 +0xaf mongo.New() /Users/Desktop/mongo/mongo.go:24 +0xf2 mongo.TestMongo() /Users/Desktop/mongo/mongo_test.go:18 +0x126 testing.tRunner() /usr/local/go/src/testing/testing.go:1259 +0x22f testing.(*T).Run·dwrap·21() /usr/local/go/src/testing/testing.go:1306 +0x47 Goroutine 30 (running) created at: go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*pool).connectionInitFunc() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/pool.go:134 +0xfc go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*pool).connectionInitFunc-fm() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/pool.go:128 +0x39 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*resourcePool).add() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/resource_pool.go:102 +0x57 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*resourcePool).Maintain() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/resource_pool.go:210 +0x271 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*resourcePool).initialize() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/resource_pool.go:95 +0x10e go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*pool).connect() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/pool.go:208 +0x84 go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*Server).Connect() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/server.go:215 +0x2f5 go.mongodb.org/mongo-driver/x/mongo/driver/topology.ConnectServer() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/server.go:136 +0x9a go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*Topology).addServer() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/topology.go:686 +0x14d go.mongodb.org/mongo-driver/x/mongo/driver/topology.(*Topology).Connect() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/x/mongo/driver/topology/topology.go:213 +0xeac go.mongodb.org/mongo-driver/mongo.(*Client).Connect() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/mongo/client.go:156 +0x92 go.mongodb.org/mongo-driver/mongo.Connect() /Users/go/pkg/mod/go.mongodb.org/mongo-driver@v1.7.1/mongo/client.go:106 +0x67 github.com/qiniu/qmgo.client() /Users/go/pkg/mod/github.com/qiniu/qmgo@v1.0.2/client.go:157 +0xa4 github.com/qiniu/qmgo.NewClient() /Users/go/pkg/mod/github.com/qiniu/qmgo@v1.0.2/client.go:142 +0xaf mongo.New() /Users/Desktop/mongo/mongo.go:24 +0xf2 mongo.TestMongo() /Users/Desktop/mongo/mongo_test.go:18 +0x126 testing.tRunner() /usr/local/go/src/testing/testing.go:1259 +0x22f testing.(*T).Run·dwrap·21() /usr/local/go/src/testing/testing.go:1306 +0x47 Goroutine 7 (running) created at: testing.(*T).Run() /usr/local/go/src/testing/testing.go:1306 +0x726 testing.runTests.func1() /usr/local/go/src/testing/testing.go:1598 +0x99 testing.tRunner() /usr/local/go/src/testing/testing.go:1259 +0x22f testing.runTests() /usr/local/go/src/testing/testing.go:1596 +0x7ca testing.(*M).Run() /usr/local/go/src/testing/testing.go:1504 +0x9d1 main.main() _testmain.go:91 +0x324 ================== ``` - Following is my test code mongo.go ```go package mongo import ( "context" "fmt" "github.com/qiniu/qmgo" ) // Config MongoDB DSN configs type Config struct { DSN string DBName string MaxPoolSize uint64 MinPoolSize uint64 } type UserInfo struct { ID int64 `bson:"_id"` Name string `bson:"name"` } func New(cfg *Config) (*qmgo.Client, func() error) { cli, err := qmgo.NewClient(context.Background(), &qmgo.Config{ Uri: cfg.DSN, MaxPoolSize: &cfg.MaxPoolSize, MinPoolSize: &cfg.MinPoolSize, }) if err != nil { panic(fmt.Sprintf("open mongo client fail, err is %s", err.Error())) } return cli, func() error { return cli.Close(context.Background()) } } ``` mongo_test.go ```go package mongo import ( "context" "testing" "github.com/stretchr/testify/assert" ) func TestMongo(t *testing.T) { ctx := context.Background() cfg := &Config{ DSN: "mongodb://root:123456@127.0.0.1:27017/?connect=direct", DBName: "test_mongo", MaxPoolSize: 100, MinPoolSize: 10, } cli, close := New(cfg) defer close() coll := cli.Database(cfg.DBName).Collection("user") // single insert _, err := coll.InsertOne(ctx, &UserInfo{ ID: int64(211023454441556), Name: "qmgo", }) assert.Nil(t, err) } ```
jiangz222 commented 3 years ago

Need to test official driver in the same way.

jiangz222 commented 3 years ago

fix in release v.1.0.3