From 850cbead1436aaa626f7c3c7d7c9d15dffc483d8 Mon Sep 17 00:00:00 2001 From: Balazs Meszaros Date: Fri, 11 May 2018 16:30:38 +0200 Subject: [PATCH] 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" --- .../hadoop/hbase/io/hfile/CacheStats.java | 42 ++++++++++++++++--- .../apache/hadoop/hbase/util/JSONBean.java | 7 +++- 2 files changed, 42 insertions(+), 7 deletions(-) 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 9249271cb6..2c155f8c07 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 @@ -41,7 +41,7 @@ public class CacheStats { /** The number of getBlock requests that were cache hits from primary replica */ private final Counter primaryHitCount = new Counter(); - + /** * The number of getBlock requests that were cache hits, but only from * requests that were set to use the block cache. This is because all reads @@ -387,23 +387,53 @@ public class CacheStats { } public double getHitRatio() { - return ((float)getHitCount()/(float)getRequestCount()); + double requestCount = getRequestCount(); + + if (requestCount == 0) { + return 0; + } + + return getHitCount() / requestCount; } public double getHitCachingRatio() { - return ((float)getHitCachingCount()/(float)getRequestCachingCount()); + double requestCachingCount = getRequestCachingCount(); + + if (requestCachingCount == 0) { + return 0; + } + + return getHitCachingCount() / requestCachingCount; } public double getMissRatio() { - return ((float)getMissCount()/(float)getRequestCount()); + double requestCount = getRequestCount(); + + if (requestCount == 0) { + return 0; + } + + return getMissCount() / requestCount; } public double getMissCachingRatio() { - return ((float)getMissCachingCount()/(float)getRequestCachingCount()); + double requestCachingCount = getRequestCachingCount(); + + if (requestCachingCount == 0) { + return 0; + } + + return getMissCachingCount() / requestCachingCount; } public double evictedPerEviction() { - return ((float)getEvictedCount()/(float)getEvictionCount()); + double evictionCount = getEvictionCount(); + + if (evictionCount == 0) { + return 0; + } + + return getEvictedCount() / evictionCount; } public long getFailedInserts() { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java index a05d7cfcd3..5864a7d2c5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JSONBean.java @@ -317,7 +317,12 @@ public class JSONBean { jg.writeEndArray(); } else if(value instanceof Number) { Number n = (Number)value; - jg.writeNumber(n.toString()); + double doubleValue = n.doubleValue(); + if (Double.isNaN(doubleValue) || Double.isInfinite(doubleValue)) { + jg.writeString(n.toString()); + } else { + jg.writeNumber(n.toString()); + } } else if(value instanceof Boolean) { Boolean b = (Boolean)value; jg.writeBoolean(b); -- 2.17.0