From 480fee70b1db527fb2b3089f51dea07d1db55975 Mon Sep 17 00:00:00 2001 From: Jonas Keeling Date: Mon, 3 Feb 2025 15:01:26 +0100 Subject: [PATCH] fix: use async lru_cache --- pyproject.toml | 1 + requirements/requirements-dev.txt | 3 +++ requirements/requirements-typing.txt | 3 +++ requirements/requirements.txt | 3 +++ src/karapace/serialization.py | 4 ++-- tests/integration/test_client_protobuf.py | 6 ++++++ 6 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9c505b176..58e653a0f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ dependencies = [ "accept-types < 1", "aiohttp < 4", "aiokafka == 0.10.0", + "async_lru", "cachetools == 5.3.3", "confluent-kafka == 2.4.0", "isodate < 1", diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 510bfeef1..762043d51 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -16,6 +16,8 @@ aiosignal==1.3.1 # via aiohttp anyio==4.4.0 # via watchfiles +async-lru==2.0.4 + # via karapace (/karapace/pyproject.toml) async-timeout==4.0.3 # via # aiohttp @@ -208,6 +210,7 @@ tomli==2.0.1 typing-extensions==4.12.2 # via # anyio + # async-lru # karapace (/karapace/pyproject.toml) ujson==5.10.0 # via karapace (/karapace/pyproject.toml) diff --git a/requirements/requirements-typing.txt b/requirements/requirements-typing.txt index 2667aea8d..cfd392696 100644 --- a/requirements/requirements-typing.txt +++ b/requirements/requirements-typing.txt @@ -16,6 +16,8 @@ aiosignal==1.3.1 # via aiohttp anyio==4.5.0 # via watchfiles +async-lru==2.0.4 + # via karapace (/karapace/pyproject.toml) async-timeout==4.0.3 # via # aiohttp @@ -113,6 +115,7 @@ types-protobuf==3.20.4.6 typing-extensions==4.12.2 # via # anyio + # async-lru # karapace (/karapace/pyproject.toml) # multidict # mypy diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 15b787dcf..20578ef0a 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -16,6 +16,8 @@ aiosignal==1.3.1 # via aiohttp anyio==4.4.0 # via watchfiles +async-lru==2.0.4 + # via karapace (/karapace/pyproject.toml) async-timeout==4.0.3 # via # aiohttp @@ -96,6 +98,7 @@ tenacity==9.0.0 typing-extensions==4.12.2 # via # anyio + # async-lru # karapace (/karapace/pyproject.toml) ujson==5.10.0 # via karapace (/karapace/pyproject.toml) diff --git a/src/karapace/serialization.py b/src/karapace/serialization.py index 36509855e..118c5bf86 100644 --- a/src/karapace/serialization.py +++ b/src/karapace/serialization.py @@ -5,10 +5,10 @@ from __future__ import annotations from aiohttp import BasicAuth +from async_lru import alru_cache from avro.io import BinaryDecoder, BinaryEncoder, DatumReader, DatumWriter from cachetools import TTLCache from collections.abc import MutableMapping -from functools import lru_cache from google.protobuf.message import DecodeError from jsonschema import ValidationError from karapace.client import Client @@ -180,7 +180,7 @@ async def _get_schema_recursive( except InvalidSchema as e: raise SchemaRetrievalError(f"Failed to parse schema string from response: {json_result}") from e - @lru_cache(maxsize=100) + @alru_cache(maxsize=100) async def get_schema( self, subject: Subject, diff --git a/tests/integration/test_client_protobuf.py b/tests/integration/test_client_protobuf.py index 231730db9..d3b42e447 100644 --- a/tests/integration/test_client_protobuf.py +++ b/tests/integration/test_client_protobuf.py @@ -18,6 +18,12 @@ async def test_remote_client_protobuf(registry_async_client): assert sc_id >= 0 stored_schema, _ = await reg_cli.get_schema_for_id(sc_id) assert stored_schema == schema_protobuf, f"stored schema {stored_schema} is not {schema_protobuf}" + + stored_id, stored_schema, _ = await reg_cli.get_schema(subject) + assert stored_id == sc_id + assert stored_schema == schema_protobuf + + # get same schema a second time to hit cache stored_id, stored_schema, _ = await reg_cli.get_schema(subject) assert stored_id == sc_id assert stored_schema == schema_protobuf