summaryrefslogtreecommitdiff
path: root/odoo/service
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-09-13 18:07:59 +0200
committerChristophe Simonis <chs@odoo.com>2019-09-13 18:07:59 +0200
commit6c948c36bbf72dd896e0bff03aa7fbddadcbb0cd (patch)
treef8620905c011735d8a3c340c46d1417a54a75972 /odoo/service
parent48503fcf08eac6fed12e080d4f501f9bbc8d257d (diff)
parent197474e5b9ad43ab2d587a98136a1a809ce9a2e7 (diff)
[MERGE] forward port branch saas-12.5 up to 197474e5b9a
Diffstat (limited to 'odoo/service')
-rw-r--r--odoo/service/db.py2
-rw-r--r--odoo/service/model.py3
-rw-r--r--odoo/service/server.py30
3 files changed, 30 insertions, 5 deletions
diff --git a/odoo/service/db.py b/odoo/service/db.py
index 0cc86e4ee66..b3c90bd99a0 100644
--- a/odoo/service/db.py
+++ b/odoo/service/db.py
@@ -304,7 +304,7 @@ def restore_db(db, dump_file, copy=False):
if odoo.tools.config['unaccent']:
try:
- with cr.savepoint():
+ with cr.savepoint(flush=False):
cr.execute("CREATE EXTENSION unaccent")
except psycopg2.Error:
pass
diff --git a/odoo/service/model.py b/odoo/service/model.py
index 8f419e1c61d..9673b6f98c9 100644
--- a/odoo/service/model.py
+++ b/odoo/service/model.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
+from contextlib import closing
from functools import wraps
import logging
from psycopg2 import IntegrityError, OperationalError, errorcodes
@@ -73,7 +74,7 @@ def check(f):
# We open a *new* cursor here, one reason is that failed SQL
# queries (as in IntegrityError) will invalidate the current one.
- with odoo.sql_db.db_connect(dbname).cursor() as cr:
+ with closing(odoo.sql_db.db_connect(dbname).cursor()) as cr:
if ttype == 'sql_constraint':
res = translate_sql_constraint(cr, key=key, lang=lang)
else:
diff --git a/odoo/service/server.py b/odoo/service/server.py
index cab3f75fe85..490d204d166 100644
--- a/odoo/service/server.py
+++ b/odoo/service/server.py
@@ -554,9 +554,28 @@ class GeventServer(CommonServer):
def start(self):
import gevent
try:
- from gevent.pywsgi import WSGIServer
+ from gevent.pywsgi import WSGIServer, WSGIHandler
except ImportError:
- from gevent.wsgi import WSGIServer
+ from gevent.wsgi import WSGIServer, WSGIHandler
+
+ class ProxyHandler(WSGIHandler):
+ """ When logging requests, try to get the client address from
+ the environment so we get proxyfix's modifications (if any).
+
+ Derived from werzeug.serving.WSGIRequestHandler.log
+ / werzeug.serving.WSGIRequestHandler.address_string
+ """
+ def format_request(self):
+ old_address = self.client_address
+ if getattr(self, 'environ', None):
+ self.client_address = self.environ['REMOTE_ADDR']
+ elif not self.client_address:
+ self.client_address = '<local>'
+ # other cases are handled inside WSGIHandler
+ try:
+ return super().format_request()
+ finally:
+ self.client_address = old_address
set_limit_memory_hard()
if os.name == 'posix':
@@ -565,7 +584,12 @@ class GeventServer(CommonServer):
signal.signal(signal.SIGUSR1, log_ormcache_stats)
gevent.spawn(self.watchdog)
- self.httpd = WSGIServer((self.interface, self.port), self.app)
+ self.httpd = WSGIServer(
+ (self.interface, self.port), self.app,
+ log=logging.getLogger('longpolling'),
+ error_log=logging.getLogger('longpolling'),
+ handler_class=ProxyHandler,
+ )
_logger.info('Evented Service (longpolling) running on %s:%s', self.interface, self.port)
try:
self.httpd.serve_forever()