Repository: hbase Updated Branches: refs/heads/master 9250bf809 -> c3685760f
http://git-wip-us.apache.org/repos/asf/hbase/blob/c3685760/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServer.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServer.java new file mode 100644 index 0000000..9f3bd94 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServer.java @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.ipc; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.nio.ByteBuffer; + +import org.apache.hadoop.hbase.io.ByteBufferPool; +import org.apache.hadoop.hbase.ipc.RpcServer.CallCleanup; +import org.apache.hadoop.hbase.nio.ByteBuff; +import org.apache.hadoop.hbase.nio.MultiByteBuff; +import org.apache.hadoop.hbase.nio.SingleByteBuff; +import org.apache.hadoop.hbase.testclassification.RPCTests; +import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.apache.hadoop.hbase.util.Pair; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +@Category({ RPCTests.class, SmallTests.class }) +public class TestRpcServer { + + @Test + public void testAllocateByteBuffToReadInto() throws Exception { + System.out.println(Long.MAX_VALUE); + int maxBuffersInPool = 10; + ByteBufferPool pool = new ByteBufferPool(6 * 1024, maxBuffersInPool); + initPoolWithAllBuffers(pool, maxBuffersInPool); + ByteBuff buff = null; + Pair<ByteBuff, CallCleanup> pair; + // When the request size is less than 1/6th of the pool buffer size. We should use on demand + // created on heap Buffer + pair = RpcServer.allocateByteBuffToReadInto(pool, RpcServer.getMinSizeForReservoirUse(pool), + 200); + buff = pair.getFirst(); + assertTrue(buff.hasArray()); + assertEquals(maxBuffersInPool, pool.getQueueSize()); + assertNull(pair.getSecond()); + // When the request size is > 1/6th of the pool buffer size. + pair = RpcServer.allocateByteBuffToReadInto(pool, RpcServer.getMinSizeForReservoirUse(pool), + 1024); + buff = pair.getFirst(); + assertFalse(buff.hasArray()); + assertEquals(maxBuffersInPool - 1, pool.getQueueSize()); + assertNotNull(pair.getSecond()); + pair.getSecond().run();// CallCleanup#run should put back the BB to pool. + assertEquals(maxBuffersInPool, pool.getQueueSize()); + // Request size> pool buffer size + pair = RpcServer.allocateByteBuffToReadInto(pool, RpcServer.getMinSizeForReservoirUse(pool), + 7 * 1024); + buff = pair.getFirst(); + assertFalse(buff.hasArray()); + assertTrue(buff instanceof MultiByteBuff); + ByteBuffer[] bbs = ((MultiByteBuff) buff).getEnclosingByteBuffers(); + assertEquals(2, bbs.length); + assertTrue(bbs[0].isDirect()); + assertTrue(bbs[1].isDirect()); + assertEquals(6 * 1024, bbs[0].limit()); + assertEquals(1024, bbs[1].limit()); + assertEquals(maxBuffersInPool - 2, pool.getQueueSize()); + assertNotNull(pair.getSecond()); + pair.getSecond().run();// CallCleanup#run should put back the BB to pool. + assertEquals(maxBuffersInPool, pool.getQueueSize()); + + pair = RpcServer.allocateByteBuffToReadInto(pool, RpcServer.getMinSizeForReservoirUse(pool), + 6 * 1024 + 200); + buff = pair.getFirst(); + assertFalse(buff.hasArray()); + assertTrue(buff instanceof MultiByteBuff); + bbs = ((MultiByteBuff) buff).getEnclosingByteBuffers(); + assertEquals(2, bbs.length); + assertTrue(bbs[0].isDirect()); + assertFalse(bbs[1].isDirect()); + assertEquals(6 * 1024, bbs[0].limit()); + assertEquals(200, bbs[1].limit()); + assertEquals(maxBuffersInPool - 1, pool.getQueueSize()); + assertNotNull(pair.getSecond()); + pair.getSecond().run();// CallCleanup#run should put back the BB to pool. + assertEquals(maxBuffersInPool, pool.getQueueSize()); + + ByteBuffer[] buffers = new ByteBuffer[maxBuffersInPool - 1]; + for (int i = 0; i < maxBuffersInPool - 1; i++) { + buffers[i] = pool.getBuffer(); + } + pair = RpcServer.allocateByteBuffToReadInto(pool, RpcServer.getMinSizeForReservoirUse(pool), + 20 * 1024); + buff = pair.getFirst(); + assertFalse(buff.hasArray()); + assertTrue(buff instanceof MultiByteBuff); + bbs = ((MultiByteBuff) buff).getEnclosingByteBuffers(); + assertEquals(2, bbs.length); + assertTrue(bbs[0].isDirect()); + assertFalse(bbs[1].isDirect()); + assertEquals(6 * 1024, bbs[0].limit()); + assertEquals(14 * 1024, bbs[1].limit()); + assertEquals(0, pool.getQueueSize()); + assertNotNull(pair.getSecond()); + pair.getSecond().run();// CallCleanup#run should put back the BB to pool. + assertEquals(1, pool.getQueueSize()); + pool.getBuffer(); + pair = RpcServer.allocateByteBuffToReadInto(pool, RpcServer.getMinSizeForReservoirUse(pool), + 7 * 1024); + buff = pair.getFirst(); + assertTrue(buff.hasArray()); + assertTrue(buff instanceof SingleByteBuff); + assertEquals(7 * 1024, ((SingleByteBuff) buff).getEnclosingByteBuffer().limit()); + assertNull(pair.getSecond()); + } + + private void initPoolWithAllBuffers(ByteBufferPool pool, int maxBuffersInPool) { + ByteBuffer[] buffers = new ByteBuffer[maxBuffersInPool]; + // Just call getBuffer() on pool 'maxBuffersInPool' so as to init all buffers and then put back + // all. Makes pool with max #buffers. + for (int i = 0; i < maxBuffersInPool; i++) { + buffers[i] = pool.getBuffer(); + } + for (ByteBuffer buf : buffers) { + pool.putbackBuffer(buf); + } + } +} \ No newline at end of file