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

Commit 95ffeda

Browse files
committed
add stale-read test
Signed-off-by: yisaer <[email protected]>
1 parent 45d3219 commit 95ffeda

File tree

7 files changed

+1944
-0
lines changed

7 files changed

+1944
-0
lines changed

Diff for: testcase/stale-read/Dockerfile

+5
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/cross-region" ]

Diff for: testcase/stale-read/Makefile

+56
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/[email protected]
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

Diff for: testcase/stale-read/bench.go

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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+
num := c.insertCount * c.rowsEachInsert
57+
rows, err := db.Query("select id, k, c, pad from sbtest2 where k in (?, ?, ?)", rand.Intn(num), rand.Intn(num), rand.Intn(num))
58+
defer rows.Close()
59+
if err != nil {
60+
return errors.WithStack(err)
61+
}
62+
return nil
63+
}
64+
65+
func (c *SysbenchCase) DropTable(db *sql.DB) error {
66+
_, err := db.Exec("drop table if exists sbtest0")
67+
return err
68+
}
69+
70+
const ascii = "abcdefghijklmnopqrstuvwxyz1234567890"
71+
72+
func randString(n int) string {
73+
var buf bytes.Buffer
74+
for i := 0; i < n; i++ {
75+
pos := rand.Intn(len(ascii))
76+
buf.WriteByte(ascii[pos])
77+
}
78+
return buf.String()
79+
}
80+
81+
func nextPrimaryID(workerCount int, current int) int {
82+
return current + workerCount
83+
}

Diff for: testcase/stale-read/cmd/main.go

+38
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+
}

Diff for: testcase/stale-read/go.mod

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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/tiancaiamao/sysbench v0.0.0-20200214034607-ee9d97eabd23
12+
github.com/tikv/pd v1.1.0-beta.0.20210225143804-1f200cbcd647 // indirect
13+
go.uber.org/zap v1.15.0 // indirect
14+
)
15+
16+
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
17+
18+
replace github.com/prometheus/prometheus => github.com/prometheus/prometheus v1.8.2-0.20200213233353-b90be6f32a33
19+
20+
replace github.com/uber-go/atomic => go.uber.org/atomic v1.5.0
21+
22+
replace (
23+
k8s.io/api => k8s.io/api v0.17.0
24+
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.17.0
25+
k8s.io/apimachinery => k8s.io/apimachinery v0.17.0
26+
k8s.io/apiserver => k8s.io/apiserver v0.17.0
27+
k8s.io/cli-runtime => k8s.io/cli-runtime v0.17.0
28+
k8s.io/client-go => k8s.io/client-go v0.17.0
29+
k8s.io/cloud-provider => k8s.io/cloud-provider v0.17.0
30+
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.17.0
31+
k8s.io/code-generator => k8s.io/code-generator v0.17.0
32+
k8s.io/component-base => k8s.io/component-base v0.17.0
33+
k8s.io/cri-api => k8s.io/cri-api v0.17.0
34+
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.17.0
35+
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.17.0
36+
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.17.0
37+
k8s.io/kube-proxy => k8s.io/kube-proxy v0.17.0
38+
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.17.0
39+
k8s.io/kubectl => k8s.io/kubectl v0.17.0
40+
k8s.io/kubelet => k8s.io/kubelet v0.17.0
41+
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.17.0
42+
k8s.io/metrics => k8s.io/metrics v0.17.0
43+
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.17.0
44+
)
45+
46+
replace github.com/Azure/go-autorest => github.com/Azure/go-autorest v12.2.0+incompatible
47+
48+
replace golang.org/x/net v0.0.0-20190813000000-74dc4d7220e7 => golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
49+
50+
replace github.com/pingcap/tipocket => ../../.

0 commit comments

Comments
 (0)