From d151a82d78ee01b5efd271bfb7af61eea2dc91ee Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Thu, 15 Jul 2021 17:07:47 -0300 Subject: [PATCH 1/3] add libtool and automake to the dockerfiles so they can build coincurve --- docker/Dockerfile.wallet_server | 1 + docker/Dockerfile.web | 1 + 2 files changed, 2 insertions(+) diff --git a/docker/Dockerfile.wallet_server b/docker/Dockerfile.wallet_server index 1d913793b..a3ed8b60e 100644 --- a/docker/Dockerfile.wallet_server +++ b/docker/Dockerfile.wallet_server @@ -13,6 +13,7 @@ RUN apt-get update && \ wget \ tar unzip \ build-essential \ + automake libtool \ pkg-config \ libleveldb-dev \ python3.7 \ diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web index 3e81e235f..683a7ac82 100644 --- a/docker/Dockerfile.web +++ b/docker/Dockerfile.web @@ -11,6 +11,7 @@ ENV DOCKER_TAG=$DOCKER_TAG DOCKER_COMMIT=$DOCKER_COMMIT RUN apt-get update && \ apt-get -y --no-install-recommends install \ wget \ + automake libtool \ tar unzip \ build-essential \ pkg-config \ From b7791d284569daf8cdf1be8e4aa6632720758d08 Mon Sep 17 00:00:00 2001 From: belikor Date: Tue, 13 Jul 2021 11:54:14 -0500 Subject: [PATCH 2/3] exchange_rate_manager: raise exception if `'error'` is in `json_response` If the error is not handled, the running daemon will continuously print the following error message: ``` Traceback (most recent call last): File "lbry/extras/daemon/exchange_rate_manager.py", line 77, in get_rate File "lbry/extras/daemon/exchange_rate_manager.py", line 189, in get_rate_from_response KeyError: 0 ``` This started happening when the UPBit exchange decided to delist the LBC coin. Normally `json_response` should be a dictionary, not a list, so `json_response[0]` causes an error. By checking for the `'error'` key, we can raise the proper exception. Once this is done, the message will be a warning, not a traceback. ``` WARNING lbry.extras.daemon.exchange_rate_manager:92: Failed to get exchange rate from UPbit: result not found ``` --- lbry/extras/daemon/exchange_rate_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lbry/extras/daemon/exchange_rate_manager.py b/lbry/extras/daemon/exchange_rate_manager.py index a80f50575..500c6f24e 100644 --- a/lbry/extras/daemon/exchange_rate_manager.py +++ b/lbry/extras/daemon/exchange_rate_manager.py @@ -186,7 +186,7 @@ class UPbitBTCFeed(MarketFeed): params = {"markets": "BTC-LBC"} def get_rate_from_response(self, json_response): - if len(json_response) != 1 or 'trade_price' not in json_response[0]: + if "error" in json_response or len(json_response) != 1 or 'trade_price' not in json_response[0]: raise InvalidExchangeRateResponseError(self.name, 'result not found') return 1.0 / float(json_response[0]['trade_price']) From a74685d66d42f20827f62d788e7aa741336065f2 Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Wed, 14 Jul 2021 16:40:26 -0300 Subject: [PATCH 3/3] add script to troubleshoot p2p/dht --- .../troubleshoot_p2p_and_dht_webservice.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 scripts/troubleshoot_p2p_and_dht_webservice.py diff --git a/scripts/troubleshoot_p2p_and_dht_webservice.py b/scripts/troubleshoot_p2p_and_dht_webservice.py new file mode 100644 index 000000000..dc004ff7f --- /dev/null +++ b/scripts/troubleshoot_p2p_and_dht_webservice.py @@ -0,0 +1,71 @@ +import asyncio +from aiohttp import web + +from lbry.blob_exchange.serialization import BlobRequest, BlobResponse +from lbry.dht.constants import generate_id +from lbry.dht.node import Node +from lbry.dht.peer import make_kademlia_peer, PeerManager +from lbry.extras.daemon.storage import SQLiteStorage + +loop = asyncio.get_event_loop() +NODE = Node( + loop, PeerManager(loop), generate_id(), 60600, 60600, 3333, None, + storage=SQLiteStorage(None, ":memory:", loop, loop.time) +) + + +async def check_p2p(ip, port): + writer = None + try: + reader, writer = await asyncio.open_connection(ip, port) + writer.write(BlobRequest.make_request_for_blob_hash('0'*96).serialize()) + return BlobResponse.deserialize(await reader.readuntil(b'}')).get_address_response().lbrycrd_address + except OSError: + return None + finally: + if writer: + writer.close() + await writer.wait_closed() + + +async def check_dht(ip, port): + peer = make_kademlia_peer(None, ip, udp_port=int(port)) + return await NODE.protocol.get_rpc_peer(peer).ping() + + +async def endpoint_p2p(request): + p2p_port = request.match_info.get('p2p_port', "3333") + try: + address = await asyncio.wait_for(check_p2p(request.remote, p2p_port), 3) + except asyncio.TimeoutError: + address = None + return {"status": address is not None, "port": p2p_port, "payment_address": address} + + +async def endpoint_dht(request): + dht_port = request.match_info.get('dht_port', "3333") + try: + response = await check_dht(request.remote, dht_port) + except asyncio.TimeoutError: + response = None + return {"status": response == b'pong', "port": dht_port} + + +async def endpoint_default(request): + return {"dht_status": await endpoint_dht(request), "p2p_status": await endpoint_p2p(request)} + + +def as_json_response_wrapper(endpoint): + async def json_endpoint(*args, **kwargs): + return web.json_response(await endpoint(*args, **kwargs)) + return json_endpoint + + +app = web.Application() +app.add_routes([web.get('/', as_json_response_wrapper(endpoint_default)), + web.get('/dht/{dht_port}', as_json_response_wrapper(endpoint_dht)), + web.get('/p2p/{p2p_port}', as_json_response_wrapper(endpoint_p2p))]) + +if __name__ == '__main__': + loop.create_task(NODE.start_listening("0.0.0.0")) + web.run_app(app, port=60666) \ No newline at end of file