diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java index 73ca011004a1..0f6e8fd3e251 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java @@ -63,7 +63,7 @@ public long getIOHitsPerSecond() { public double getIOTimePerHit() { long time = ioHitTime.sum() / NANO_TIME; long count = ioHitCount.sum(); - return ((float) time / (float) count); + return count == 0 ? 0.0 : (double) time / count; } public void reset() { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java index bbc15c555b07..203927d59497 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -34,6 +35,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.LongAdder; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; @@ -44,6 +46,7 @@ import org.apache.hadoop.hbase.io.ByteBuffAllocator; import org.apache.hadoop.hbase.io.hfile.BlockCacheKey; import org.apache.hadoop.hbase.io.hfile.BlockType; +import org.apache.hadoop.hbase.io.hfile.CacheStats; import org.apache.hadoop.hbase.io.hfile.CacheTestUtils; import org.apache.hadoop.hbase.io.hfile.CacheTestUtils.HFileBlockPair; import org.apache.hadoop.hbase.io.hfile.Cacheable; @@ -770,4 +773,20 @@ public void testBlockAdditionWaitWhenCache() throws Exception { HBASE_TESTING_UTILITY.cleanupTestDir(); } } + + @Test + public void testIOTimePerHitReturnsZeroWhenNoHits() + throws NoSuchFieldException, IllegalAccessException { + CacheStats cacheStats = cache.getStats(); + assertTrue(cacheStats instanceof BucketCacheStats); + BucketCacheStats bucketCacheStats = (BucketCacheStats) cacheStats; + + Field field = BucketCacheStats.class.getDeclaredField("ioHitCount"); + field.setAccessible(true); + LongAdder ioHitCount = (LongAdder) field.get(bucketCacheStats); + + assertEquals(0, ioHitCount.sum()); + double ioTimePerHit = bucketCacheStats.getIOTimePerHit(); + assertEquals(0, ioTimePerHit, 0.0); + } }