diff --git a/gns3server/core/tasks.py b/gns3server/core/tasks.py index 85df5791..5519b808 100644 --- a/gns3server/core/tasks.py +++ b/gns3server/core/tasks.py @@ -15,7 +15,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import sys import asyncio from typing import Callable @@ -25,7 +24,7 @@ from gns3server.controller import Controller from gns3server.compute import MODULES from gns3server.compute.port_manager import PortManager from gns3server.utils.http_client import HTTPClient -from gns3server.db.tasks import connect_to_db, get_computes +from gns3server.db.tasks import connect_to_db, disconnect_from_db, get_computes import logging @@ -90,4 +89,6 @@ def create_shutdown_handler(app: FastAPI) -> Callable: if PortManager.instance().udp_ports: log.warning(f"UDP ports are still used {PortManager.instance().udp_ports}") + await disconnect_from_db(app) + return shutdown_handler diff --git a/gns3server/db/tasks.py b/gns3server/db/tasks.py index 7c40a6fb..46f5a2b7 100644 --- a/gns3server/db/tasks.py +++ b/gns3server/db/tasks.py @@ -51,6 +51,14 @@ async def connect_to_db(app: FastAPI) -> None: log.fatal(f"Error while connecting to database '{db_url}: {e}") +async def disconnect_from_db(app: FastAPI) -> None: + + # dispose of the connection pool used by the database engine + if getattr(app.state, "_db_engine"): + await app.state._db_engine.dispose() + log.info(f"Disconnected from database") + + @event.listens_for(Engine, "connect") def set_sqlite_pragma(dbapi_connection, connection_record): diff --git a/requirements.txt b/requirements.txt index 7bc97804..2b401fb4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ sentry-sdk==1.5.7 psutil==5.9.0 distro==1.7.0 py-cpuinfo==8.0.0 -sqlalchemy==1.4.32 +sqlalchemy==1.4.35 aiosqlite===0.17.0 passlib[bcrypt]==1.7.4 python-jose==3.3.0