From 02e05985064d7f0a2bd2de94857ca75dcacb9c9d Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 11 Mar 2016 14:00:28 +0200 Subject: [PATCH] APIClient: Fix error handling if connection to API server fails Running 'nodetool status' now reports the following if the JMX proxy is not able to connect to an API server: nodetool: Unable to connect to Scylla API server: java.net.ConnectException: Connection refused See 'nodetool help' or 'nodetool help '. instead of the scary-looking: error: javax.ws.rs.ProcessingException (no security manager: RMI class loader disabled) -- StackTrace -- java.lang.ClassNotFoundException: javax.ws.rs.ProcessingException (no security manager: RMI class loader disabled) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:393) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:185) at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637) at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264) at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:214) That happens because the MBean propagates a 'javax.ws.rs.ProcessingException' to nodetool which does not have it in it's classpath and loading via RMI fails. Fixes #25. Message-Id: <1457697628-31792-1-git-send-email-penberg@scylladb.com> --- .../java/com/scylladb/jmx/api/APIClient.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/scylladb/jmx/api/APIClient.java b/src/main/java/com/scylladb/jmx/api/APIClient.java index 0a1384a..4497557 100644 --- a/src/main/java/com/scylladb/jmx/api/APIClient.java +++ b/src/main/java/com/scylladb/jmx/api/APIClient.java @@ -23,6 +23,7 @@ import javax.json.JsonReaderFactory; import javax.json.JsonString; import javax.management.openmbean.TabularData; import javax.management.openmbean.TabularDataSupport; +import javax.ws.rs.ProcessingException; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; @@ -141,27 +142,31 @@ public class APIClient { public String getRawValue(String string, MultivaluedMap queryParams, long duration) { - if (string.equals("")) { - return ""; - } - String key = getCacheKey(string, queryParams, duration); - String res = getStringFromCache(key, duration); - if (res != null) { - return res; - } - Response response = get(string, queryParams).get(Response.class); + try { + if (string.equals("")) { + return ""; + } + String key = getCacheKey(string, queryParams, duration); + String res = getStringFromCache(key, duration); + if (res != null) { + return res; + } + Response response = get(string, queryParams).get(Response.class); - if (response.getStatus() != Response.Status.OK.getStatusCode() ) { - // TBD - // We are currently not caching errors, - // it should be reconsider. - throw getException(response.readEntity(String.class)); + if (response.getStatus() != Response.Status.OK.getStatusCode()) { + // TBD + // We are currently not caching errors, + // it should be reconsider. + throw getException(response.readEntity(String.class)); + } + res = response.readEntity(String.class); + if (duration > 0) { + cache.put(key, new CacheEntry(res)); + } + return res; + } catch (ProcessingException e) { + throw new IllegalStateException("Unable to connect to Scylla API server: " + e.getMessage()); } - res = response.readEntity(String.class); - if (duration > 0) { - cache.put(key, new CacheEntry(res)); - } - return res; } public String getRawValue(String string,