diff --git a/CHANGELOG b/CHANGELOG index 52d21cb2f1..d0bd45b28b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add increasing delay on database operational error retry * Allows to lock records for update * Remove _nocache on Transaction * Make Cache transactional diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py index 66eb8cf269..db71842583 100644 --- a/trytond/protocols/dispatcher.py +++ b/trytond/protocols/dispatcher.py @@ -4,6 +4,7 @@ import http.client import logging import pydoc +import time try: from http import HTTPStatus except ImportError: @@ -169,7 +170,10 @@ def _dispatch(request, pool, *args, **kwargs): obj, method, args, kwargs, username, request.remote_addr, request.path) logger.info(log_message, *log_args) - for count in range(config.getint('database', 'retry'), -1, -1): + retry = config.getint('database', 'retry') + for count in range(retry, -1, -1): + if count != retry: + time.sleep(0.02 * (retry - count)) with Transaction().start(pool.database_name, user, readonly=rpc.readonly) as transaction: try: diff --git a/trytond/protocols/wrappers.py b/trytond/protocols/wrappers.py index bcb5e245e3..4b452ef10e 100644 --- a/trytond/protocols/wrappers.py +++ b/trytond/protocols/wrappers.py @@ -3,6 +3,7 @@ import base64 import gzip import logging +import time from io import BytesIO from functools import wraps try: @@ -145,7 +146,10 @@ def with_transaction(readonly=None): else: readonly_ = True context = {'_request': request.context} - for count in range(config.getint('database', 'retry'), -1, -1): + retry = config.getint('database', 'retry') + for count in range(retry, -1, -1): + if count != retry: + time.sleep(0.02 * (retry - count)) with Transaction().start( pool.database_name, 0, readonly=readonly_, context=context) as transaction: diff --git a/trytond/worker.py b/trytond/worker.py index 056cf83f0a..bbf2bca632 100644 --- a/trytond/worker.py +++ b/trytond/worker.py @@ -100,7 +100,10 @@ def run_task(pool, task_id): Queue = pool.get('ir.queue') logger.info('task "%d" started', task_id) try: - for count in range(config.getint('database', 'retry'), -1, -1): + retry = config.getint('database', 'retry') + for count in range(retry, -1, -1): + if count != retry: + time.sleep(0.02 * (retry - count)) with Transaction().start(pool.database_name, 0) as transaction: try: Queue(task_id).run()