From 33bd1bc09b99f5245aad388585402e8f8d9de882 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 7 Jan 2025 11:55:02 +0530 Subject: [PATCH] fix: Flushall shouldn't attempt reading keys --- frappe/tests/test_client_cache.py | 30 ++++++++++++++++++++++++++++++ frappe/utils/redis_wrapper.py | 1 + 2 files changed, 31 insertions(+) diff --git a/frappe/tests/test_client_cache.py b/frappe/tests/test_client_cache.py index 45369e4ff9..549d015d3c 100644 --- a/frappe/tests/test_client_cache.py +++ b/frappe/tests/test_client_cache.py @@ -44,6 +44,36 @@ class TestClientCache(IntegrationTestCase): self.assertEqual(frappe.client_cache.statistics.misses, 1) self.assertEqual(frappe.client_cache.statistics.hit_ratio, 0.5) + def test_delete_invalidates(self): + val = frappe.generate_hash() + frappe.client_cache.set_value(TEST_KEY, val) + self.assertEqual(frappe.client_cache.get_value(TEST_KEY), val) + + val = frappe.generate_hash() + frappe.cache.delete_value(TEST_KEY) + # This is almost instant, but obviously not as fast as running the next instruction in + # current thread. So we wait. + time.sleep(0.1) + + with self.assertRedisCallCounts(1, exact=True): + self.assertIsNone(frappe.client_cache.get_value(TEST_KEY)) + + # Flushall should have results + frappe.client_cache.set_value(TEST_KEY, val) + self.assertEqual(frappe.client_cache.get_value(TEST_KEY), val) + frappe.cache.flushall() + time.sleep(0.1) + with self.assertRedisCallCounts(1, exact=True): + self.assertIsNone(frappe.client_cache.get_value(TEST_KEY)) + + # frappe.clear_cache should have same results + frappe.client_cache.set_value(TEST_KEY, val) + self.assertEqual(frappe.client_cache.get_value(TEST_KEY), val) + frappe.clear_cache() + time.sleep(0.1) + with self.assertRedisCallCounts(1, exact=True): + self.assertIsNone(frappe.client_cache.get_value(TEST_KEY)) + def test_client_local_cache_ttl(self): c = ClientCache(ttl=1) c.set_value(TEST_KEY, 42) diff --git a/frappe/utils/redis_wrapper.py b/frappe/utils/redis_wrapper.py index 3030c2c632..177d1885da 100644 --- a/frappe/utils/redis_wrapper.py +++ b/frappe/utils/redis_wrapper.py @@ -542,6 +542,7 @@ class ClientCache: if message["data"] is None: # Flushall self.clear_cache() + return with self.lock: for key in message["data"]: self.cache.pop(key, None)