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 0c64ebe51aa..7b9525747ba 100644 --- a/odoo/netsvc.py +++ b/odoo/netsvc.py @@ -48,7 +48,7 @@ def LocalService(name): 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): @@ -58,7 +58,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