Files
wehub-resource-sync 5357c39144
Fuzzer / Run Fuzzer (push) Has been cancelled
Race tests / Go race tests (ubuntu-22.04) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:01:40 +08:00

243 lines
8.1 KiB
Go

// Copyright 2019-2022 Dolthub, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package benchmark_runner
import (
"fmt"
"github.com/google/uuid"
)
type tpccTestParamsImpl struct {
// NumThreads represents the number of threads running queries concurrently.
NumThreads int
// ScaleFactor represents the number of warehouse to test this at scale.
ScaleFactor int
// Tables represents the number of tables created per warehouse.
Tables int
// TrxLevel represents what transaction level to use
TrxLevel string
// ReportCSV determines whether to report output as a csv.
ReportCSV bool
// ReportInterval defines how often the tpcc benchmark outputs performance stats.
ReportInterval int
// Time represents how long
Time int
}
var _ TestParams = &tpccTestParamsImpl{}
// NewDefaultTpccParams returns default TpccTestParams.
func NewDefaultTpccParams() *tpccTestParamsImpl {
return &tpccTestParamsImpl{
NumThreads: 1, // TODO: When ready, expose as command line argument.
ScaleFactor: 1,
Tables: 1,
TrxLevel: tpccTransactionLevelRr,
ReportCSV: true,
ReportInterval: 10,
Time: 800,
}
}
func (t *tpccTestParamsImpl) GetNumThreads() int {
return t.NumThreads
}
func (t *tpccTestParamsImpl) GetScaleFactor() int {
return t.ScaleFactor
}
func (t *tpccTestParamsImpl) GetTables() int {
return t.Tables
}
func (t *tpccTestParamsImpl) GetTrxLevel() string {
return t.TrxLevel
}
func (t *tpccTestParamsImpl) GetReportCSV() bool {
return t.ReportCSV
}
func (t *tpccTestParamsImpl) GetReportInterval() int {
return t.ReportInterval
}
func (t *tpccTestParamsImpl) GetTime() int {
return t.Time
}
func (t *tpccTestParamsImpl) ToSlice() []string {
params := make([]string, 0)
params = append(params, fmt.Sprintf("%s=%d", tpccThreadsFlag, t.NumThreads))
params = append(params, fmt.Sprintf("%s=%d", tpccScaleFlag, t.ScaleFactor))
params = append(params, fmt.Sprintf("%s=%d", tpccTablesFlag, t.Tables))
params = append(params, fmt.Sprintf("%s=%s", tpccTransactionLevelFlag, t.TrxLevel))
params = append(params, fmt.Sprintf("%s=%t", tpccReportCsv, t.ReportCSV))
params = append(params, fmt.Sprintf("%s=%d", tpccReportIntervalFlag, t.ReportInterval))
params = append(params, fmt.Sprintf("%s=%d", tpccTimeFlag, t.Time))
return params
}
// tpccTestImpl encapsulates an End to End prepare, run, cleanup test case.
type tpccTestImpl struct {
// Id represents a unique test id
Id string
// Name represents the name of the test case
Name string
// Params are associated parameters this test runs with
Params TpccTestParams
}
var _ Test = &tpccTestImpl{}
// NewTpccTest instantiates and returns a TPCC test.
func NewTpccTest(name string, params TpccTestParams) *tpccTestImpl {
return &tpccTestImpl{
Id: uuid.New().String(),
Name: name,
Params: params,
}
}
func (t *tpccTestImpl) doltArgs(serverConfig ServerConfig) []string {
args := make([]string, 0)
args = append(args, defaultTpccParams...)
args = append(args, fmt.Sprintf("%s=%s", tpccMysqlHostFlag, serverConfig.GetHost()))
port := serverConfig.GetPort()
if port > 0 {
args = append(args, fmt.Sprintf("%s=%d", tpccMysqlPortFlag, serverConfig.GetPort()))
}
args = append(args, fmt.Sprintf("%s=%d", tpccMysqlPortFlag, serverConfig.GetPort()))
args = append(args, fmt.Sprintf("%s=%s", tpccMysqlUserFlag, defaultMysqlUser))
args = append(args, fmt.Sprintf("%s=%d", tpccTimeFlag, t.Params.GetTime()))
args = append(args, fmt.Sprintf("%s=%d", tpccThreadsFlag, t.Params.GetNumThreads()))
args = append(args, fmt.Sprintf("%s=%d", tpccReportIntervalFlag, t.Params.GetReportInterval()))
args = append(args, fmt.Sprintf("%s=%d", tpccTablesFlag, t.Params.GetTables()))
args = append(args, fmt.Sprintf("%s=%d", tpccScaleFlag, t.Params.GetScaleFactor()))
args = append(args, fmt.Sprintf("%s=%s", tpccTransactionLevelFlag, t.Params.GetTrxLevel()))
return args
}
func (t *tpccTestImpl) mysqlArgs(serverConfig ServerConfig) []string {
args := make([]string, 0)
args = append(args, defaultTpccParams...)
host := serverConfig.GetHost()
port := serverConfig.GetPort()
args = append(args, fmt.Sprintf("%s=%s", tpccMysqlHostFlag, host))
if host == defaultHost {
args = append(args, fmt.Sprintf("%s=%s", tpccMysqlUserFlag, tpccMysqlUsername))
args = append(args, fmt.Sprintf("%s=%s", tpccMysqlPasswordFlag, tpccPassLocal))
} else {
args = append(args, fmt.Sprintf("%s=%s", tpccMysqlUserFlag, defaultMysqlUser))
}
if port > 0 {
args = append(args, fmt.Sprintf("%s=%d", tpccMysqlPortFlag, serverConfig.GetPort()))
}
args = append(args, fmt.Sprintf("%s=%d", tpccTimeFlag, t.Params.GetTime()))
args = append(args, fmt.Sprintf("%s=%d", tpccThreadsFlag, t.Params.GetNumThreads()))
args = append(args, fmt.Sprintf("%s=%d", tpccReportIntervalFlag, t.Params.GetReportInterval()))
args = append(args, fmt.Sprintf("%s=%d", tpccTablesFlag, t.Params.GetTables()))
args = append(args, fmt.Sprintf("%s=%d", tpccScaleFlag, t.Params.GetScaleFactor()))
args = append(args, fmt.Sprintf("%s=%s", tpccTransactionLevelFlag, t.Params.GetTrxLevel()))
return args
}
func (t *tpccTestImpl) doltgresArgs(serverConfig ServerConfig) []string {
args := make([]string, 0)
args = append(args, defaultTpccParams...)
args = append(args, fmt.Sprintf("%s=%d", tpccTimeFlag, t.Params.GetTime()))
args = append(args, fmt.Sprintf("%s=%d", tpccThreadsFlag, t.Params.GetNumThreads()))
args = append(args, fmt.Sprintf("%s=%d", tpccReportIntervalFlag, t.Params.GetReportInterval()))
args = append(args, fmt.Sprintf("%s=%d", tpccTablesFlag, t.Params.GetTables()))
args = append(args, fmt.Sprintf("%s=%d", tpccScaleFlag, t.Params.GetScaleFactor()))
args = append(args, fmt.Sprintf("%s=%s", tpccTransactionLevelFlag, t.Params.GetTrxLevel()))
return args
}
func (t *tpccTestImpl) postgresArgs(serverConfig ServerConfig) []string {
args := make([]string, 0)
args = append(args, defaultTpccParams...)
args = append(args, fmt.Sprintf("%s=%d", tpccTimeFlag, t.Params.GetTime()))
args = append(args, fmt.Sprintf("%s=%d", tpccThreadsFlag, t.Params.GetNumThreads()))
args = append(args, fmt.Sprintf("%s=%d", tpccReportIntervalFlag, t.Params.GetReportInterval()))
args = append(args, fmt.Sprintf("%s=%d", tpccTablesFlag, t.Params.GetTables()))
args = append(args, fmt.Sprintf("%s=%d", tpccScaleFlag, t.Params.GetScaleFactor()))
args = append(args, fmt.Sprintf("%s=%s", tpccTransactionLevelFlag, t.Params.GetTrxLevel()))
return args
}
// getArgs returns a test's args for all TPCC steps
func (t *tpccTestImpl) getArgs(serverConfig ServerConfig) []string {
st := serverConfig.GetServerType()
switch st {
case Dolt:
return t.doltArgs(serverConfig)
case Doltgres:
return t.doltgresArgs(serverConfig)
case Postgres:
return t.postgresArgs(serverConfig)
case MySql:
return t.mysqlArgs(serverConfig)
default:
panic(fmt.Sprintf("unexpected server type: %s", st))
}
}
func (t *tpccTestImpl) GetId() string {
return t.Id
}
func (t *tpccTestImpl) GetName() string {
return t.Name
}
func (t *tpccTestImpl) GetParamsToSlice() []string {
return t.Params.ToSlice()
}
func (t *tpccTestImpl) GetPrepareArgs(serverConfg ServerConfig) []string {
args := make([]string, 0)
serverArgs := t.getArgs(serverConfg)
args = append(args, serverArgs...)
args = append(args, sysbenchPrepareCommand)
return args
}
func (t *tpccTestImpl) GetRunArgs(serverConfg ServerConfig) []string {
args := make([]string, 0)
serverArgs := t.getArgs(serverConfg)
args = append(args, serverArgs...)
args = append(args, sysbenchRunCommand)
return args
}
func (t *tpccTestImpl) GetCleanupArgs(serverConfg ServerConfig) []string {
args := make([]string, 0)
serverArgs := t.getArgs(serverConfg)
args = append(args, serverArgs...)
args = append(args, sysbenchCleanupCommand)
return args
}