/
main.go
99 lines (88 loc) · 5.14 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"context"
"fmt"
"github.com/rs/zerolog"
"gopkg.in/alecthomas/kingpin.v2"
"os"
"os/signal"
"syscall"
"time"
)
var (
appName, gitCommit, gitBranch string
)
func main() {
var (
showVersion = kingpin.Flag("version", "show version and exit").Default().Bool()
doCleanup = kingpin.Flag("cleanup", "do cleanup of workloads related tables from database").Default("false").Envar("NOISIA_CLEANUP").Bool()
postgresConninfo = kingpin.Flag("conninfo", "Postgres connection string (DSN or URL), must be specified explicitly").Default("").Envar("NOISIA_POSTGRES_CONNINFO").String()
jobs = kingpin.Flag("jobs", "Run workload with specified number of workers").Default("1").Envar("NOISIA_JOBS").Uint16()
duration = kingpin.Flag("duration", "Duration of tests in seconds").Default("10").Envar("NOISIA_DURATION").Int()
idleXacts = kingpin.Flag("idle-xacts", "Run idle transactions workload").Default("false").Envar("NOISIA_IDLE_XACTS").Bool()
idleXactsNaptimeMin = kingpin.Flag("idle-xacts.naptime-min", "Min transactions naptime, in seconds").Default("5").Envar("NOISIA_IDLE_XACTS_NAPTIME_MIN").Int()
idleXactsNaptimeMax = kingpin.Flag("idle-xacts.naptime-max", "Max transactions naptime, in seconds").Default("20").Envar("NOISIA_IDLE_XACTS_NAPTIME_MAX").Int()
rollbacks = kingpin.Flag("rollbacks", "Run rollbacks workload").Default("false").Envar("NOISIA_ROLLBACKS").Bool()
rollbacksRate = kingpin.Flag("rollbacks.rate", "Number of transactions per second (per worker)").Default("10").Envar("NOISIA_ROLLBACKS_RATE").Int()
waitXacts = kingpin.Flag("wait-xacts", "Run idle transactions workload").Default("false").Envar("NOISIA_IDLE_XACTS").Bool()
waitXactsLocktimeMin = kingpin.Flag("wait-xacts.locktime-min", "Min transactions locking time, in seconds").Default("5").Envar("NOISIA_WAIT_XACTS_LOCKTIME_MIN").Int()
waitXactsLocktimeMax = kingpin.Flag("wait-xacts.locktime-max", "Max transactions locking time, in seconds").Default("20").Envar("NOISIA_WAIT_XACTS_LOCKTIME_MAX").Int()
deadlocks = kingpin.Flag("deadlocks", "Run deadlocks workload").Default("false").Envar("NOISIA_DEADLOCKS").Bool()
tempFiles = kingpin.Flag("temp-files", "Run temp-files workload").Default("false").Envar("NOISIA_TEMP_FILES").Bool()
tempFilesRate = kingpin.Flag("temp-files.rate", "Number of queries per second (per worker)").Default("10").Envar("NOISIA_TEMP_FILES_RATE").Int()
tempFilesScaleFactor = kingpin.Flag("temp-files.scale-factor", "Test data multiplier, 1 = 1000 rows").Default("10").Envar("NOISIA_TEMP_FILES_SCALE_FACTOR").Int()
terminate = kingpin.Flag("terminate", "Run terminate workload").Default("false").Envar("NOISIA_TERMINATE").Bool()
terminateRate = kingpin.Flag("terminate.rate", "Number of backends/queries terminate per interval").Default("1").Envar("NOISIA_TERMINATE_RATE").Int()
terminateInterval = kingpin.Flag("terminate.interval", "Time interval of single round, in seconds").Default("1").Envar("NOISIA_TERMINATE_INTERVAL").Int()
terminateSoftMode = kingpin.Flag("terminate.soft-mode", "Use queries cancel mode").Default("false").Envar("NOISIA_TERMINATE_SOFT_MODE").Bool()
terminateIgnoreSystem = kingpin.Flag("temp-files.ignore-system", "Ignore postgres system processes").Default("false").Envar("NOISIA_TERMINATE_IGNORE_SYSTEM").Bool()
failconns = kingpin.Flag("failconns", "Run connections exhaustion workload").Default("false").Envar("NOISIA_FAILCONNS").Bool()
)
kingpin.Parse()
logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}).Level(zerolog.InfoLevel).With().Timestamp().Logger()
if *showVersion {
fmt.Printf("%s %s-%s\n", appName, gitCommit, gitBranch)
os.Exit(0)
}
config := &config{
logger: logger,
doCleanup: *doCleanup,
postgresConninfo: *postgresConninfo,
jobs: *jobs,
duration: *duration,
idleXacts: *idleXacts,
idleXactsNaptimeMin: *idleXactsNaptimeMin,
idleXactsNaptimeMax: *idleXactsNaptimeMax,
rollbacks: *rollbacks,
rollbacksRate: *rollbacksRate,
waitXacts: *waitXacts,
waitXactsLocktimeMin: *waitXactsLocktimeMin,
waitXactsLocktimeMax: *waitXactsLocktimeMax,
deadlocks: *deadlocks,
tempFiles: *tempFiles,
tempFilesRate: *tempFilesRate,
tempFilesScaleFactor: *tempFilesScaleFactor,
terminate: *terminate,
terminateRate: *terminateRate,
terminateInterval: *terminateInterval,
terminateSoftMode: *terminateSoftMode,
terminateIgnoreSystem: *terminateIgnoreSystem,
failconns: *failconns,
}
ctx, cancel := context.WithCancel(context.Background())
var doExit = make(chan error, 2)
go func() {
doExit <- listenSignals()
cancel()
}()
go func() {
doExit <- runApplication(ctx, config, logger)
cancel()
}()
logger.Info().Msgf("shutdown: %s", <-doExit)
}
func listenSignals() error {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
return fmt.Errorf("got %s", <-c)
}