Repository navigation
feat: make gateway Postgres connection pool size configurable (hardcoded to 10) #2561
Description
Problem Statement
The gateway's Postgres pool is hardcoded to max_connections(10) (crates/openshell-server/src/persistence/postgres.rs), with no config or env path. It's a single pool shared by every DB-backed RPC, so 10 is a hard, client-side ceiling on gateway↔DB concurrency — independent of how large the database is.
In cluster mode with external Postgres (workload.kind=deployment + server.externalDbSecret), a fleet of sandbox supervisors polling GetSandboxConfig / GetInferenceBundle / provider-env easily exceeds 10 concurrent connections. Symptoms:
sqlx::pool::acquireslow-threshold warnings; multi-second acquire latency on top of every DB-backed RPC./readyzbecomes latency-sensitive to pool pressure, since it also acquires from this pool (PostgresStore::ping()). (This surfaced as readiness flapping in our case, but the root cause there was the default readiness-probe timeout being too short to tolerate a slow acquire — operator-tunable — not the pool itself. Noted only because it shows readiness is coupled to pool saturation.)
Scaling the database up doesn't help: the pool never opens more than 10 connections, leaving the extra capacity idle.
Proposed Design
Make the pool options configurable via environment variables, each defaulting to today's value (no change for existing deployments). Every one is read at startup and drops straight into the Helm chart as a container env: value — no image rebuild or config-file edit — consistent with OPENSHELL_DB_URL:
OPENSHELL_DB_MAX_CONNECTIONS— the pool cap (default 10). The primary fix.OPENSHELL_DB_ACQUIRE_SLOW_THRESHOLD_SECS— the sqlx slow-acquire warn threshold (currently the sqlx default of 2s), so operators can tune or quiet that log line independently of the pool size.- Optionally
OPENSHELL_DB_MIN_CONNECTIONSandOPENSHELL_DB_ACQUIRE_TIMEOUT_SECS.
Thread these into the pool builder (Store::connect → PostgresStore::connect → PgPoolOptions). They may also be mirrored in gateway.toml [openshell.gateway.database] (as log_level is today), with the env vars taking precedence.
Operator note: total connections = pool_size × replica_count, which must stay under the server's max_connections.
Agent Investigation
- Single shared pool:
Store::connect(crates/openshell-server/src/lib.rs) builds onePostgresStore/PgPoolat startup. - Hardcoded cap:
PgPoolOptions::new().max_connections(10).connect(url)(persistence/postgres.rs) —connecttakes only the URL, no pool knob. - Shared by all handlers: e.g.
handle_get_sandbox_config(grpc/policy.rs) does several store reads per request, each from the same 10 slots.
Checklist
- I've reviewed existing issues and the architecture docs
- This is a design proposal, not a "please build this" request
Activity
letv1nnn commentedon Aug 10, 2026
letv1nnn commentedon Aug 10, 2026
I'd like to take this one
bjw123 commentedon Aug 11, 2026
thanks @letv1nnn I made an MR that is auto closed as i am not yet vouched.
its based off 0.0.85 but is what worked for us running the gw with around 1000 sandboxes, its a hot fix patch on my end for now
just added in case you find it a useful reference
if you would like to vouch me i do have a request open and have opened 3 issues into this repo and would really appreciate being able to contribute in a greater capacity #2610
letv1nnn commentedon Aug 11, 2026
Thanks for the patch and context @bjw123.
I can't vouch you myself, since I'm a contributor here, not a maintainer, and the vouch gate only accepts /vouch from maintainers/collaborators on a Vouch Request discussion.
bjw123 commentedon Aug 11, 2026
no worries been waiting for a vouch for a while, guess i should reach out to a maintainer :)
feat(server): make the database pool ceiling configurable
feat(server): make the Postgres pool ceiling configurable
feat(server): make the database pool ceiling configurable
feat(server): make the database pool ceiling configurable
feat(server): make the database pool ceiling configurable
feat(server): make the database pool ceiling configurable
feat(server): make the database pool ceiling configurable
feat(server): make the database pool ceiling configurable
feat(server): make the database pool ceiling configurable