From fa0d4e1c08d60207397ca03c55e2cc1f3ecd8447 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 4 Feb 2026 14:25:22 -0500 Subject: [PATCH] Small fixes --- superset/config.py | 2 +- superset/engines/manager.py | 6 ++++-- superset/extensions/engine_manager.py | 11 +++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/superset/config.py b/superset/config.py index 98fc6ee3c3b..c81e15ac0b4 100644 --- a/superset/config.py +++ b/superset/config.py @@ -273,7 +273,7 @@ SQLALCHEMY_CUSTOM_PASSWORD_STORE = None # "SINGLETON" reuses engines with connection pooling ENGINE_MANAGER_MODE = EngineModes.NEW -# Cleanup interval for abandoned locks in seconds (default: 5 minutes) +# Cleanup interval for abandoned locks (default: 5 minutes) ENGINE_MANAGER_CLEANUP_INTERVAL = timedelta(minutes=5) # Automatically start cleanup thread for SINGLETON mode (default: True) diff --git a/superset/engines/manager.py b/superset/engines/manager.py index 9f3722d5eb8..0579f0c8004 100644 --- a/superset/engines/manager.py +++ b/superset/engines/manager.py @@ -334,10 +334,12 @@ class EngineManager: "null": pool.NullPool, "static": pool.StaticPool, } - kwargs["poolclass"] = pools.get(extra["poolclass"], pool.QueuePool) + pool_name = kwargs["poolclass"] + if isinstance(pool_name, str): + kwargs["poolclass"] = pools.get(pool_name, pool.QueuePool) # update URI for specific catalog/schema - connect_args = dict(extra.get("connect_args", {})) + connect_args = kwargs.setdefault("connect_args", {}) uri, connect_args = database.db_engine_spec.adjust_engine_params( uri, connect_args, diff --git a/superset/extensions/engine_manager.py b/superset/extensions/engine_manager.py index e15ead09b43..f81afc28242 100644 --- a/superset/extensions/engine_manager.py +++ b/superset/extensions/engine_manager.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. +import atexit import logging from datetime import timedelta @@ -50,6 +51,10 @@ class EngineManagerExtension: ssh_timeout = timedelta(seconds=app.config["SSH_TUNNEL_PACKET_TIMEOUT_SEC"]) auto_start_cleanup = app.config["ENGINE_MANAGER_AUTO_START_CLEANUP"] + # Stop any existing manager's cleanup thread before creating a new one + if self.engine_manager: + self.engine_manager.stop_cleanup_thread() + # Create the engine manager self.engine_manager = EngineManager( engine_context_manager, @@ -67,15 +72,13 @@ class EngineManagerExtension: logger.info("Started EngineManager cleanup thread") # Register shutdown handler - def shutdown_engine_manager() -> None: + def shutdown_engine_manager(exc: BaseException | None = None) -> None: if self.engine_manager: self.engine_manager.stop_cleanup_thread() - app.teardown_appcontext_funcs.append(lambda exc: None) + app.teardown_appcontext(shutdown_engine_manager) # Register with atexit for clean shutdown - import atexit - atexit.register(shutdown_engine_manager) logger.info(