changeset 9c2b17ecf341 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=9c2b17ecf341
description:
        Add increasing delay on OperationalError

        This increase the success rate of retry if the other transaction last.

        issue8014
        review50701002
diffstat:

 CHANGELOG                       |  1 +
 trytond/protocols/dispatcher.py |  6 +++++-
 trytond/protocols/wrappers.py   |  6 +++++-
 trytond/worker.py               |  5 ++++-
 4 files changed, 15 insertions(+), 3 deletions(-)

diffs (69 lines):

diff -r 7c73ae565b76 -r 9c2b17ecf341 CHANGELOG
--- a/CHANGELOG Mon Feb 04 22:19:37 2019 +0100
+++ b/CHANGELOG Mon Feb 04 22:23:12 2019 +0100
@@ -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 -r 7c73ae565b76 -r 9c2b17ecf341 trytond/protocols/dispatcher.py
--- a/trytond/protocols/dispatcher.py   Mon Feb 04 22:19:37 2019 +0100
+++ b/trytond/protocols/dispatcher.py   Mon Feb 04 22:23:12 2019 +0100
@@ -4,6 +4,7 @@
 import http.client
 import logging
 import pydoc
+import time
 try:
     from http import HTTPStatus
 except ImportError:
@@ -169,7 +170,10 @@
         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 -r 7c73ae565b76 -r 9c2b17ecf341 trytond/protocols/wrappers.py
--- a/trytond/protocols/wrappers.py     Mon Feb 04 22:19:37 2019 +0100
+++ b/trytond/protocols/wrappers.py     Mon Feb 04 22:23:12 2019 +0100
@@ -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 @@
                 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 -r 7c73ae565b76 -r 9c2b17ecf341 trytond/worker.py
--- a/trytond/worker.py Mon Feb 04 22:19:37 2019 +0100
+++ b/trytond/worker.py Mon Feb 04 22:23:12 2019 +0100
@@ -100,7 +100,10 @@
     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()

Reply via email to