You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@bookkeeper.apache.org by GitBox <gi...@apache.org> on 2018/01/17 18:35:05 UTC

[GitHub] sijie closed pull request #996: DoubleByteBuf fix for Netty > 4.1.12

sijie closed pull request #996: DoubleByteBuf fix for Netty > 4.1.12
URL: https://github.com/apache/bookkeeper/pull/996
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DoubleByteBuf.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DoubleByteBuf.java
index e55dca28f..9c51601d1 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DoubleByteBuf.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DoubleByteBuf.java
@@ -17,6 +17,7 @@
 */
 package org.apache.bookkeeper.util;
 
+import com.google.common.collect.ObjectArrays;
 import io.netty.buffer.AbstractReferenceCountedByteBuf;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
@@ -361,7 +362,7 @@ public ByteBuffer internalNioBuffer(int index, int length) {
 
     @Override
     public ByteBuffer nioBuffer(int index, int length) {
-        ByteBuffer dst = ByteBuffer.allocate(length);
+        ByteBuffer dst = isDirect() ? ByteBuffer.allocateDirect(length) : ByteBuffer.allocate(length);
         ByteBuf b = Unpooled.wrappedBuffer(dst);
         b.writerIndex(0);
         getBytes(index, b, length);
@@ -387,7 +388,10 @@ public String toString() {
 
     @Override
     public ByteBuffer[] nioBuffers() {
-        return nioBuffers(readerIndex(), readableBytes());
+        if (b1.nioBufferCount() == 1 && b2.nioBufferCount() == 1) {
+            return new ByteBuffer[] { b1.nioBuffer(), b2.nioBuffer() };
+        }
+        return ObjectArrays.concat(b1.nioBuffers(), b2.nioBuffers(), ByteBuffer.class);
     }
 
     @Override
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/DoubleByteBufTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/DoubleByteBufTest.java
index 270a60f94..0bb182595 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/DoubleByteBufTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/DoubleByteBufTest.java
@@ -19,6 +19,8 @@
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.PooledByteBufAllocator;
@@ -123,6 +125,54 @@ public void testToByteBuffer() {
         assertEquals(ByteBuffer.wrap(new byte[] { 1, 2, 3, 4 }), b.nioBuffer());
     }
 
+    @Test
+    public void testNonDirectNioBuffer() {
+        ByteBuf b1 = Unpooled.wrappedBuffer(new byte[] { 1, 2 });
+        ByteBuf b2 = Unpooled.wrappedBuffer(new byte[] { 3, 4 });
+        ByteBuf b = DoubleByteBuf.get(b1, b2);
+        assertFalse(b1.isDirect());
+        assertFalse(b2.isDirect());
+        assertFalse(b.isDirect());
+        ByteBuffer nioBuffer = b.nioBuffer();
+        assertFalse(nioBuffer.isDirect());
+    }
+
+    @Test
+    public void testNonDirectPlusDirectNioBuffer() {
+        ByteBuf b1 = Unpooled.wrappedBuffer(new byte[] { 1, 2 });
+        ByteBuf b2 = Unpooled.directBuffer(2);
+        ByteBuf b = DoubleByteBuf.get(b1, b2);
+        assertFalse(b1.isDirect());
+        assertTrue(b2.isDirect());
+        assertFalse(b.isDirect());
+        ByteBuffer nioBuffer = b.nioBuffer();
+        assertFalse(nioBuffer.isDirect());
+    }
+
+    @Test
+    public void testDirectPlusNonDirectNioBuffer() {
+        ByteBuf b1 = Unpooled.directBuffer(2);
+        ByteBuf b2 = Unpooled.wrappedBuffer(new byte[] { 1, 2 });
+        ByteBuf b = DoubleByteBuf.get(b1, b2);
+        assertTrue(b1.isDirect());
+        assertFalse(b2.isDirect());
+        assertFalse(b.isDirect());
+        ByteBuffer nioBuffer = b.nioBuffer();
+        assertFalse(nioBuffer.isDirect());
+    }
+
+    @Test
+    public void testDirectNioBuffer() {
+        ByteBuf b1 = Unpooled.directBuffer(2);
+        ByteBuf b2 = Unpooled.directBuffer(2);
+        ByteBuf b = DoubleByteBuf.get(b1, b2);
+        assertTrue(b1.isDirect());
+        assertTrue(b2.isDirect());
+        assertTrue(b.isDirect());
+        ByteBuffer nioBuffer = b.nioBuffer();
+        assertTrue(nioBuffer.isDirect());
+    }
+
     /**
      * Verify that readableBytes() returns writerIndex - readerIndex. In this case writerIndex is the end of the buffer
      * and readerIndex is increased by 64.


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services