From e4a15354f44f13b8fd7216ee52a8d7ac8f36b701 Mon Sep 17 00:00:00 2001
From: "J. Nick Koston" <nick@koston.org>
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(),
             }
-- 
GitLab