diff --git a/app/db.py b/app/db.py index 8798f9f..a0de3a8 100644 --- a/app/db.py +++ b/app/db.py @@ -20,6 +20,19 @@ _pool_lock = threading.Lock() def _build_pool() -> "pooling.MySQLConnectionPool": + # pool_size default of 24 covers transfer-bot at full tilt: + # CM_TRANSFER_MAX_THREADS defaults to 20, each thread can hold one + # connection for the duration of a transfer step. A smaller pool + # would surface as PoolError (caught silently by query/execute) and + # transfers would fail without obvious cause. mysql.connector caps + # pool_size at 32; if you bump CM_TRANSFER_MAX_THREADS, set + # DB_POOL_SIZE to at least the same value, capped at 32. + pool_size = int(os.getenv("DB_POOL_SIZE", "24")) + if pool_size > 32: + # Hard cap from mysql.connector; clamp here so the misconfigured + # value gets a clean message instead of a cryptic library error. + print(f"DB_POOL_SIZE={pool_size} exceeds mysql.connector max (32); clamping to 32") + pool_size = 32 config = { "host": _get_required_env("DB_HOST"), "user": _get_required_env("DB_USER"), @@ -28,7 +41,7 @@ def _build_pool() -> "pooling.MySQLConnectionPool": "port": int(_get_required_env("DB_PORT")), "connection_timeout": int(_get_required_env("DB_CONNECTION_TIMEOUT")), "pool_name": "cm_pool", - "pool_size": int(os.getenv("DB_POOL_SIZE", "8")), + "pool_size": pool_size, "pool_reset_session": True, } return pooling.MySQLConnectionPool(**config)