diff --git a/odoo/addons/base/ir/ir_logging.py b/odoo/addons/base/ir/ir_logging.py index 4e3caef0794..f672a76edff 100644 --- a/odoo/addons/base/ir/ir_logging.py +++ b/odoo/addons/base/ir/ir_logging.py @@ -34,4 +34,10 @@ class IrLogging(models.Model): @api.model_cr def init(self): super(IrLogging, self).init() - self._cr.execute("ALTER TABLE ir_logging DROP CONSTRAINT IF EXISTS ir_logging_write_uid_fkey") + self._cr.execute("select 1 from information_schema.constraint_column_usage where table_name = 'ir_logging' and constraint_name = 'ir_logging_write_uid_fkey'") + if self._cr.rowcount: + # DROP CONSTRAINT unconditionally takes an ACCESS EXCLUSIVE lock + # on the table, even "IF EXISTS" is set and not matching; disabling + # the relevant trigger instead acquires SHARE ROW EXCLUSIVE, which + # still conflicts with the ROW EXCLUSIVE needed for an insert + self._cr.execute("ALTER TABLE ir_logging DROP CONSTRAINT ir_logging_write_uid_fkey") diff --git a/odoo/netsvc.py b/odoo/netsvc.py index b6170bd0f57..9cce822f623 100644 --- a/odoo/netsvc.py +++ b/odoo/netsvc.py @@ -28,7 +28,7 @@ def log(logger, level, prefix, msg, depth=None): path_prefix = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) class PostgreSQLHandler(logging.Handler): - """ PostgreSQL Loggin Handler will store logs in the database, by default + """ PostgreSQL Logging Handler will store logs in the database, by default the current database, can be set using --log-db=DBNAME """ def emit(self, record): @@ -38,7 +38,8 @@ class PostgreSQLHandler(logging.Handler): if not dbname: return with tools.ignore(Exception), tools.mute_logger('odoo.sql_db'), sql_db.db_connect(dbname, allow_uri=True).cursor() as cr: - cr.autocommit(True) + # preclude risks of deadlocks + cr.execute("SET LOCAL statement_timeout = 1000") msg = tools.ustr(record.msg) if record.args: msg = msg % record.args