From b8de2901ea0f8223fcfe3529596c62427c6cb55e Mon Sep 17 00:00:00 2001 From: Garet Halliday <me@garet.holiday> Date: Mon, 26 Dec 2022 15:01:19 -0600 Subject: [PATCH] better test --- .gitignore | 2 + config_data.yml | 90 +++++++++++++++++++++++++++++++++++++++++ scripts/ddos/ddos.go | 82 +++++++++++++++++++++---------------- test/docker-compose.yml | 14 +++++++ 4 files changed, 153 insertions(+), 35 deletions(-) create mode 100644 config_data.yml diff --git a/.gitignore b/.gitignore index 7b69cd4d..84ae8aad 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ target .idea + +config_data.yml diff --git a/config_data.yml b/config_data.yml new file mode 100644 index 00000000..4dacac28 --- /dev/null +++ b/config_data.yml @@ -0,0 +1,90 @@ +general: + host: 0.0.0.0 + port: 6432 + enable_prometheus_exporter: true + prometheus_exporter_port: 9090 + connect_timeout: 5000 + healthcheck_timeout: 1000 + healthcheck_delay: 30000 + shutdown_timeout: 60000 + ban_time: 60 + autoreload: false + admin_username: ENV$PSQL_DB_ADMIN_USER + admin_password: ENV$PSQL_DB_ADMIN_PASS +pools: + postgres: + pool_mode: transaction + default_role: primary + query_parser_enabled: true + primary_reads_enabled: true + sharding_function: pg_bigint_hash + users: + - username: ENV$PSQL_DB_USER_RW + password: ENV$PSQL_DB_PASS_RW + role: writer + pool_size: 1 + statement_timeout: 0 + shards: + - pool_size: 5 + statement_timeout: 0 + database: postgres + servers: + - host: ENV$PSQL_PRI_DB_HOST + port: 5432 + role: primary + username: ENV$PSQL_DB_USER_RW + password: ENV$PSQL_DB_PASS_RW + - host: ENV$PSQL_REP_DB_HOST + port: 5432 + role: replica + username: ENV$PSQL_DB_USER_RO + password: ENV$PSQL_DB_PASS_RO + prest: + pool_mode: transaction + default_role: primary + query_parser_enabled: true + primary_reads_enabled: true + sharding_function: pg_bigint_hash + users: + - username: ENV$PSQL_DB_USER_RW + password: ENV$PSQL_DB_PASS_RW + role: writer + pool_size: 1 + statement_timeout: 0 + shards: + - pool_size: 5 + statement_timeout: 0 + database: prest + servers: + - host: ENV$PSQL_PRI_DB_HOST + port: 5432 + role: primary + username: ENV$PSQL_DB_USER_RW + password: ENV$PSQL_DB_PASS_RW + - host: ENV$PSQL_REP_DB_HOST + port: 5432 + role: replica + username: ENV$PSQL_DB_USER_RO + password: ENV$PSQL_DB_PASS_RO +# poolname OR databasename: +# pool_mode: session OR transaction +# default_role: primary OR replica +# query_parser_enabled: true or false +# primary_reads_enabled: true or false +# sharding_function: pg_bigint_hash +# users: +# - username: postgres +# password: password +# role: writer OR reader OR admin +# pool_size: 20 +# statement_timeout: 0 +# shards: +# - pool_size: 5 +# statement_timeout: 0 +# database: regression +# servers: +# - host: db +# port: 5432 +# role: primary OR replica +# username: postgres +# password: ENV$PGGAT_DB_PASS diff --git a/scripts/ddos/ddos.go b/scripts/ddos/ddos.go index de958f3a..0d58182e 100644 --- a/scripts/ddos/ddos.go +++ b/scripts/ddos/ddos.go @@ -14,9 +14,10 @@ import ( "time" ) -const PrestHost = "https://psql-prest.staging.gfx.town" +const PrestHost = "http://localhost:3000" const PostgresHost = "postgres://dev_rw:pGf63Aq0M5ck@pggat-dev.gfx.town:6432/prest" -const ThreadCount = 1000 +const ThreadCount = 4 +const TestTime = 30 * time.Second type col struct { V int `json:"v"` @@ -45,7 +46,7 @@ func spamPrest() error { return fmt.Errorf("error unmarshaling '%s': %w", string(body), err) } if rc != c { - return fmt.Errorf("mismatch!!! %#v vs %#v", c, rc) + return fmt.Errorf("mismatch!!! %#v vs %#v (raw '%s')", c, rc, string(body)) } return nil } @@ -65,37 +66,41 @@ var stats struct { func spammer(spam func() error) error { for { - start := time.Now() - ticker := time.NewTicker(1 * time.Second) - errch := make(chan error, 1) - go func() { - errch <- spam() - }() - a: - for { - select { - case <-ticker.C: - wait := time.Now().Sub(start) - stats.Lock() - if wait > stats.max { - stats.max = wait - } - stats.Unlock() - case err := <-errch: - if err != nil { - panic(err) - } - stats.Lock() - wait := time.Now().Sub(start) - stats.total += wait - stats.count += 1 - if wait > stats.max { - stats.max = wait + func() { + start := time.Now() + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() + errch := make(chan error, 1) + go func() { + errch <- spam() + close(errch) + }() + a: + for { + select { + case now := <-ticker.C: + wait := now.Sub(start) + stats.Lock() + if wait > stats.max { + stats.max = wait + } + stats.Unlock() + case err := <-errch: + if err != nil { + panic(err) + } + stats.Lock() + wait := time.Now().Sub(start) + stats.total += wait + stats.count += 1 + if wait > stats.max { + stats.max = wait + } + stats.Unlock() + break a } - stats.Unlock() - break a } - } + }() } } @@ -114,21 +119,28 @@ func prestSpammer() error { } func main() { + start := time.Now() for i := 0; i < ThreadCount; i++ { go func() { - err := postgresSpammer() + err := prestSpammer() if err != nil { panic(err) } }() } ticker := time.NewTicker(1 * time.Second) + finish := time.After(TestTime) for { select { - case <-ticker.C: + case now := <-ticker.C: + stats.Lock() + log.Printf("avg %f - max %f - %f/s", stats.total.Seconds()/float64(stats.count), stats.max.Seconds(), float64(stats.count)/now.Sub(start).Seconds()) + stats.Unlock() + case now := <-finish: stats.Lock() - log.Printf("avg %f max %f", stats.total.Seconds()/float64(stats.count), stats.max.Seconds()) + log.Printf("TEST FINISHED: avg %f - max %f - %f/s - %d requests completed", stats.total.Seconds()/float64(stats.count), stats.max.Seconds(), float64(stats.count)/now.Sub(start).Seconds(), stats.count) stats.Unlock() + return } } } diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 0641271d..d1b41b5a 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -24,3 +24,17 @@ services: ports: - 6432:6432 - 6060:6060 + depends_on: + - "db" + prest: + image: prest/prest + restart: always + environment: + PREST_PG_URL: postgres://postgres:example@pggat:6432/prest + PREST_DEBUG: true + PREST_SSL_MODE: disable + ports: + - 3000:3000 + depends_on: + - "pggat" + - "db" -- GitLab