From ab0e9eb1236d1a5130c7560b9ba89db7f71b2310 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Mon, 13 Aug 2018 19:17:52 +0900 Subject: [PATCH] Improve retry logic --- electrumx/server/daemon.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/electrumx/server/daemon.py b/electrumx/server/daemon.py index 5a7ee99..ecad41c 100644 --- a/electrumx/server/daemon.py +++ b/electrumx/server/daemon.py @@ -42,14 +42,17 @@ class Daemon(object): class DaemonWarmingUpError(Exception): '''Raised when the daemon returns an error in its results.''' - def __init__(self, coin, url, max_workqueue=10): + def __init__(self, coin, url, max_workqueue=10, init_retry=0.25, + max_retry=4.0): self.coin = coin self.logger = class_logger(__name__, self.__class__.__name__) self.set_url(url) - self._height = None # Limit concurrent RPC calls to this number. # See DEFAULT_HTTP_WORKQUEUE in bitcoind, which is typically 16 self.workqueue_semaphore = asyncio.Semaphore(value=max_workqueue) + self.init_retry = init_retry + self.max_retry = max_retry + self._height = None self.available_rpcs = {} def set_url(self, url): @@ -109,19 +112,18 @@ class Daemon(object): are raise through DaemonError. ''' def log_error(error): - nonlocal last_error_log, secs + nonlocal last_error_log, retry now = time.time() if now - last_error_log > 60: last_error_time = now self.logger.error(f'{error} Retrying occasionally...') - if secs == max_secs and self.failover(): - secs = 0.25 + if retry == self.max_retry and self.failover(): + retry = 0 on_good_message = None last_error_log = 0 data = json.dumps(payload) - secs = 0.25 - max_secs = 4 + retry = self.init_retry while True: try: result = await self._send_data(data) @@ -146,8 +148,8 @@ class Daemon(object): log_error('work queue full.') on_good_message = 'running normally' - await asyncio.sleep(secs) - secs = min(max_secs, secs * 2) + await asyncio.sleep(retry) + retry = max(min(self.max_retry, retry * 2), self.init_retry) async def _send_single(self, method, params=None): '''Send a single request to the daemon.'''