From f45350bb6a5ea4d3af4fce00b19f034dfd3135ad Mon Sep 17 00:00:00 2001 From: Nico Krause Date: Sat, 18 Jan 2025 20:34:01 +0500 Subject: [PATCH] fix(block-scanning): improve error handling and server selection - Retry same block on errors with height++ adjustment - Always reconnect to ElectrumX with random server selection - Remove error type checking for simpler logic - Random selection improves load balancing --- relay/package.json | 2 +- relay/src/doichain/connectElectrum.js | 15 +++++---------- relay/src/pinner/scanBlockchainForNameOps.js | 15 ++++++++------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/relay/package.json b/relay/package.json index f5ad2a4..821977d 100644 --- a/relay/package.json +++ b/relay/package.json @@ -1,6 +1,6 @@ { "name": "libp2p-relay", - "version": "0.12.22", + "version": "0.12.23", "private": true, "scripts": { "start:no-restart": "node src/relay.js", diff --git a/relay/src/doichain/connectElectrum.js b/relay/src/doichain/connectElectrum.js index d905669..2271c1e 100644 --- a/relay/src/doichain/connectElectrum.js +++ b/relay/src/doichain/connectElectrum.js @@ -5,7 +5,6 @@ import logger from '../logger.js'; const MAX_RETRIES = 25; const RETRY_DELAY = 5000; -let currentServerIndex = -1; let connectedClients = []; export const useNextElectrum = async (_network, updateStore) => { @@ -26,10 +25,10 @@ export const useNextElectrum = async (_network, updateStore) => { throw new Error('No Electrum servers available for the given network.'); } - currentServerIndex = (currentServerIndex + 1) % networkNodes.length; - const nextServer = networkNodes[currentServerIndex]; + // Random server selection + const nextServer = networkNodes[Math.floor(Math.random() * networkNodes.length)]; - // Check if we already have a connected client for this server + // Check for existing connection let existingClient = connectedClients.find( (c) => c.host === nextServer.host && @@ -41,7 +40,7 @@ export const useNextElectrum = async (_network, updateStore) => { return existingClient; } - // If not, create a new client and connect + // Create new connection const newClient = new ElectrumxClient( nextServer.host, nextServer.port, @@ -59,10 +58,6 @@ export const useNextElectrum = async (_network, updateStore) => { protocol: nextServer.protocol, }); - // Remove this line as it's causing the duplicate server.version request - // const serverVersion = await newClient.request('server.version'); - // updateStore('electrumServerVersion', serverVersion); - const connectedServer = `${nextServer.protocol}://${nextServer.host}:${nextServer.port}`; updateStore('connectedServer', connectedServer); @@ -74,7 +69,7 @@ export const useNextElectrum = async (_network, updateStore) => { protocol: nextServer.protocol, error: error.message, }); - // If connection fails, try the next server + // Try another random server return useNextElectrum(_network, updateStore); } }; diff --git a/relay/src/pinner/scanBlockchainForNameOps.js b/relay/src/pinner/scanBlockchainForNameOps.js index 125310c..12b994f 100644 --- a/relay/src/pinner/scanBlockchainForNameOps.js +++ b/relay/src/pinner/scanBlockchainForNameOps.js @@ -242,13 +242,14 @@ async function processBlocks( } catch (error) { logger.error(`Error processing block at height ${height}:`, { error }); errorRate.inc(); // Increment the error rate counter - if (error.message.includes('ElectrumX connection')) { - logger.warn('ElectrumX connection lost, attempting to reconnect...'); - await reconnectElectrumClient(electrumClient); - height++; // Retry the current block - } else { - await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait before retrying - } + + // Always attempt to reconnect to ElectrumX + logger.warn('Attempting to reconnect to ElectrumX...'); + await reconnectElectrumClient(electrumClient); + + // Increase height to retry the same block + height++; + continue; } finally { endTimer(); // End timing block processing }