mirror of
https://github.com/Routstr/routstr-core.git
synced 2026-08-09 11:04:36 +00:00
Add DATABASE_POOL_SIZE / DATABASE_MAX_OVERFLOW / DATABASE_POOL_TIMEOUT, consumed like every other typed env var through the pydantic Settings (constrained Fields, defaults 5/10/30 matching SQLAlchemy's own baseline so leaving them unset is behaviour-neutral). An out-of-range or non-integer value fails validation and refuses to boot — the same fail-loud behaviour a malformed DATABASE_URL already has — rather than silently starting up misconfigured. create_db_engine sizes the pool from these and logs the effective values at startup so they can be confirmed from the boot output during an incident. In-memory SQLite (StaticPool, which rejects the pool kwargs) is detected and built without them. pool_pre_ping is deliberately not exposed: the default backend is a local SQLite file with no network peer to drop idle connections, so it would add a SELECT 1 per checkout for no benefit — and it detects dead connections, not the live-but-wedged ones behind the exhaustion this series addresses. These knobs are infrastructure the node needs before it can open a DB session, so they can never be sourced from the DB (chicken-and-egg). A new ENV_ONLY_FIELDS set keeps them out of the persisted settings blob and stops a DB value from shadowing env in both SettingsService.initialize and .update, so env stays authoritative. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>