From b01933913f261cc6f001b5d67b66f07065120ce9 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Mon, 16 Jan 2017 19:27:58 +0900 Subject: [PATCH] Add traceback for daemon errors --- server/block_processor.py | 9 +++++---- server/controller.py | 5 +++-- server/daemon.py | 6 +++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/server/block_processor.py b/server/block_processor.py index 100b292..157b5ab 100644 --- a/server/block_processor.py +++ b/server/block_processor.py @@ -15,7 +15,7 @@ import time from collections import defaultdict from functools import partial -from server.daemon import Daemon, DaemonError +from server.daemon import DaemonError from server.version import VERSION from lib.hash import hash_to_str from lib.util import chunks, formatted_time, LoggedClass @@ -138,8 +138,9 @@ class BlockProcessor(server.db.DB): Coordinate backing up in case of chain reorganisations. ''' - def __init__(self, env): + def __init__(self, env, daemon): super().__init__(env) + self.daemon = daemon # These are our state as we move ahead of DB state self.fs_height = self.db_height @@ -148,7 +149,6 @@ class BlockProcessor(server.db.DB): self.tip = self.db_tip self.tx_count = self.db_tx_count - self.daemon = Daemon(self.coin.daemon_urls(env.daemon_url)) self.caught_up_event = asyncio.Event() self.task_queue = asyncio.Queue() self.stop = False @@ -195,7 +195,8 @@ class BlockProcessor(server.db.DB): pass self.logger.info('preparing clean shutdown') self.stop = True - self.add_task(do_nothing) # Ensure something is on the queue + # Ensure something is on the queue so main_loop notices self.stop + self.add_task(do_nothing) async def main_loop(self): '''Main loop for block processing.''' diff --git a/server/controller.py b/server/controller.py index 46534c3..ee8bf64 100644 --- a/server/controller.py +++ b/server/controller.py @@ -21,6 +21,7 @@ from lib.jsonrpc import JSONRPC, RPCError, RequestBase from lib.hash import sha256, double_sha256, hash_to_str, hex_str_to_hash import lib.util as util from server.block_processor import BlockProcessor +from server.daemon import Daemon from server.irc import IRC from server.session import LocalRPC, ElectrumX from server.mempool import MemPool @@ -54,8 +55,8 @@ class Controller(util.LoggedClass): self.loop = asyncio.get_event_loop() self.start = time.time() self.coin = env.coin - self.bp = BlockProcessor(env) - self.daemon = self.bp.daemon + self.daemon = Daemon(env.coin.daemon_urls(env.daemon_url)) + self.bp = BlockProcessor(env, self.daemon) self.mempool = MemPool(self.bp) self.irc = IRC(env) self.env = env diff --git a/server/daemon.py b/server/daemon.py index c456f44..39cb857 100644 --- a/server/daemon.py +++ b/server/daemon.py @@ -10,6 +10,7 @@ daemon.''' import asyncio import json +import traceback import aiohttp @@ -82,11 +83,14 @@ class Daemon(util.LoggedClass): except aiohttp.ClientConnectionError: log_error('connection problem - is your daemon running?') except self.DaemonWarmingUpError: - log_error('still starting up checking blocks.') + log_error('starting up checking blocks.') except (asyncio.CancelledError, DaemonError): raise except Exception as e: + self.log_error(traceback.format_exc()) + self.log_error('response was: {}'.format(resp)) log_error('request gave unexpected error: {}.'.format(e)) + if secs >= max_secs and len(self.urls) > 1: self.url_index = (self.url_index + 1) % len(self.urls) logged_url = self.logged_url(self.urls[self.url_index])