From a25265c9bac6507ac9c90481b8f57bface032ca9 Mon Sep 17 00:00:00 2001 From: alhendrickson <159636032+alhendrickson@users.noreply.github.com.> Date: Tue, 28 Oct 2025 18:03:25 +0000 Subject: [PATCH 1/4] fix(medcat-service): Add thread safety to medcat processor dependency --- medcat-service/medcat_service/dependencies.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/medcat-service/medcat_service/dependencies.py b/medcat-service/medcat_service/dependencies.py index f9cbab061..27ecaefa1 100644 --- a/medcat-service/medcat_service/dependencies.py +++ b/medcat-service/medcat_service/dependencies.py @@ -1,6 +1,7 @@ import logging +import threading from functools import lru_cache -from typing import Annotated +from typing import Annotated, Optional from fastapi import Depends @@ -13,14 +14,27 @@ @lru_cache def get_settings() -> Settings: settings = Settings() - log.debug("Using settings: %s", settings) + log.info(f"Starting service using settings: '{settings}'") return settings +_def_medcat_processor: Optional[MedCatProcessor] = None +_def_medcat_processor_lock = threading.Lock() + + +def get_medcat_processor_singleton(settings: Settings) -> MedCatProcessor: + with _def_medcat_processor_lock: + global _def_medcat_processor + if _def_medcat_processor is None: + log.info("Creating new Medcat Processsor using settings: %s", settings) + _def_medcat_processor = MedCatProcessor(settings) + return _def_medcat_processor + + @lru_cache def get_medcat_processor(settings: Annotated[Settings, Depends(get_settings)]) -> MedCatProcessor: - log.debug("Creating new Medcat Processsor using settings: %s", settings) - return MedCatProcessor(settings) + log.debug("Creating new medcat processor from cache miss") + return get_medcat_processor_singleton(settings) MedCatProcessorDep = Annotated[MedCatProcessor, Depends(get_medcat_processor)] From 1b84e3d82ef41e2e76978c03cf7f756b66aff5fd Mon Sep 17 00:00:00 2001 From: alhendrickson <159636032+alhendrickson@users.noreply.github.com.> Date: Tue, 28 Oct 2025 18:57:10 +0000 Subject: [PATCH 2/4] fix(medcat-service): Add thread safety to medcat processor dependency --- medcat-service/medcat_service/dependencies.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/medcat-service/medcat_service/dependencies.py b/medcat-service/medcat_service/dependencies.py index 27ecaefa1..0664f2cf8 100644 --- a/medcat-service/medcat_service/dependencies.py +++ b/medcat-service/medcat_service/dependencies.py @@ -1,7 +1,8 @@ import logging import threading +from collections.abc import Hashable from functools import lru_cache -from typing import Annotated, Optional +from typing import Annotated from fastapi import Depends @@ -18,17 +19,17 @@ def get_settings() -> Settings: return settings -_def_medcat_processor: Optional[MedCatProcessor] = None +_def_medcat_processors: dict[Hashable, MedCatProcessor] = {} _def_medcat_processor_lock = threading.Lock() def get_medcat_processor_singleton(settings: Settings) -> MedCatProcessor: with _def_medcat_processor_lock: - global _def_medcat_processor - if _def_medcat_processor is None: - log.info("Creating new Medcat Processsor using settings: %s", settings) - _def_medcat_processor = MedCatProcessor(settings) - return _def_medcat_processor + key = hash(settings) + if key not in _def_medcat_processors: + log.warning("Creating new MedCatProcessor using settings: %s", settings) + _def_medcat_processors[key] = MedCatProcessor(settings) + return _def_medcat_processors[key] @lru_cache From a9c668403b8e4ca6dde1ddbb761dfdad08b931e2 Mon Sep 17 00:00:00 2001 From: alhendrickson <159636032+alhendrickson@users.noreply.github.com.> Date: Tue, 28 Oct 2025 19:07:38 +0000 Subject: [PATCH 3/4] fix(medcat-service): Add thread safety to medcat processor dependency --- medcat-service/medcat_service/dependencies.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/medcat-service/medcat_service/dependencies.py b/medcat-service/medcat_service/dependencies.py index 0664f2cf8..6253a4164 100644 --- a/medcat-service/medcat_service/dependencies.py +++ b/medcat-service/medcat_service/dependencies.py @@ -1,6 +1,5 @@ import logging import threading -from collections.abc import Hashable from functools import lru_cache from typing import Annotated @@ -19,17 +18,17 @@ def get_settings() -> Settings: return settings -_def_medcat_processors: dict[Hashable, MedCatProcessor] = {} +_def_medcat_processor: tuple[Settings, MedCatProcessor] | None = None _def_medcat_processor_lock = threading.Lock() def get_medcat_processor_singleton(settings: Settings) -> MedCatProcessor: with _def_medcat_processor_lock: - key = hash(settings) - if key not in _def_medcat_processors: - log.warning("Creating new MedCatProcessor using settings: %s", settings) - _def_medcat_processors[key] = MedCatProcessor(settings) - return _def_medcat_processors[key] + global _def_medcat_processor + if _def_medcat_processor is None or _def_medcat_processor[0] != settings: + log.info("Creating new MedCatProcessor using settings: %s", settings) + _def_medcat_processor = (settings, MedCatProcessor(settings)) + return _def_medcat_processor[1] @lru_cache From a0517c5b8eb8f149468a96188818b9d8c03de9f1 Mon Sep 17 00:00:00 2001 From: alhendrickson <159636032+alhendrickson@users.noreply.github.com.> Date: Tue, 28 Oct 2025 19:11:01 +0000 Subject: [PATCH 4/4] fix(medcat-service): Add thread safety to medcat processor dependency --- medcat-service/medcat_service/dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/medcat-service/medcat_service/dependencies.py b/medcat-service/medcat_service/dependencies.py index 6253a4164..2cd349f30 100644 --- a/medcat-service/medcat_service/dependencies.py +++ b/medcat-service/medcat_service/dependencies.py @@ -33,7 +33,7 @@ def get_medcat_processor_singleton(settings: Settings) -> MedCatProcessor: @lru_cache def get_medcat_processor(settings: Annotated[Settings, Depends(get_settings)]) -> MedCatProcessor: - log.debug("Creating new medcat processor from cache miss") + log.debug("Creating new medcat processor due to cache miss") return get_medcat_processor_singleton(settings)