From 98b4693dcf869e32632e41e29ed2051e9cec65df Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sat, 3 Jun 2023 19:48:02 +0530 Subject: [PATCH] perf: finer cache eviction on db.set_value Instead of nuking everything, just clear matching prefix --- frappe/__init__.py | 7 +++++-- frappe/cache_manager.py | 3 ++- frappe/database/database.py | 6 ++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index c512de0de6..b31377a563 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -1115,9 +1115,12 @@ def get_document_cache_key(doctype: str, name: str): return f"document_cache::{doctype}::{name}" -def clear_document_cache(doctype, name): +def clear_document_cache(doctype: str, name: str | None = None) -> None: def clear_in_redis(): - cache().delete_value(get_document_cache_key(doctype, name)) + if name is not None: + cache().delete_value(get_document_cache_key(doctype, name)) + else: + cache().delete_keys(get_document_cache_key(doctype, "")) clear_in_redis() if hasattr(db, "after_commit"): diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index 12e829ff09..eee703bcf9 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -125,8 +125,9 @@ def clear_doctype_cache(doctype=None): clear_controller_cache(doctype) cache = frappe.cache() - for key in ("is_table", "doctype_modules", "document_cache"): + for key in ("is_table", "doctype_modules"): cache.delete_value(key) + cache.delete_keys("document_cache") def clear_single(dt): for name in doctype_cache_keys: diff --git a/frappe/database/database.py b/frappe/database/database.py index fc4f7b3b1b..2bac5a1ffc 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -920,10 +920,8 @@ class Database: if isinstance(dn, str): frappe.clear_document_cache(dt, dn) else: - # TODO: Fix this; doesn't work rn - gavin@frappe.io - # frappe.cache().hdel_keys(dt, "document_cache") - # Workaround: clear all document caches - frappe.cache().delete_value("document_cache") + # No way to guess which documents are modified, clear all of them + frappe.clear_document_cache(dt) for column, value in to_update.items(): query = query.set(column, value)