|
@@ -7,7 +7,6 @@ import (
|
|
|
"os"
|
|
"os"
|
|
|
"sync"
|
|
"sync"
|
|
|
"testing"
|
|
"testing"
|
|
|
- "time"
|
|
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
var (
|
|
@@ -694,9 +693,16 @@ func TestStmtMultiRows(t *testing.T) {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-var canStop bool
|
|
|
|
|
|
|
+func TestConcurrent(t *testing.T) {
|
|
|
|
|
+ if os.Getenv("MYSQL_TEST_CONCURRENT") != "1" {
|
|
|
|
|
+ t.Log("CONCURRENT env var not set. Skipping TestConcurrent")
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ if !getEnv() {
|
|
|
|
|
+ t.Logf("MySQL-Server not running on %s. Skipping TestConcurrent", netAddr)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-func doStuff(t *testing.T) {
|
|
|
|
|
db, err := sql.Open("mysql", dsn)
|
|
db, err := sql.Open("mysql", dsn)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
t.Fatalf("Error connecting: %v", err)
|
|
t.Fatalf("Error connecting: %v", err)
|
|
@@ -704,32 +710,45 @@ func doStuff(t *testing.T) {
|
|
|
|
|
|
|
|
defer db.Close()
|
|
defer db.Close()
|
|
|
|
|
|
|
|
- for !canStop {
|
|
|
|
|
- _, err := db.Exec("SELECT 1")
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- canStop = true
|
|
|
|
|
- t.Fatalf(err.Error())
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ var max int
|
|
|
|
|
+ err = db.QueryRow("SELECT @@max_connections").Scan(&max)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Fatalf("%v", err)
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-func TestConcurrent(t *testing.T) {
|
|
|
|
|
- if os.Getenv("MYSQL_TEST_CONCURRENT") != "1" {
|
|
|
|
|
- t.Log("CONCURRENT env var not set. Skipping TestConcurrent")
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- if !getEnv() {
|
|
|
|
|
- t.Logf("MySQL-Server not running on %s. Skipping TestConcurrent", netAddr)
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ t.Logf("Testing %d concurrent connections \r\n", max)
|
|
|
|
|
|
|
|
- fmt.Println("Run")
|
|
|
|
|
|
|
+ canStop := false
|
|
|
|
|
|
|
|
- canStop = false
|
|
|
|
|
- for i := 0; i < 500; i++ {
|
|
|
|
|
- go doStuff(t)
|
|
|
|
|
|
|
+ c := make(chan struct{}, max)
|
|
|
|
|
+ for i := 0; i < max; i++ {
|
|
|
|
|
+ go func() {
|
|
|
|
|
+ tx, err := db.Begin()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ canStop = true
|
|
|
|
|
+ t.Fatalf("Error on Con %d: %s", i, err.Error())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c <- struct{}{}
|
|
|
|
|
+
|
|
|
|
|
+ for !canStop {
|
|
|
|
|
+ _, err := tx.Exec("SELECT 1")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ canStop = true
|
|
|
|
|
+ t.Fatalf("Error on Con %d: %s", i, err.Error())
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ err = tx.Commit()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ canStop = true
|
|
|
|
|
+ t.Fatalf("Error on Con %d: %s", i, err.Error())
|
|
|
|
|
+ }
|
|
|
|
|
+ }()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- time.Sleep(3 * time.Second)
|
|
|
|
|
|
|
+ for i := 0; i < max; i++ {
|
|
|
|
|
+ <-c
|
|
|
|
|
+ }
|
|
|
canStop = true
|
|
canStop = true
|
|
|
}
|
|
}
|