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
This commit is contained in:
J. Nick Koston 2024-01-13 16:11:34 -10:00 committed by GitHub
parent d8564eba17
commit e4a15354f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View file

@ -6,6 +6,7 @@ from collections.abc import Mapping
import contextlib import contextlib
from dataclasses import asdict, dataclass from dataclasses import asdict, dataclass
from enum import StrEnum from enum import StrEnum
from functools import lru_cache
import logging import logging
from typing import Any, cast from typing import Any, cast
@ -216,3 +217,11 @@ class LoggerSettings:
) )
return dict(combined_logs) 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.
"""

View file

@ -1,5 +1,4 @@
"""Websocket API handlers for the logger integration.""" """Websocket API handlers for the logger integration."""
import logging
from typing import Any from typing import Any
import voluptuous as vol import voluptuous as vol
@ -16,6 +15,7 @@ from .helpers import (
LogPersistance, LogPersistance,
LogSettingsType, LogSettingsType,
async_get_domain_config, async_get_domain_config,
get_logger,
) )
@ -38,7 +38,7 @@ def handle_integration_log_info(
[ [
{ {
"domain": integration, "domain": integration,
"level": logging.getLogger( "level": get_logger(
f"homeassistant.components.{integration}" f"homeassistant.components.{integration}"
).getEffectiveLevel(), ).getEffectiveLevel(),
} }