diff --git a/addons/bus/models/bus.py b/addons/bus/models/bus.py index 9c262ae3e17..00b351451d9 100644 --- a/addons/bus/models/bus.py +++ b/addons/bus/models/bus.py @@ -3,11 +3,12 @@ import contextlib import datetime import json import logging +import os import random import selectors import threading import time -from psycopg2 import InterfaceError +from psycopg2 import InterfaceError, sql import odoo from odoo import api, fields, models @@ -20,6 +21,9 @@ _logger = logging.getLogger(__name__) # longpolling timeout connection TIMEOUT = 50 +# custom function to call instead of default PostgreSQL's `pg_notify` +ODOO_NOTIFY_FUNCTION = os.getenv('ODOO_NOTIFY_FUNCTION', 'pg_notify') + #---------------------------------------------------------- # Bus #---------------------------------------------------------- @@ -77,7 +81,8 @@ class ImBus(models.Model): @self.env.cr.postcommit.add def notify(): with odoo.sql_db.db_connect('postgres').cursor() as cr: - cr.execute("notify imbus, %s", (json_dump(list(channels)),)) + query = sql.SQL("SELECT {}('imbus', %s)").format(sql.Identifier(ODOO_NOTIFY_FUNCTION)) + cr.execute(query, (json_dump(list(channels)), )) @api.model def _sendone(self, channel, notification_type, message): diff --git a/odoo/addons/base/models/ir_cron.py b/odoo/addons/base/models/ir_cron.py index e251db29548..c95c1303928 100644 --- a/odoo/addons/base/models/ir_cron.py +++ b/odoo/addons/base/models/ir_cron.py @@ -7,6 +7,7 @@ import psycopg2 import pytz from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta +from psycopg2 import sql import odoo from odoo import api, fields, models, _ @@ -17,6 +18,9 @@ _logger = logging.getLogger(__name__) BASE_VERSION = odoo.modules.get_manifest('base')['version'] MAX_FAIL_TIME = timedelta(hours=5) # chosen with a fair roll of the dice +# custom function to call instead of default PostgreSQL's `pg_notify` +ODOO_NOTIFY_FUNCTION = os.getenv('ODOO_NOTIFY_FUNCTION', 'pg_notify') + class BadVersion(Exception): pass @@ -515,7 +519,8 @@ class ir_cron(models.Model): ir_cron modification and on trigger creation (regardless of call_at) """ with odoo.sql_db.db_connect('postgres').cursor() as cr: - cr.execute('NOTIFY cron_trigger, %s', [self.env.cr.dbname]) + query = sql.SQL("SELECT {}('cron_trigger', %s)").format(sql.Identifier(ODOO_NOTIFY_FUNCTION)) + cr.execute(query, [self.env.cr.dbname]) _logger.debug("cron workers notified")