From 30ec0337473b8a013d149a9c02077249f9dd9ead Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 17 Dec 2024 16:48:43 +0530 Subject: [PATCH] perf: Speedup `get_doc` by another ~1.5x (#28807) * perf: Reduce impact of forced cache replacement on every doc access * fix: clear cache before processing users Note: This is just an artifact of testing model, this won't have any real effect on execution in real system. Basically `enqueue_on_commit` is not respected in tests and it can't be practically supported either. --- frappe/__init__.py | 8 +------- frappe/core/doctype/role_profile/role_profile.py | 1 + frappe/desk/form/load.py | 7 ++++++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 5be6fe4098..85f30984bb 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -1380,13 +1380,7 @@ def get_doc(*args: Any, **kwargs: Any) -> "Document": """ import frappe.model.document - doc = frappe.model.document.get_doc(*args, **kwargs) - - # Replace cache if stale one exists - if not kwargs.get("for_update") and (key := can_cache_doc(args)) and cache.exists(key): - _set_document_in_cache(key, doc) - - return doc + return frappe.model.document.get_doc(*args, **kwargs) def get_last_doc( diff --git a/frappe/core/doctype/role_profile/role_profile.py b/frappe/core/doctype/role_profile/role_profile.py index f156c87038..9d790bc84a 100644 --- a/frappe/core/doctype/role_profile/role_profile.py +++ b/frappe/core/doctype/role_profile/role_profile.py @@ -26,6 +26,7 @@ class RoleProfile(Document): self.name = self.role_profile def on_update(self): + self.clear_cache() self.queue_action( "update_all_users", now=frappe.flags.in_test or frappe.flags.in_install, diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index 93845bab34..363d55e845 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -20,7 +20,7 @@ if typing.TYPE_CHECKING: @frappe.whitelist() -def getdoc(doctype, name, user=None): +def getdoc(doctype, name): """ Loads a doclist for a given document. This method is called directly from the client. Requries "doctype", "name" as form variables. @@ -38,6 +38,11 @@ def getdoc(doctype, name, user=None): doc.check_permission("read") + # Replace cache if stale one exists + # PERF: This should be eventually removed completely when we are sure about caching correctness + if (key := frappe.can_cache_doc((doctype, name))) and frappe.cache.exists(key): + frappe._set_document_in_cache(key, doc) + run_onload(doc) doc.apply_fieldlevel_read_permissions()