From 9f9c6c9fe47ca8fd5e8fcdab6c18fbbc1aa342d0 Mon Sep 17 00:00:00 2001
From: Garet Halliday <me@garet.holiday>
Date: Wed, 17 Apr 2024 19:31:59 -0500
Subject: [PATCH] min and max connections in caddyfile

---
 lib/gat/gatcaddyfile/handler.go      | 21 +++++++++++++++++++++
 lib/gat/handlers/discovery/config.go |  3 +++
 lib/gat/handlers/discovery/module.go | 16 ++++++++++++----
 3 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/lib/gat/gatcaddyfile/handler.go b/lib/gat/gatcaddyfile/handler.go
index 00c8aaa1..49a2cbcd 100644
--- a/lib/gat/gatcaddyfile/handler.go
+++ b/lib/gat/gatcaddyfile/handler.go
@@ -162,6 +162,7 @@ func init() {
 					"provider",
 					warnings,
 				),
+				ServerMaxConnections: 20,
 			},
 		}
 
@@ -200,6 +201,26 @@ func init() {
 						return nil, d.WrapErr(err)
 					}
 					module.ReconcilePeriod = caddy.Duration(val)
+				case "max_connections":
+					if !d.NextArg() {
+						return nil, d.ArgErr()
+					}
+
+					val, err := strconv.Atoi(d.Val())
+					if err != nil {
+						return nil, d.WrapErr(err)
+					}
+					module.ServerMaxConnections = val
+				case "min_connections":
+					if !d.NextArg() {
+						return nil, d.ArgErr()
+					}
+
+					val, err := strconv.Atoi(d.Val())
+					if err != nil {
+						return nil, d.WrapErr(err)
+					}
+					module.ServerMinConnections = val
 				case "discoverer":
 					if !d.NextArg() {
 						return nil, d.ArgErr()
diff --git a/lib/gat/handlers/discovery/config.go b/lib/gat/handlers/discovery/config.go
index 056fa5a5..bf61b4d3 100644
--- a/lib/gat/handlers/discovery/config.go
+++ b/lib/gat/handlers/discovery/config.go
@@ -19,5 +19,8 @@ type Config struct {
 	ServerSSLMode bouncer.SSLMode `json:"server_ssl_mode,omitempty"`
 	ServerSSL     json.RawMessage `json:"server_ssl,omitempty" caddy:"namespace=pggat.ssl.clients inline_key=provider"`
 
+	ServerMinConnections int `json:"server_min_connections,omitempty"`
+	ServerMaxConnections int `json:"server_max_connections,omitempty"`
+
 	ServerStartupParameters map[string]string `json:"server_startup_parameters,omitempty"`
 }
diff --git a/lib/gat/handlers/discovery/module.go b/lib/gat/handlers/discovery/module.go
index dfd4033f..edbe3d39 100644
--- a/lib/gat/handlers/discovery/module.go
+++ b/lib/gat/handlers/discovery/module.go
@@ -228,7 +228,9 @@ func (T *Module) addPrimaryNode(user User, database string, primary Node) {
 			SSLConfig:   T.sslConfig,
 			Parameters:  T.serverStartupParameters,
 		},
-		Priority: primary.Priority,
+		Priority:       primary.Priority,
+		MinConnections: T.ServerMinConnections,
+		MaxConnections: T.ServerMaxConnections,
 	}
 	p.pool.AddRecipe("primary", &d)
 }
@@ -252,7 +254,9 @@ func (T *Module) addReplicaNodes(user User, database string, replicas map[string
 					SSLConfig:   T.sslConfig,
 					Parameters:  T.serverStartupParameters,
 				},
-				Priority: replica.Priority,
+				Priority:       replica.Priority,
+				MinConnections: T.ServerMinConnections,
+				MaxConnections: T.ServerMaxConnections,
 			}
 			rp.AddReplicaRecipe(id, &d)
 		}
@@ -271,7 +275,9 @@ func (T *Module) addReplicaNodes(user User, database string, replicas map[string
 				SSLConfig:   T.sslConfig,
 				Parameters:  T.serverStartupParameters,
 			},
-			Priority: replica.Priority,
+			Priority:       replica.Priority,
+			MinConnections: T.ServerMinConnections,
+			MaxConnections: T.ServerMaxConnections,
 		}
 		rp.pool.AddRecipe(id, &d)
 	}
@@ -308,7 +314,9 @@ func (T *Module) addReplicaNode(user User, database string, id string, replica N
 			SSLConfig:   T.sslConfig,
 			Parameters:  T.serverStartupParameters,
 		},
-		Priority: replica.Priority,
+		Priority:       replica.Priority,
+		MinConnections: T.ServerMinConnections,
+		MaxConnections: T.ServerMaxConnections,
 	}
 
 	if rp, ok := p.pool.(pool.ReplicaPool); ok {
-- 
GitLab