mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-10 23:32:27 -05:00
fix db connection pool
This commit is contained in:
@@ -18,6 +18,7 @@ from sqlalchemy import event
|
|||||||
from werkzeug.exceptions import HTTPException as WerkzeugHTTPException
|
from werkzeug.exceptions import HTTPException as WerkzeugHTTPException
|
||||||
from werkzeug.local import LocalProxy
|
from werkzeug.local import LocalProxy
|
||||||
|
|
||||||
|
from app import config
|
||||||
from app.clients import NotificationProviderClients
|
from app.clients import NotificationProviderClients
|
||||||
from app.clients.cloudwatch.aws_cloudwatch import AwsCloudwatchClient
|
from app.clients.cloudwatch.aws_cloudwatch import AwsCloudwatchClient
|
||||||
from app.clients.document_download import DocumentDownloadClient
|
from app.clients.document_download import DocumentDownloadClient
|
||||||
@@ -25,6 +26,7 @@ from app.clients.email.aws_ses import AwsSesClient
|
|||||||
from app.clients.email.aws_ses_stub import AwsSesStubClient
|
from app.clients.email.aws_ses_stub import AwsSesStubClient
|
||||||
from app.clients.pinpoint.aws_pinpoint import AwsPinpointClient
|
from app.clients.pinpoint.aws_pinpoint import AwsPinpointClient
|
||||||
from app.clients.sms.aws_sns import AwsSnsClient
|
from app.clients.sms.aws_sns import AwsSnsClient
|
||||||
|
from app.utils import hilite
|
||||||
from notifications_utils import logging, request_helper
|
from notifications_utils import logging, request_helper
|
||||||
from notifications_utils.clients.encryption.encryption_client import Encryption
|
from notifications_utils.clients.encryption.encryption_client import Encryption
|
||||||
from notifications_utils.clients.redis.redis_client import RedisClient
|
from notifications_utils.clients.redis.redis_client import RedisClient
|
||||||
@@ -58,15 +60,29 @@ class SQLAlchemy(_SQLAlchemy):
|
|||||||
|
|
||||||
def apply_driver_hacks(self, app, info, options):
|
def apply_driver_hacks(self, app, info, options):
|
||||||
sa_url, options = super().apply_driver_hacks(app, info, options)
|
sa_url, options = super().apply_driver_hacks(app, info, options)
|
||||||
|
print(hilite(f"OPTIONS {options}"))
|
||||||
|
|
||||||
if "connect_args" not in options:
|
if "connect_args" not in options:
|
||||||
options["connect_args"] = {}
|
options["connect_args"] = {}
|
||||||
options["connect_args"]["options"] = "-c statement_timeout={}".format(
|
options["connect_args"]["options"] = "-c statement_timeout={}".format(
|
||||||
int(app.config["SQLALCHEMY_STATEMENT_TIMEOUT"]) * 1000
|
int(app.config["SQLALCHEMY_STATEMENT_TIMEOUT"]) * 1000
|
||||||
)
|
)
|
||||||
|
|
||||||
return (sa_url, options)
|
return (sa_url, options)
|
||||||
|
|
||||||
|
|
||||||
db = SQLAlchemy()
|
# Set db engine settings here for now.
|
||||||
|
# They were not being set previous (despite environmental variables with appropriate
|
||||||
|
# sounding names) and were defaulting to low values
|
||||||
|
db = SQLAlchemy(
|
||||||
|
engine_options={
|
||||||
|
"pool_size": config.Config.SQLALCHEMY_POOL_SIZE,
|
||||||
|
"max_overflow": 10,
|
||||||
|
"pool_timeout": config.Config.SQLALCHEMY_POOL_TIMEOUT,
|
||||||
|
"pool_recycle": config.Config.SQLALCHEMY_POOL_RECYCLE,
|
||||||
|
"pool_pre_ping": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
migrate = Migrate()
|
migrate = Migrate()
|
||||||
ma = Marshmallow()
|
ma = Marshmallow()
|
||||||
notify_celery = NotifyCelery()
|
notify_celery = NotifyCelery()
|
||||||
|
|||||||
@@ -243,6 +243,8 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers():
|
|||||||
bind=True, max_retries=7, default_retry_delay=3600, name="process-delivery-receipts"
|
bind=True, max_retries=7, default_retry_delay=3600, name="process-delivery-receipts"
|
||||||
)
|
)
|
||||||
def process_delivery_receipts(self):
|
def process_delivery_receipts(self):
|
||||||
|
# If we need to check db settings do it here for convenience
|
||||||
|
# current_app.logger.info(f"POOL SIZE {app.db.engine.pool.size()}")
|
||||||
"""
|
"""
|
||||||
Every eight minutes or so (see config.py) we run this task, which searches the last ten
|
Every eight minutes or so (see config.py) we run this task, which searches the last ten
|
||||||
minutes of logs for delivery receipts and batch updates the db with the results. The overlap
|
minutes of logs for delivery receipts and batch updates the db with the results. The overlap
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ AWS_CLIENT_CONFIG = Config(
|
|||||||
"addressing_style": "virtual",
|
"addressing_style": "virtual",
|
||||||
},
|
},
|
||||||
use_fips_endpoint=True,
|
use_fips_endpoint=True,
|
||||||
# This is the default but just for doc sake
|
max_pool_connections=50, # This should be equal or greater than our celery concurrency
|
||||||
max_pool_connections=10,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class Config(object):
|
|||||||
SQLALCHEMY_DATABASE_URI = cloud_config.database_url
|
SQLALCHEMY_DATABASE_URI = cloud_config.database_url
|
||||||
SQLALCHEMY_RECORD_QUERIES = False
|
SQLALCHEMY_RECORD_QUERIES = False
|
||||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||||
SQLALCHEMY_POOL_SIZE = int(getenv("SQLALCHEMY_POOL_SIZE", 5))
|
SQLALCHEMY_POOL_SIZE = int(getenv("SQLALCHEMY_POOL_SIZE", 20))
|
||||||
SQLALCHEMY_POOL_TIMEOUT = 30
|
SQLALCHEMY_POOL_TIMEOUT = 30
|
||||||
SQLALCHEMY_POOL_RECYCLE = 300
|
SQLALCHEMY_POOL_RECYCLE = 300
|
||||||
SQLALCHEMY_STATEMENT_TIMEOUT = 1200
|
SQLALCHEMY_STATEMENT_TIMEOUT = 1200
|
||||||
|
|||||||
Reference in New Issue
Block a user