@@ -19,6 +19,20 @@ import (
19
19
_ "github.com/go-sql-driver/mysql"
20
20
)
21
21
22
+ func init () {
23
+ rand .Seed (time .Now ().UnixNano ())
24
+ }
25
+
26
+ var letterRunes = []rune ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" )
27
+
28
+ func RandStringRunes (n int ) string {
29
+ b := make ([]rune , n )
30
+ for i := range b {
31
+ b [i ] = letterRunes [rand .Intn (len (letterRunes ))]
32
+ }
33
+ return string (b )
34
+ }
35
+
22
36
type Substitution struct {
23
37
Key string `json:"key"`
24
38
Min int `json:"min"`
@@ -36,6 +50,7 @@ type Config struct {
36
50
QueryTimeout int `json:"queryTimeout"`
37
51
ConnectionLifetime time.Duration `json:"connectionLifeTime"`
38
52
Substitution []Substitution `json:"substitution"`
53
+ Transactions bool `json:"transactions"`
39
54
}
40
55
41
56
var config = Config {
@@ -49,10 +64,10 @@ var config = Config{
49
64
QueryTimeout : 10 ,
50
65
ConnectionLifetime : 0 ,
51
66
Substitution : []Substitution {},
67
+ Transactions : false ,
52
68
}
53
69
var configFilePath string
54
70
var db * sql.DB
55
- var queryTimesInMS []int
56
71
var ops int64 = 0
57
72
var latency int64 = 0
58
73
@@ -74,7 +89,11 @@ func printQps() {
74
89
atomic .StoreInt64 (& ops , 0 )
75
90
loadedLatency := atomic .LoadInt64 (& latency )
76
91
atomic .StoreInt64 (& latency , 0 )
77
- fmt .Println ("qps: " , loadedOps / 5 , ", average latency: " , time .Duration (loadedLatency / loadedOps ))
92
+ if loadedOps != 0 {
93
+ fmt .Println ("qps: " , loadedOps / 5 , ", average latency: " , time .Duration (loadedLatency / loadedOps ))
94
+ } else {
95
+ fmt .Println ("qps: " , loadedOps / 5 )
96
+ }
78
97
79
98
}
80
99
@@ -120,20 +139,40 @@ func executeQuery(query string) {
120
139
defer cancel ()
121
140
122
141
for _ , subs := range config .Substitution {
123
- query = strings .Replace (query , subs .Key , strconv .Itoa (rand .Intn (subs .Max - subs .Min )+ subs .Min ), 1 )
142
+ if strings .Contains (subs .Key , "string" ) {
143
+ query = strings .Replace (query , subs .Key , RandStringRunes (rand .Intn (subs .Max - subs .Min )+ subs .Min ), 1 )
144
+ } else {
145
+ query = strings .Replace (query , subs .Key , strconv .Itoa (rand .Intn (subs .Max - subs .Min )+ subs .Min ), 1 )
146
+ }
124
147
}
125
148
126
149
if config .PrintLogs {
127
150
fmt .Println ("Executed " , query )
128
151
}
129
- if config .DryRun == false {
152
+ if ! config .DryRun {
130
153
start := time .Now ()
131
- _ , err := db .ExecContext (ctx , query )
132
- if err == nil {
154
+ if config .Transactions {
155
+ tx , err := db .BeginTx (ctx , nil )
156
+ if err != nil {
157
+ return
158
+ }
159
+ defer tx .Rollback ()
160
+ _ , err = tx .ExecContext (ctx , query )
161
+ if err != nil {
162
+ fmt .Fprintf (os .Stderr , "query err: %s\n " , err .Error ())
163
+ }
164
+ if err = tx .Commit (); err != nil {
165
+ fmt .Fprintf (os .Stderr , "commit err: %s\n " , err .Error ())
166
+ }
133
167
atomic .AddInt64 (& ops , 1 )
134
168
atomic .AddInt64 (& latency , int64 (time .Since (start )))
135
169
} else {
136
- fmt .Fprintf (os .Stderr , "query err: %s\n " , err .Error ())
170
+ _ , err := db .ExecContext (ctx , query )
171
+ if err != nil {
172
+ fmt .Fprintf (os .Stderr , "query err: %s\n " , err .Error ())
173
+ }
174
+ atomic .AddInt64 (& ops , 1 )
175
+ atomic .AddInt64 (& latency , int64 (time .Since (start )))
137
176
}
138
177
}
139
178
}
0 commit comments