Skip to content

Commit a63b460

Browse files
authored
Merge pull request #5 from tombokombo/master
upgrade go, fix division by zero
2 parents ed6236e + e4ae590 commit a63b460

File tree

5 files changed

+67
-17
lines changed

5 files changed

+67
-17
lines changed

Dockerfile

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
FROM golang:1.10-alpine AS builder
1+
FROM golang:1.19 AS builder
22

3-
RUN mkdir /app
4-
ADD ./main.go /app/
5-
WORKDIR /app
6-
RUN apk update && apk add git && go get github.com/go-sql-driver/mysql && go get github.com/namsral/flag
7-
RUN go build -o main .
3+
WORKDIR /go/src/app
4+
ADD . /go/src/app
5+
RUN go mod tidy -v && go build -o main .
86

9-
FROM alpine:3.10
7+
FROM debian:bullseye-slim
108
RUN mkdir /app
11-
COPY --from=builder /app/main /app/mysql-loader
9+
COPY --from=builder /go/src/app/main /app/mysql-loader
1210
COPY config.json /app/config.json
1311
CMD ["/app/mysql-loader"]

config.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
{
2-
"connectionString": "USER:PASSWORD@tcp(HOST:PORT)/DB",
2+
"connectionString": "USER:PASSWORD@tcp(HOST:PORT)/DB?charset=utf8&autocommit=true",
33
"requestsPerSecond": 4500,
44
"printLogs": true,
55
"timeToRunInSeconds": 1200,
66
"poolConnections": 1000,
77
"dryRun" : false,
8+
"transactions": false,
89
"queryTimeout": 120,
910
"queries" : [
1011
"SELECT * FROM test LIMIT WHERE id=:rand: LIMIT 1"
1112
],
12-
"substitution" : [ {"key": ":rand:", "min": 1 ,"max": 3182356 }, {"key": ":rand_tiny:", "min": 1 ,"max": 10 } ]
13+
"substitution" : [ {"key": ":rand:", "min": 1 ,"max": 3182356 }, {"key": ":rand_tiny:", "min": 1 ,"max": 10 }, {"key": ":string:", "min": 10 ,"max": 20 } ]
1314
}

go.mod

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module app
2+
3+
go 1.19
4+
5+
require (
6+
github.com/go-sql-driver/mysql v1.7.0
7+
github.com/namsral/flag v1.7.4-pre
8+
)

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
2+
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
3+
github.com/namsral/flag v1.7.4-pre h1:b2ScHhoCUkbsq0d2C15Mv+VU8bl8hAXV8arnWiOHNZs=
4+
github.com/namsral/flag v1.7.4-pre/go.mod h1:OXldTctbM6SWH1K899kPZcf65KxJiD7MsceFUpB5yDo=

main.go

+46-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@ import (
1919
_ "github.com/go-sql-driver/mysql"
2020
)
2121

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+
2236
type Substitution struct {
2337
Key string `json:"key"`
2438
Min int `json:"min"`
@@ -36,6 +50,7 @@ type Config struct {
3650
QueryTimeout int `json:"queryTimeout"`
3751
ConnectionLifetime time.Duration `json:"connectionLifeTime"`
3852
Substitution []Substitution `json:"substitution"`
53+
Transactions bool `json:"transactions"`
3954
}
4055

4156
var config = Config{
@@ -49,10 +64,10 @@ var config = Config{
4964
QueryTimeout: 10,
5065
ConnectionLifetime: 0,
5166
Substitution: []Substitution{},
67+
Transactions: false,
5268
}
5369
var configFilePath string
5470
var db *sql.DB
55-
var queryTimesInMS []int
5671
var ops int64 = 0
5772
var latency int64 = 0
5873

@@ -74,7 +89,11 @@ func printQps() {
7489
atomic.StoreInt64(&ops, 0)
7590
loadedLatency := atomic.LoadInt64(&latency)
7691
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+
}
7897

7998
}
8099

@@ -120,20 +139,40 @@ func executeQuery(query string) {
120139
defer cancel()
121140

122141
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+
}
124147
}
125148

126149
if config.PrintLogs {
127150
fmt.Println("Executed ", query)
128151
}
129-
if config.DryRun == false {
152+
if !config.DryRun {
130153
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+
}
133167
atomic.AddInt64(&ops, 1)
134168
atomic.AddInt64(&latency, int64(time.Since(start)))
135169
} 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)))
137176
}
138177
}
139178
}

0 commit comments

Comments
 (0)