diff --git a/odoo/addons/base/ir/ir_logging.py b/odoo/addons/base/ir/ir_logging.py index 4e3caef0794a5a9a3cf7f7547389e616de787414..f672a76edff9289aa164d7ab6436adbc467b72e3 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 84e9702479b97157bfec0ff26ef76924041938b0..dac9b433e8c4ac847a048adfe7c2efad7ffed187 100644 --- a/odoo/netsvc.py +++ b/odoo/netsvc.py @@ -54,7 +54,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): @@ -64,7 +64,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