From c07f5c034fd306f23c793ed3475cef4559722c2c Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 19 Aug 2016 09:52:05 +0300 Subject: [PATCH] APIClient: Fix error handling for POST if API call fails Currently, we have a scary looking dtest failure when attempting to force flush a Nodetool command '/data/jenkins/workspace/scylla-1.3-dtest/label/monster/mode/release/smp/1/scylla/resources/cassandra/bin/nodetool -h localhost -p 7100 flush' failed; exit status: 2; stderr: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 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:396) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:186) 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:219) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:245) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162) at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source) at javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source) at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1020) at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:298) at com.sun.proxy.$Proxy7.forceKeyspaceFlush(Unknown Source) at org.apache.cassandra.tools.NodeProbe.forceKeyspaceFlush(NodeProbe.java:290) at org.apache.cassandra.tools.NodeTool$Flush.execute(NodeTool.java:1227) at org.apache.cassandra.tools.NodeTool$NodeToolCmd.run(NodeTool.java:288) at org.apache.cassandra.tools.NodeTool.main(NodeTool.java:202) The problem is rather innocent: the API call fails and we leak javax.ws.rs.ProcessingException, which is not available in nodetool's classpath. In fact, we already fixed the problem for GETs in commit 02e0598 ("APIClient: Fix error handling if connection to API server fails") so do the same thing for POSTs. Message-Id: <1471589525-26435-1-git-send-email-penberg@scylladb.com> --- src/main/java/com/scylladb/jmx/api/APIClient.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/scylladb/jmx/api/APIClient.java b/src/main/java/com/scylladb/jmx/api/APIClient.java index cd7cf66..52e7a56 100644 --- a/src/main/java/com/scylladb/jmx/api/APIClient.java +++ b/src/main/java/com/scylladb/jmx/api/APIClient.java @@ -106,12 +106,15 @@ public class APIClient { } public Response post(String path, MultivaluedMap queryParams) { - Response response = get(path, queryParams).post(Entity.entity(null, MediaType.TEXT_PLAIN)); - if (response.getStatus() != Response.Status.OK.getStatusCode() ) { - throw getException("Scylla API server HTTP POST to URL '" + path + "' failed", response.readEntity(String.class)); + try { + Response response = get(path, queryParams).post(Entity.entity(null, MediaType.TEXT_PLAIN)); + if (response.getStatus() != Response.Status.OK.getStatusCode() ) { + throw getException("Scylla API server HTTP POST to URL '" + path + "' failed", response.readEntity(String.class)); + } + return response; + } catch (ProcessingException e) { + throw new IllegalStateException("Unable to connect to Scylla API server: " + e.getMessage()); } - return response; - } public void post(String path) {