From 112675c7820f1be9d75be925d4c00b3fa7bcf017 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 11 Aug 2021 19:22:53 +0100 Subject: [PATCH] Better handling of RPC errors. Previously, if an error was returned from an Electrum server (such as "server busy") it would throw a NetworkException that would be caught outside of the server loop and cause the entire request to fail. Instead of throwing an exception, I am now logging the error and returning null, in the same way we do for IOException and NoSuchElementException further up in the same method. This allows the caller - most likely connectedRpc() - to move on to the next server in the list and try again. This should fix an issue seen where a "server busy" response from a single server was essentially breaking our implementation, as we would give up altogether instead of trying another server. --- .../java/org/qortal/crosschain/ElectrumX.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/crosschain/ElectrumX.java b/src/main/java/org/qortal/crosschain/ElectrumX.java index 8f41ed86..b08cb239 100644 --- a/src/main/java/org/qortal/crosschain/ElectrumX.java +++ b/src/main/java/org/qortal/crosschain/ElectrumX.java @@ -653,18 +653,27 @@ public class ElectrumX extends BitcoinyBlockchainProvider { Object errorObj = responseJson.get("error"); if (errorObj != null) { - if (errorObj instanceof String) - throw new ForeignBlockchainException.NetworkException(String.format("Unexpected error message from ElectrumX RPC %s: %s", method, (String) errorObj), this.currentServer); + if (errorObj instanceof String) { + LOGGER.debug(String.format("Unexpected error message from ElectrumX RPC %s: %s", method, (String) errorObj), this.currentServer); + // Try another server + return null; + } - if (!(errorObj instanceof JSONObject)) - throw new ForeignBlockchainException.NetworkException(String.format("Unexpected error response from ElectrumX RPC %s", method), this.currentServer); + if (!(errorObj instanceof JSONObject)) { + LOGGER.debug(String.format("Unexpected error response from ElectrumX RPC %s", method), this.currentServer); + // Try another server + return null; + } JSONObject errorJson = (JSONObject) errorObj; Object messageObj = errorJson.get("message"); - if (!(messageObj instanceof String)) - throw new ForeignBlockchainException.NetworkException(String.format("Missing/invalid message in error response from ElectrumX RPC %s", method), this.currentServer); + if (!(messageObj instanceof String)) { + LOGGER.debug(String.format("Missing/invalid message in error response from ElectrumX RPC %s", method), this.currentServer); + // Try another server + return null; + } String message = (String) messageObj;