From e4a15354f44f13b8fd7216ee52a8d7ac8f36b701 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 13 Jan 2024 16:11:34 -1000 Subject: [PATCH] Fix logger creating many thread locks when reloading the integrations page (#93768) * 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 * fixes --- 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 87ec2cc8cd5..bf37ab3625b 100644 --- a/homeassistant/components/logger/helpers.py +++ b/homeassistant/components/logger/helpers.py @@ -6,6 +6,7 @@ from collections.abc import Mapping import contextlib from dataclasses import asdict, dataclass from enum import StrEnum +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 89026a07b8a..240db3144af 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(), }