diff --git a/src/corva/cache_adapter.py b/src/corva/cache_adapter.py index 7c4d89f1..afce2dec 100644 --- a/src/corva/cache_adapter.py +++ b/src/corva/cache_adapter.py @@ -53,6 +53,7 @@ def delete_all(self) -> None: class HashMigrator: MINIMUM_ALLOWED_REDIS_SERVER = semver.Version(major=7, minor=4, patch=0) NEW_HASH_PREFIX = "migrated/" + _version_checked: bool = False def __init__(self, hash_name: str, client: redis.Redis): self.hash_name = hash_name @@ -60,6 +61,9 @@ def __init__(self, hash_name: str, client: redis.Redis): self.client = client def check_redis_server_version(self) -> None: + if HashMigrator._version_checked: + return + # Require Redis 7.4+ for per-field TTL commands redis_version_str = self.client.info(section="server")["redis_version"] server_version = semver.Version.parse(version=redis_version_str) @@ -72,6 +76,8 @@ def check_redis_server_version(self) -> None: f"less then {self.MINIMUM_ALLOWED_REDIS_SERVER} -> " f"incompatible with used python SDK version `{version('corva-sdk')}`") + HashMigrator._version_checked = True + def run(self) -> bool: """Prepare parallel new-style cache while keeping legacy structures. @@ -91,16 +97,16 @@ def run(self) -> bool: from corva import Logger - # Legacy structure must exist; otherwise nothing to do - if not self.client.exists(self.zset_name): - return False - new_hash_name = self.NEW_HASH_PREFIX + self.hash_name # If new hash already exists, consider migration already done if self.client.exists(new_hash_name): return False + # Legacy structure must exist; otherwise nothing to do + if not self.client.exists(self.zset_name): + return False + # Current server time in ms sec, micro = self.client.time() now_ms = int(sec) * 1000 + int(micro) // 1000 diff --git a/tests/integration/test_cache_migration.py b/tests/integration/test_cache_migration.py index f5f2b76d..839451a8 100644 --- a/tests/integration/test_cache_migration.py +++ b/tests/integration/test_cache_migration.py @@ -17,6 +17,7 @@ def current_redis_server_time(redis_client): def test_server_version_incompatible_with_sdk(redis_client): + HashMigrator._version_checked = False with (pytest.raises(RuntimeError) as exc): with mock.patch.object(redis_client, "info",