[FIX] runbot: warn when a local pg backend cannot be terminated

For whatever reason, it happens that we open a testing database in a
psql console as another user. In that case, the runbot is unable to
terminate the backend and goes in an error loop.
This commit is contained in:
Christophe Monniez 2023-02-09 09:29:38 +01:00
parent f7a12c6359
commit f03b0140d5

View File

@ -19,6 +19,7 @@ from odoo.tools.safe_eval import safe_eval
from collections import defaultdict from collections import defaultdict
from pathlib import Path from pathlib import Path
from psycopg2 import sql from psycopg2 import sql
from psycopg2.errors import InsufficientPrivilege
import getpass import getpass
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -876,7 +877,11 @@ class BuildResult(models.Model):
def _local_pg_dropdb(self, dbname): def _local_pg_dropdb(self, dbname):
with local_pgadmin_cursor() as local_cr: with local_pgadmin_cursor() as local_cr:
pid_col = 'pid' if local_cr.connection.server_version >= 90200 else 'procpid' pid_col = 'pid' if local_cr.connection.server_version >= 90200 else 'procpid'
query = 'SELECT pg_terminate_backend({}) FROM pg_stat_activity WHERE datname=%s'.format(pid_col) try:
query = 'SELECT pg_terminate_backend({}) FROM pg_stat_activity WHERE datname=%s'.format(pid_col)
except InsufficientPrivilege:
_logger.warning('Cannot terminate backend process for %s (maybe a root psql console is accessing the database).', dbname)
return
local_cr.execute(query, [dbname]) local_cr.execute(query, [dbname])
local_cr.execute('DROP DATABASE IF EXISTS "%s"' % dbname) local_cr.execute('DROP DATABASE IF EXISTS "%s"' % dbname)
# cleanup filestore # cleanup filestore