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