From 5898b95329ecc042b0798123d656013426f48d14 Mon Sep 17 00:00:00 2001 From: stack Date: Tue, 24 Nov 2015 17:06:46 -0800 Subject: [PATCH] HBASE-14860 Improve BoundedByteBufferPool; make lockless --- .../hadoop/hbase/io/BoundedByteBufferPool.java | 14 +++++++++----- .../hbase/io/TestBoundedByteBufferPool.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/BoundedByteBufferPool.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/BoundedByteBufferPool.java index dfbdc5bbfd9..deddb5192d1 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/BoundedByteBufferPool.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/BoundedByteBufferPool.java @@ -76,19 +76,23 @@ public class BoundedByteBufferPool { // queued buffers in any transition. private final AtomicLong stateRef = new AtomicLong(); - private static int toCountOfBuffers(long state) { + @VisibleForTesting + static int toCountOfBuffers(long state) { return (int)state; } - private static int toTotalCapacity(long state) { + @VisibleForTesting + static int toTotalCapacity(long state) { return (int)(state >>> 32); } - private static long toState(int countOfBuffers, int totalCapacity) { - return ((long)totalCapacity << 32) | totalCapacity; + @VisibleForTesting + static long toState(int countOfBuffers, int totalCapacity) { + return ((long)totalCapacity << 32) | countOfBuffers; } - private static long subtractOneBufferFromState(long state, int capacity) { + @VisibleForTesting + static long subtractOneBufferFromState(long state, int capacity) { return state - ((long)capacity << 32) - 1; } diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/TestBoundedByteBufferPool.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/TestBoundedByteBufferPool.java index bf4f0a5ec88..8775d7f7bab 100644 --- a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/TestBoundedByteBufferPool.java +++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/TestBoundedByteBufferPool.java @@ -17,6 +17,10 @@ */ package org.apache.hadoop.hbase.io; +import static org.apache.hadoop.hbase.io.BoundedByteBufferPool.subtractOneBufferFromState; +import static org.apache.hadoop.hbase.io.BoundedByteBufferPool.toCountOfBuffers; +import static org.apache.hadoop.hbase.io.BoundedByteBufferPool.toState; +import static org.apache.hadoop.hbase.io.BoundedByteBufferPool.toTotalCapacity; import static org.junit.Assert.assertEquals; import java.nio.ByteBuffer; @@ -146,4 +150,18 @@ public class TestBoundedByteBufferPool { // runningAverage in pool assertEquals(initialByteBufferSize, this.reservoir.getRunningAverage()); } + + @Test + public void testStateConversionMethods() { + int countOfBuffers = 123; + int totalCapacity = 456; + + long state = toState(countOfBuffers, totalCapacity); + assertEquals(countOfBuffers, toCountOfBuffers(state)); + assertEquals(totalCapacity, toTotalCapacity(state)); + + long state2 = subtractOneBufferFromState(state, 7); + assertEquals(countOfBuffers - 1, toCountOfBuffers(state2)); + assertEquals(totalCapacity - 7, toTotalCapacity(state2)); + } }