summaryrefslogtreecommitdiff
path: root/odoo/http.py
diff options
context:
space:
mode:
authorSébastien Theys <seb@odoo.com>2019-09-13 14:30:13 +0000
committerSébastien Theys <seb@odoo.com>2019-09-13 14:30:13 +0000
commitf6d56afba0ea96529b1419bf2ed4ac12fc5e98c1 (patch)
tree1d6dea2ae9d3c08d597311ee29b4224b42f8f839 /odoo/http.py
parentf35fa53c8862a71017ced50f4f008030c09514d5 (diff)
[IMP] http: rollback from checked_call only if necessary
The rollback clears the cache, which lose all data that have been fetched before arriving in the route method. This lost cache includes some website data that was used during the dispatch and that will be used again in the route. By keeping it we reduce the number of queries on every request by at least 2. Part of task-2061122 closes odoo/odoo#36245 Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Diffstat (limited to 'odoo/http.py')
-rw-r--r--odoo/http.py6
1 files changed, 5 insertions, 1 deletions
diff --git a/odoo/http.py b/odoo/http.py
index 90acbbe7cf7..cc26cd80a1f 100644
--- a/odoo/http.py
+++ b/odoo/http.py
@@ -331,14 +331,18 @@ class WebRequest(object):
if self.endpoint.first_arg_is_req:
args = (request,) + args
+ first_time = True
+
# Correct exception handling and concurency retry
@service_model.check
def checked_call(___dbname, *a, **kw):
+ nonlocal first_time
# The decorator can call us more than once if there is an database error. In this
# case, the request cursor is unusable. Rollback transaction to create a new one.
- if self._cr:
+ if self._cr and not first_time:
self._cr.rollback()
self.env.clear()
+ first_time = False
result = self.endpoint(*a, **kw)
if isinstance(result, Response) and result.is_qweb:
# Early rendering of lazy responses to benefit from @service_model.check protection