From 71c4e892f69cf0fb2a093f13f2084edfc5258d59 Mon Sep 17 00:00:00 2001 From: Amnon Heiman Date: Tue, 29 Dec 2015 17:41:20 +0200 Subject: [PATCH 1/3] APIClient: Fixing parsing long as int The APIClient use getInt to return a long value wich can cause number trancation. Signed-off-by: Amnon Heiman --- src/main/java/com/scylladb/jmx/api/APIClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/scylladb/jmx/api/APIClient.java b/src/main/java/com/scylladb/jmx/api/APIClient.java index 66c34e6..daa7d28 100644 --- a/src/main/java/com/scylladb/jmx/api/APIClient.java +++ b/src/main/java/com/scylladb/jmx/api/APIClient.java @@ -576,7 +576,7 @@ public class APIClient { if (obj.get(k) instanceof JsonString) { key = obj.getString(k); } else { - val = obj.getInt(k); + val = obj.getJsonNumber(k).longValue(); } } if (val > 0 && !key.equals("")) { From e0e7dcdb5c6bae1f105bb080dbb5dd6b59390120 Mon Sep 17 00:00:00 2001 From: Amnon Heiman Date: Tue, 29 Dec 2015 17:42:18 +0200 Subject: [PATCH 2/3] APIClient: Add a mapStringDouble method This patch adds a method to the APIClient that return a map of String and Double. It support both simple and with query parameters. Signed-off-by: Amnon Heiman --- .../java/com/scylladb/jmx/api/APIClient.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/com/scylladb/jmx/api/APIClient.java b/src/main/java/com/scylladb/jmx/api/APIClient.java index daa7d28..0a1384a 100644 --- a/src/main/java/com/scylladb/jmx/api/APIClient.java +++ b/src/main/java/com/scylladb/jmx/api/APIClient.java @@ -692,4 +692,37 @@ public class APIClient { public long[] getEstimatedHistogramAsLongArrValue(String string) { return getEstimatedHistogramAsLongArrValue(string, null); } + + public Map getMapStringDouble(String string, + MultivaluedMap queryParams) { + if (string.equals("")) { + return null; + } + JsonReader reader = getReader(string, queryParams); + JsonArray arr = reader.readArray(); + Map map = new HashMap(); + for (int i = 0; i < arr.size(); i++) { + JsonObject obj = arr.getJsonObject(i); + Iterator it = obj.keySet().iterator(); + String key = ""; + double val = -1; + while (it.hasNext()) { + String k = it.next(); + if (obj.get(k) instanceof JsonString) { + key = obj.getString(k); + } else { + val = obj.getJsonNumber(k).doubleValue(); + } + } + if (!key.equals("")) { + map.put(key, val); + } + + } + reader.close(); + return map; + } + public Map getMapStringDouble(String string) { + return getMapStringDouble(string, null); + } } From ccb474e424e48f906f704a8a34de0d0e39ab59da Mon Sep 17 00:00:00 2001 From: Amnon Heiman Date: Tue, 29 Dec 2015 17:43:48 +0200 Subject: [PATCH 3/3] StorageService: Support the update getLoadMap API The API was modify to return the load map as a map of string to double instead of formatted string. This patch change the code to support the udpated API. Signed-off-by: Amnon Heiman --- .../org/apache/cassandra/service/StorageService.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/cassandra/service/StorageService.java b/src/main/java/org/apache/cassandra/service/StorageService.java index 9f84ffc..cfed575 100644 --- a/src/main/java/org/apache/cassandra/service/StorageService.java +++ b/src/main/java/org/apache/cassandra/service/StorageService.java @@ -366,15 +366,20 @@ public class StorageService extends NotificationBroadcasterSupport /** Human-readable load value. Keys are IP addresses. */ public Map getLoadMap() { log(" getLoadMap()"); - Map load = c.getMapStrValue("/storage_service/load_map"); + Map load = getLoadMapAsDouble(); Map map = new HashMap<>(); - for (Map.Entry entry : load.entrySet()) + for (Map.Entry entry : load.entrySet()) { - map.put(entry.getKey(), FileUtils.stringifyFileSize(Double.parseDouble(entry.getValue()))); + map.put(entry.getKey(), FileUtils.stringifyFileSize(entry.getValue())); } return map; } + public Map getLoadMapAsDouble() { + log(" getLoadMapAsDouble()"); + return c.getMapStringDouble("/storage_service/load_map"); + } + /** * Return the generation value for this node. *