db: logging option for cursor

In some cases we expect query to fail (LOCK NOWAIT) but it still
clutters the logs. Option for not logging cursor-level errors.

Fixes: https://pagure.io/koji/issue/2837
This commit is contained in:
Tomas Kopecek 2021-12-07 13:32:35 +01:00
parent bc04708990
commit e7db7d8b53
3 changed files with 10 additions and 6 deletions

View file

@ -5421,10 +5421,13 @@ def _singleValue(query, values=None, strict=True):
return None
def _dml(operation, values):
"""Run an insert, update, or delete. Return number of rows affected"""
def _dml(operation, values, log=True):
"""Run an insert, update, or delete. Return number of rows affected
If log is False, errors will not be logged. It makes sense only for
queries which are expected to fail (LOCK NOWAIT)
"""
c = context.cnx.cursor()
c.execute(operation, values)
c.execute(operation, values, log=log)
ret = c.rowcount
logger.debug("Operation affected %s row(s)", ret)
c.close()

View file

@ -132,7 +132,7 @@ class CursorWrapper:
params[i] = tuple(item)
return sql, params
def execute(self, operation, parameters=()):
def execute(self, operation, parameters=(), log=True):
debug = self.logger.isEnabledFor(logging.DEBUG)
operation, parameters = self.preformat(operation, parameters)
if debug:
@ -141,7 +141,8 @@ class CursorWrapper:
try:
ret = self.cursor.execute(operation, parameters)
except Exception:
self.logger.error('Query failed. Query was: %s', self.quote(operation, parameters))
if log:
self.logger.error('Query failed. Query was: %s', self.quote(operation, parameters))
raise
if debug:
self.logger.debug("Execute operation completed in %.4f seconds", time.time() - start)

View file

@ -356,7 +356,7 @@ def handle_db_msgs(urls, CONFIG):
# we're running in postCommit, so we need to handle new transaction
c.execute('BEGIN')
try:
c.execute('LOCK TABLE proton_queue IN ACCESS EXCLUSIVE MODE NOWAIT')
c.execute('LOCK TABLE proton_queue IN ACCESS EXCLUSIVE MODE NOWAIT', log=False)
except psycopg2.OperationalError:
LOG.debug('skipping db queue due to lock')
return