HBASE-20571 JMXJsonServlet generates invalid JSON if it has NaN in metrics - CacheStats won't generate NaN metrics. - JSONBean class will serialize special floating point values as "NaN", "Infinity" or "-Infinity"
Signed-off-by: Andrew Purtell <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/6148b478 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/6148b478 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/6148b478 Branch: refs/heads/HBASE-19064 Commit: 6148b4785d5fb9b1f8fbe40e5c4293950ec03012 Parents: 8c9825a Author: Balazs Meszaros <[email protected]> Authored: Fri May 11 16:30:38 2018 +0200 Committer: Andrew Purtell <[email protected]> Committed: Wed May 16 12:20:39 2018 -0700 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/util/JSONBean.java | 6 ++- .../hadoop/hbase/io/hfile/CacheStats.java | 40 +++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/6148b478/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java ---------------------------------------------------------------------- diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java index 80ffa27..da89a41 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java @@ -310,7 +310,11 @@ public class JSONBean { jg.writeEndArray(); } else if(value instanceof Number) { Number n = (Number)value; - jg.writeNumber(n.toString()); + if (Double.isFinite(n.doubleValue())) { + jg.writeNumber(n.toString()); + } else { + jg.writeString(n.toString()); + } } else if(value instanceof Boolean) { Boolean b = (Boolean)value; jg.writeBoolean(b); http://git-wip-us.apache.org/repos/asf/hbase/blob/6148b478/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheStats.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheStats.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheStats.java index 5edd259..c1c92e1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheStats.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheStats.java @@ -388,23 +388,53 @@ public class CacheStats { } public double getHitRatio() { - return ((double) getHitCount() / (double) getRequestCount()); + double requestCount = getRequestCount(); + + if (requestCount == 0) { + return 0; + } + + return getHitCount() / requestCount; } public double getHitCachingRatio() { - return ((double) getHitCachingCount() / (double) getRequestCachingCount()); + double requestCachingCount = getRequestCachingCount(); + + if (requestCachingCount == 0) { + return 0; + } + + return getHitCachingCount() / requestCachingCount; } public double getMissRatio() { - return ((double) getMissCount() / (double) getRequestCount()); + double requestCount = getRequestCount(); + + if (requestCount == 0) { + return 0; + } + + return getMissCount() / requestCount; } public double getMissCachingRatio() { - return ((double) getMissCachingCount() / (double) getRequestCachingCount()); + double requestCachingCount = getRequestCachingCount(); + + if (requestCachingCount == 0) { + return 0; + } + + return getMissCachingCount() / requestCachingCount; } public double evictedPerEviction() { - return ((double) getEvictedCount() / (double) getEvictionCount()); + double evictionCount = getEvictionCount(); + + if (evictionCount == 0) { + return 0; + } + + return getEvictedCount() / evictionCount; } public long getFailedInserts() {
