From aafb55d2f4ef04c573207b71f9713fbcfe927780 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 29 May 2023 18:09:55 -0500 Subject: [PATCH] Fix logger creating many thread locks We call getLogger for each integration to get the current log level when loading the integrations page. This creates a storm of threading locks --- homeassistant/components/logger/helpers.py | 9 +++++++++ homeassistant/components/logger/websocket_api.py | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/logger/helpers.py b/homeassistant/components/logger/helpers.py index 0f1751c1b2..992810f847 100644 --- a/homeassistant/components/logger/helpers.py +++ b/homeassistant/components/logger/helpers.py @@ -5,6 +5,7 @@ from collections import defaultdict from collections.abc import Mapping import contextlib from dataclasses import asdict, dataclass +from functools import lru_cache import logging from typing import Any, cast @@ -216,3 +217,11 @@ class LoggerSettings: ) return dict(combined_logs) + + +get_logger = lru_cache(maxsize=256)(logging.getLogger) +"""Get a logger. + +getLogger uses a threading.RLock, so we cache the result to avoid +locking the threads every time the integrations page is loaded. +""" diff --git a/homeassistant/components/logger/websocket_api.py b/homeassistant/components/logger/websocket_api.py index 89026a07b8..240db3144a 100644 --- a/homeassistant/components/logger/websocket_api.py +++ b/homeassistant/components/logger/websocket_api.py @@ -1,5 +1,4 @@ """Websocket API handlers for the logger integration.""" -import logging from typing import Any import voluptuous as vol @@ -16,6 +15,7 @@ from .helpers import ( LogPersistance, LogSettingsType, async_get_domain_config, + get_logger, ) @@ -38,7 +38,7 @@ def handle_integration_log_info( [ { "domain": integration, - "level": logging.getLogger( + "level": get_logger( f"homeassistant.components.{integration}" ).getEffectiveLevel(), }