Skip to content
This repository was archived by the owner on Dec 9, 2024. It is now read-only.

Commit ccb97e0

Browse files
committed
add stale-read test
Signed-off-by: yisaer <disxiaofei@163.com> add stale-read test Signed-off-by: yisaer <disxiaofei@163.com> add stale-read test Signed-off-by: yisaer <disxiaofei@163.com>
1 parent 45d3219 commit ccb97e0

File tree

8 files changed

+2071
-0
lines changed

8 files changed

+2071
-0
lines changed

testcase/stale-read/Dockerfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM alpine:3.9
2+
3+
RUN apk update && apk add --no-cache wget bash sed
4+
COPY ./bin/stale-read /bin/stale-read
5+
ENTRYPOINT [ "/bin/stale-read" ]

testcase/stale-read/Makefile

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
GOARCH := $(if $(GOARCH),$(GOARCH),amd64)
2+
GO=GO15VENDOREXPERIMENT="1" CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) GO111MODULE=on go
3+
GOTEST=GO15VENDOREXPERIMENT="1" CGO_ENABLED=1 GO111MODULE=on go test # go race detector requires cgo
4+
VERSION := $(if $(VERSION),$(VERSION),latest)
5+
6+
PACKAGES := go list ./...| grep -vE 'vendor'
7+
8+
LDFLAGS += -s -w
9+
LDFLAGS += -X "github.com/pingcap/tipocket/pkg/test-infra/fixture.BuildTS=$(shell date -u '+%Y-%m-%d %I:%M:%S')"
10+
LDFLAGS += -X "github.com/pingcap/tipocket/pkg/test-infra/fixture.BuildHash=$(shell git rev-parse HEAD)"
11+
12+
GOBUILD=$(GO) build -ldflags '$(LDFLAGS)'
13+
14+
DOCKER_REGISTRY_PREFIX := $(if $(DOCKER_REGISTRY),$(DOCKER_REGISTRY)/,)
15+
16+
default: tidy fmt lint build
17+
18+
build: stale-read
19+
20+
stale-read:
21+
$(GOBUILD) $(GOMOD) -o bin/stale-read cmd/*.go
22+
23+
fmt: groupimports
24+
go fmt ./...
25+
26+
tidy:
27+
@echo "go mod tidy"
28+
GO111MODULE=on go mod tidy
29+
@git diff --exit-code -- go.mod
30+
31+
lint: revive
32+
@echo "linting"
33+
revive -formatter friendly -config revive.toml $$($(PACKAGES))
34+
35+
revive:
36+
ifeq (,$(shell which revive))
37+
@echo "installing revive"
38+
$(GO) get github.com/mgechev/revive@v1.0.2
39+
endif
40+
41+
groupimports: install-goimports
42+
goimports -w -l -local github.com/pingcap/tipocket .
43+
44+
install-goimports:
45+
ifeq (,$(shell which goimports))
46+
@echo "installing goimports"
47+
go get golang.org/x/tools/cmd/goimports
48+
endif
49+
50+
clean:
51+
@rm -rf bin/*
52+
53+
test:
54+
$(GOTEST) ./...
55+
56+
.PHONY: all clean build

testcase/stale-read/bench.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package staleread
2+
3+
import (
4+
"bytes"
5+
"database/sql"
6+
"fmt"
7+
"github.com/pingcap/errors"
8+
"github.com/tiancaiamao/sysbench"
9+
"math/rand"
10+
)
11+
12+
const createTableTemplate = `create table if not exists sbtest%d (
13+
id int(11) not null primary key,
14+
k int(11) not null,
15+
c char(120) not null default '',
16+
pad char(255) not null default '')`
17+
18+
const splitTableTemplate = `SPLIT TABLE sbtest%d BETWEEN (0) AND (1000000000) REGIONS 100;`
19+
20+
type SysbenchCase struct {
21+
insertCount int
22+
rowsEachInsert int
23+
dbHost string
24+
}
25+
26+
func (c *SysbenchCase) CreateTable(db *sql.DB) error {
27+
db.Exec(fmt.Sprintf(createTableTemplate, 0))
28+
db.Exec(fmt.Sprintf(splitTableTemplate, 0))
29+
return nil
30+
}
31+
32+
func (c *SysbenchCase) InsertData(worker *sysbench.Worker, db *sql.DB) error {
33+
var buf bytes.Buffer
34+
pkID := worker.ID
35+
for i := 0; i < c.insertCount; i++ {
36+
buf.Reset()
37+
fmt.Fprintf(&buf, "insert into sbtest%d (id, k, c, pad) values ", 0)
38+
for i := 0; i < c.rowsEachInsert; i++ {
39+
pkID = nextPrimaryID(worker.Count, pkID)
40+
dot := ""
41+
if i > 0 {
42+
dot = ", "
43+
}
44+
fmt.Fprintf(&buf, "%s(%d, %d, '%s', '%s')", dot, pkID, rand.Intn(1<<11), randString(32), randString(32))
45+
}
46+
47+
_, err := db.Exec(buf.String())
48+
if err != nil {
49+
return errors.WithStack(err)
50+
}
51+
}
52+
return nil
53+
}
54+
55+
func (c *SysbenchCase) Execute(worker *sysbench.Worker, db *sql.DB) error {
56+
for i := 0; i < 100; i++ {
57+
err := c.executeSET(db)
58+
if err != nil {
59+
return err
60+
}
61+
err = c.executeSTART(db)
62+
if err != nil {
63+
return err
64+
}
65+
err = c.executeSelect(db)
66+
if err != nil {
67+
return err
68+
}
69+
}
70+
return nil
71+
}
72+
73+
func (c *SysbenchCase) executeSET(db *sql.DB) error {
74+
num := c.insertCount * c.rowsEachInsert
75+
_, err := db.Exec("SET TRANSACTION READ ONLY AS OF TIMESTAMP tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 10 SECOND)")
76+
if err != nil {
77+
return err
78+
}
79+
rows, err := db.Query("select id, k, c, pad from sbtest0 where k in (?, ?, ?)", rand.Intn(num), rand.Intn(num), rand.Intn(num))
80+
defer rows.Close()
81+
if err != nil {
82+
return errors.WithStack(err)
83+
}
84+
return nil
85+
}
86+
87+
func (c *SysbenchCase) executeSTART(db *sql.DB) error {
88+
num := c.insertCount * c.rowsEachInsert
89+
_, err := db.Exec("START TRANSACTION READ ONLY AS OF TIMESTAMP tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 10 SECOND)")
90+
if err != nil {
91+
return err
92+
}
93+
rows, err := db.Query("select id, k, c, pad from sbtest0 where k in (?, ?, ?)", rand.Intn(num), rand.Intn(num), rand.Intn(num))
94+
defer rows.Close()
95+
if err != nil {
96+
return errors.WithStack(err)
97+
}
98+
_, err = db.Exec("COMMIT")
99+
if err != nil {
100+
return err
101+
}
102+
return nil
103+
}
104+
105+
func (c *SysbenchCase) executeSelect(db *sql.DB) error {
106+
num := c.insertCount * c.rowsEachInsert
107+
rows, err := db.Query("select id, k, c, pad from sbtest0 as of timestamp tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 10 SECOND) where k in (?, ?, ?)", rand.Intn(num), rand.Intn(num), rand.Intn(num))
108+
defer rows.Close()
109+
if err != nil {
110+
return errors.WithStack(err)
111+
}
112+
return nil
113+
}
114+
115+
func (c *SysbenchCase) DropTable(db *sql.DB) error {
116+
_, err := db.Exec("drop table if exists sbtest0")
117+
return err
118+
}
119+
120+
const ascii = "abcdefghijklmnopqrstuvwxyz1234567890"
121+
122+
func randString(n int) string {
123+
var buf bytes.Buffer
124+
for i := 0; i < n; i++ {
125+
pos := rand.Intn(len(ascii))
126+
buf.WriteByte(ascii[pos])
127+
}
128+
return buf.String()
129+
}
130+
131+
func nextPrimaryID(workerCount int, current int) int {
132+
return current + workerCount
133+
}

testcase/stale-read/cmd/main.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"flag"
6+
staleread "github.com/pingcap/tipocket/testcase/stale-read"
7+
8+
// use mysql
9+
_ "github.com/go-sql-driver/mysql"
10+
11+
"github.com/pingcap/tipocket/cmd/util"
12+
logs "github.com/pingcap/tipocket/logsearch/pkg/logs"
13+
"github.com/pingcap/tipocket/pkg/cluster"
14+
"github.com/pingcap/tipocket/pkg/control"
15+
test_infra "github.com/pingcap/tipocket/pkg/test-infra"
16+
"github.com/pingcap/tipocket/pkg/test-infra/fixture"
17+
)
18+
19+
func main() {
20+
flag.Parse()
21+
cfg := control.Config{
22+
Mode: control.ModeStandard,
23+
ClientCount: 1,
24+
RunTime: fixture.Context.RunTime,
25+
}
26+
c := fixture.Context
27+
c.TiDBClusterConfig.TiDBReplicas = 1
28+
c.TiDBClusterConfig.TiKVReplicas = 5
29+
suit := util.Suit{
30+
Config: &cfg,
31+
Provider: cluster.NewDefaultClusterProvider(),
32+
ClientCreator: staleread.ClientCreator{},
33+
NemesisGens: util.ParseNemesisGenerators(fixture.Context.Nemesis),
34+
ClusterDefs: test_infra.NewDefaultCluster(c.Namespace, c.ClusterName, c.TiDBClusterConfig),
35+
LogsClient: logs.NewDiagnosticLogClient(),
36+
}
37+
suit.Run(context.Background())
38+
}

testcase/stale-read/go.mod

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
module github.com/pingcap/tipocket/testcase/stale-read
2+
3+
go 1.16
4+
5+
require (
6+
github.com/go-sql-driver/mysql v1.5.0
7+
github.com/pingcap/errors v0.11.5-0.20201126102027-b0a155152ca3
8+
github.com/pingcap/log v0.0.0-20201112100606-8f1e84a3abc8 // indirect
9+
github.com/pingcap/tipocket v1.0.0
10+
github.com/pingcap/tipocket/logsearch v0.0.0-20210602095541-45d321986652
11+
github.com/prometheus/client_golang v1.5.0
12+
github.com/tiancaiamao/sysbench v0.0.0-20200214034607-ee9d97eabd23
13+
github.com/tikv/pd v1.1.0-beta.0.20210225143804-1f200cbcd647 // indirect
14+
go.uber.org/zap v1.15.0 // indirect
15+
)
16+
17+
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
18+
19+
replace github.com/prometheus/prometheus => github.com/prometheus/prometheus v1.8.2-0.20200213233353-b90be6f32a33
20+
21+
replace github.com/uber-go/atomic => go.uber.org/atomic v1.5.0
22+
23+
replace (
24+
k8s.io/api => k8s.io/api v0.17.0
25+
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.17.0
26+
k8s.io/apimachinery => k8s.io/apimachinery v0.17.0
27+
k8s.io/apiserver => k8s.io/apiserver v0.17.0
28+
k8s.io/cli-runtime => k8s.io/cli-runtime v0.17.0
29+
k8s.io/client-go => k8s.io/client-go v0.17.0
30+
k8s.io/cloud-provider => k8s.io/cloud-provider v0.17.0
31+
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.17.0
32+
k8s.io/code-generator => k8s.io/code-generator v0.17.0
33+
k8s.io/component-base => k8s.io/component-base v0.17.0
34+
k8s.io/cri-api => k8s.io/cri-api v0.17.0
35+
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.17.0
36+
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.17.0
37+
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.17.0
38+
k8s.io/kube-proxy => k8s.io/kube-proxy v0.17.0
39+
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.17.0
40+
k8s.io/kubectl => k8s.io/kubectl v0.17.0
41+
k8s.io/kubelet => k8s.io/kubelet v0.17.0
42+
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.17.0
43+
k8s.io/metrics => k8s.io/metrics v0.17.0
44+
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.17.0
45+
)
46+
47+
replace github.com/Azure/go-autorest => github.com/Azure/go-autorest v12.2.0+incompatible
48+
49+
replace golang.org/x/net v0.0.0-20190813000000-74dc4d7220e7 => golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
50+
51+
replace github.com/pingcap/tipocket => ../../.

0 commit comments

Comments
 (0)