From 4b58f0400789cf4c2ed88ba1f2e2a131c6682492 Mon Sep 17 00:00:00 2001
From: Jan Hadrava <had@kam.mff.cuni.cz>
Date: Sun, 21 Mar 2021 10:12:06 +0100
Subject: [PATCH] =?UTF-8?q?sqlalchemy:=20automatick=C3=BD=20reconnect=20po?=
 =?UTF-8?q?=20zav=C5=99en=C3=AD=20spojen=C3=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

SQLAlchemy za normálních okolností vyhodí exceptionu při prvním requestu
poté, co jí databáze zavře spojení. I v případě, že se tak stane mezi
requesty, musí si to kód handlovat explicitně. Po restartu postgresu
jinak dostane první request v každém workeru error 500.

SQLAlchemy se o to umí postarat sama jen s optionem:
        "pool_pre_ping": True,
Na začátku každé transakce nejprve databázi pingne a při odpojení se
zvládne sama reconnectnout. Když běží databáze na stejném serveru,
nemělo by to přidávat výrazný overhead.
---
 etc/config.py.example | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/etc/config.py.example b/etc/config.py.example
index 9fd6fbae..2c5dced4 100644
--- a/etc/config.py.example
+++ b/etc/config.py.example
@@ -3,6 +3,14 @@
 SQLALCHEMY_DATABASE_URI = "postgresql:///mo_osmo"
 SQLALCHEMY_TRACK_MODIFICATIONS = False
 SQLALCHEMY_ECHO = False
+SQLALCHEMY_ENGINE_OPTIONS = {
+        # SQLAlchemy neumí bez pingnutí databáze na začátku každé transakce
+        # sama ohandlovat zavření spojení. Po restartu Postgresu bez tohoto
+        # nastavení vydá každý worker jednu 500, než začne fungovat normálně.
+        # Pokud běží databáze na stejném serveru, zapnutí by mělo mít
+        # zanedbatelný overhead.
+        "pool_pre_ping": True,
+        }
 
 # Vytvořte pomocí python3 -c 'import secrets; print(secrets.token_hex(32))'
 SECRET_KEY = "FIXME"
-- 
GitLab