From 0a21748b0c5d06cd8bca2cb786ed97788cc5c3e2 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 17 May 2019 16:43:23 -0400 Subject: [PATCH] Change all uses of CONN_MAX_AGE to 0 Database connection when using gunicorn microthreads are not shared by the microthreads and can exhaust the number of open connections available. Signed-off-by: Roberto Rosario --- contrib/scripts/install/docker.sh | 2 +- docker/stack.yml | 2 +- docs/chapters/database_conversion.rst | 2 +- docs/chapters/docker.rst | 8 ++++++-- mayan/apps/platform/classes.py | 2 +- mayan/settings/base.py | 2 +- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/contrib/scripts/install/docker.sh b/contrib/scripts/install/docker.sh index 7835dba430..8e851725ca 100755 --- a/contrib/scripts/install/docker.sh +++ b/contrib/scripts/install/docker.sh @@ -121,7 +121,7 @@ docker run -d \ -e MAYAN_DATABASE_PASSWORD=$DATABASE_PASSWORD \ -e MAYAN_DATABASE_USER=$DATABASE_USER \ -e MAYAN_DATABASE_PORT=$DOCKER_POSTGRES_PORT \ --e MAYAN_DATABASE_CONN_MAX_AGE=60 \ +-e MAYAN_DATABASE_CONN_MAX_AGE=0 \ -v $DOCKER_MAYAN_VOLUME:/var/lib/mayan \ $DOCKER_MAYAN_IMAGE >/dev/null echo "Done" diff --git a/docker/stack.yml b/docker/stack.yml index 789e44b203..c8a7b243bd 100644 --- a/docker/stack.yml +++ b/docker/stack.yml @@ -27,6 +27,6 @@ services: MAYAN_DATABASE_NAME: mayan MAYAN_DATABASE_PASSWORD: mayan-password MAYAN_DATABASE_USER: mayan - MAYAN_DATABASE_CONN_MAX_AGE: 60 + MAYAN_DATABASE_CONN_MAX_AGE: 0 volumes: - app:/var/lib/mayan diff --git a/docs/chapters/database_conversion.rst b/docs/chapters/database_conversion.rst index cdb100a07b..e8ea814410 100644 --- a/docs/chapters/database_conversion.rst +++ b/docs/chapters/database_conversion.rst @@ -99,5 +99,5 @@ Direct install MAYAN_DATABASE_NAME=mayan, MAYAN_DATABASE_PASSWORD=mayanuserpass, MAYAN_DATABASE_USER=mayan, - MAYAN_DATABASE_CONN_MAX_AGE=360, + MAYAN_DATABASE_CONN_MAX_AGE=0, <...> diff --git a/docs/chapters/docker.rst b/docs/chapters/docker.rst index 464dc3b823..69ae3b25d5 100644 --- a/docs/chapters/docker.rst +++ b/docs/chapters/docker.rst @@ -50,7 +50,7 @@ identifier:: -e MAYAN_DATABASE_NAME=mayan \ -e MAYAN_DATABASE_PASSWORD=mayanuserpass \ -e MAYAN_DATABASE_USER=mayan \ - -e MAYAN_DATABASE_CONN_MAX_AGE=60 \ + -e MAYAN_DATABASE_CONN_MAX_AGE=0 \ -v /docker-volumes/mayan-edms/media:/var/lib/mayan \ mayanedms/mayanedms: @@ -108,7 +108,7 @@ instead of the IP address of the Docker host (``172.17.0.1``):: -e MAYAN_DATABASE_NAME=mayan \ -e MAYAN_DATABASE_PASSWORD=mayanuserpass \ -e MAYAN_DATABASE_USER=mayan \ - -e MAYAN_DATABASE_CONN_MAX_AGE=60 \ + -e MAYAN_DATABASE_CONN_MAX_AGE=0 \ -v /docker-volumes/mayan-edms/media:/var/lib/mayan \ mayanedms/mayanedms: @@ -221,6 +221,10 @@ Optional. Allows loading an alternate settings file. Amount in seconds to keep a database connection alive. Allow reuse of database connections. For more information read the pertinent Django documentation page: :django-docs:`Settings, CONN_MAX_AGE ` +According to new information Gunicorn's microthreads don't share connections +and will exhaust the available Postgres connections available if a number +other than 0 is used. Reference: https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq +and https://github.com/benoitc/gunicorn/issues/996 ``MAYAN_GUNICORN_WORKERS`` diff --git a/mayan/apps/platform/classes.py b/mayan/apps/platform/classes.py index 4a6fa715be..edc865272b 100644 --- a/mayan/apps/platform/classes.py +++ b/mayan/apps/platform/classes.py @@ -122,7 +122,7 @@ class PlatformTemplateSupervisord(PlatformTemplate): environment_name='MAYAN_GUNICORN_WORKERS' ), Variable( - name='DATABASE_CONN_MAX_AGE', default=60, + name='DATABASE_CONN_MAX_AGE', default=0, environment_name='MAYAN_DATABASE_CONN_MAX_AGE' ), Variable( diff --git a/mayan/settings/base.py b/mayan/settings/base.py index 6ac588b982..36b32c8162 100644 --- a/mayan/settings/base.py +++ b/mayan/settings/base.py @@ -330,7 +330,7 @@ CELERY_RESULT_BACKEND = os.environ.get('MAYAN_CELERY_RESULT_BACKEND') environment_database_engine = os.environ.get('MAYAN_DATABASE_ENGINE') if environment_database_engine: - environment_database_conn_max_age = os.environ.get('MAYAN_DATABASE_CONN_MAX_AGE', None) + environment_database_conn_max_age = os.environ.get('MAYAN_DATABASE_CONN_MAX_AGE', 0) if environment_database_conn_max_age: environment_database_conn_max_age = int(environment_database_conn_max_age)