This is an automated email from the ASF dual-hosted git repository.

jorgebg pushed a commit to branch write-TINKERPOP-2161-1
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit eab3420436da3d70e6ab54b79375e97594153f90
Author: Jorge Bay Gondra <jorgebaygon...@gmail.com>
AuthorDate: Mon Feb 18 11:55:53 2019 +0100

    Use unmodifiableBuffers instead of composites
---
 .../driver/ser/GraphBinaryMessageSerializerV1.java | 10 ++---
 .../driver/ser/binary/GraphBinaryWriter.java       | 16 ++++---
 .../ser/binary/RequestMessageSerializer.java       | 24 ++++++----
 .../ser/binary/ResponseMessageSerializer.java      |  6 ++-
 .../ser/binary/types/BigDecimalSerializer.java     |  9 ++--
 .../driver/ser/binary/types/BindingSerializer.java |  9 ++--
 .../driver/ser/binary/types/BulkSetSerializer.java | 11 +++--
 .../ser/binary/types/ByteCodeSerializer.java       | 48 +++++++++++++-------
 .../ser/binary/types/CollectionSerializer.java     |  9 ++--
 .../driver/ser/binary/types/EdgeSerializer.java    | 21 +++++----
 .../driver/ser/binary/types/GraphSerializer.java   | 52 +++++++++++-----------
 .../driver/ser/binary/types/LambdaSerializer.java  | 10 ++---
 .../ser/binary/types/LocalDateTimeSerializer.java  |  8 ++--
 .../driver/ser/binary/types/MapSerializer.java     | 10 ++---
 .../driver/ser/binary/types/MetricsSerializer.java | 16 +++----
 .../ser/binary/types/OffsetDateTimeSerializer.java |  8 ++--
 .../ser/binary/types/OffsetTimeSerializer.java     |  8 ++--
 .../driver/ser/binary/types/PSerializer.java       | 11 +++--
 .../driver/ser/binary/types/PathSerializer.java    |  8 ++--
 .../ser/binary/types/PropertySerializer.java       | 11 +++--
 .../ser/binary/types/SimpleTypeSerializer.java     | 34 +++++++++++++-
 .../binary/types/TraversalMetricsSerializer.java   |  9 ++--
 .../binary/types/TraversalStrategySerializer.java  | 10 ++---
 .../ser/binary/types/TraverserSerializer.java      |  9 ++--
 .../driver/ser/binary/types/TreeSerializer.java    | 13 +++---
 .../ser/binary/types/VertexPropertySerializer.java | 15 +++----
 .../driver/ser/binary/types/VertexSerializer.java  | 13 +++---
 .../ser/binary/types/ZonedDateTimeSerializer.java  |  9 ++--
 .../binary/GraphBinaryMessageSerializerV1Test.java | 31 ++++++++++++-
 .../GraphBinaryReaderWriterRoundTripTest.java      | 15 ++++++-
 .../ser/binary/types/CharSerializerTest.java       | 28 +++++++++++-
 .../types/sample/SamplePersonSerializerTest.java   | 10 ++++-
 .../driver/GraphBinaryReaderWriterBenchmark.java   |  4 ++
 .../gremlin/driver/GraphSONMapperBenchmark.java    |  4 ++
 34 files changed, 318 insertions(+), 191 deletions(-)

diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphBinaryMessageSerializerV1.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphBinaryMessageSerializerV1.java
index c0defd4..be916b4 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphBinaryMessageSerializerV1.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphBinaryMessageSerializerV1.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
+import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryIo;
@@ -125,11 +125,9 @@ public class GraphBinaryMessageSerializerV1 extends 
AbstractMessageSerializer {
 
     @Override
     public ByteBuf serializeRequestAsBinary(final RequestMessage 
requestMessage, final ByteBufAllocator allocator) throws SerializationException 
{
-        final CompositeByteBuf result = allocator.compositeBuffer(3);
-        result.addComponent(true, 
allocator.buffer(1).writeByte(HEADER.length));
-        result.addComponent(true, 
allocator.buffer(HEADER.length).writeBytes(HEADER));
-        result.addComponent(true, requestSerializer.writeValue(requestMessage, 
allocator, writer));
-        return result;
+        return Unpooled.unmodifiableBuffer(
+            allocator.buffer(1 + 
HEADER.length).writeByte(HEADER.length).writeBytes(HEADER),
+            requestSerializer.writeValue(requestMessage, allocator, writer));
     }
 
     @Override
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
index 1703658..9ff773a 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.Unpooled;
+import io.netty.buffer.UnpooledByteBufAllocator;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.CustomTypeSerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.TransformSerializer;
@@ -77,10 +78,10 @@ public class GraphBinaryWriter {
             // Try to serialize the custom value before allocating a composite 
buffer
             ByteBuf customTypeValueBuffer = customTypeSerializer.write(value, 
allocator, this);
 
-            return allocator.compositeBuffer(3)
-                    .addComponent(true, 
Unpooled.wrappedBuffer(customTypeCodeBytes))
-                    .addComponent(true, 
writeValue(customTypeSerializer.getTypeName(), allocator, false))
-                    .addComponent(true, customTypeValueBuffer);
+            return Unpooled.unmodifiableBuffer(
+                    Unpooled.wrappedBuffer(customTypeCodeBytes),
+                    writeValue(customTypeSerializer.getTypeName(), allocator, 
false),
+                    customTypeValueBuffer);
         }
 
         if (serializer instanceof TransformSerializer) {
@@ -93,7 +94,7 @@ public class GraphBinaryWriter {
         // Try to serialize the value before creating a new composite buffer
         ByteBuf typeInfoAndValueBuffer = serializer.write(value, allocator, 
this);
 
-        return allocator.compositeBuffer(2).addComponents(true,
+        return Unpooled.unmodifiableBuffer(
                 // {type_code}
                 
Unpooled.wrappedBuffer(serializer.getDataType().getDataTypeBuffer()),
                 // {type_info}{value_flag}{value}
@@ -117,10 +118,15 @@ public class GraphBinaryWriter {
         return Unpooled.wrappedBuffer(valueFlagNullBytes);
     }
 
+    private static ByteBuf valueFlagNone = 
Unpooled.wrappedBuffer(valueFlagNoneBytes);
+
+    private static ByteBuf valueFlagNone2 = 
UnpooledByteBufAllocator.DEFAULT.directBuffer(1).writeBytes(valueFlagNoneBytes);
+
     /**
      * Gets a buffer containing a single byte with value 0, representing an 
unset value_flag.
      */
     public ByteBuf getValueFlagNone() {
         return Unpooled.wrappedBuffer(valueFlagNoneBytes);
+        //return valueFlagNone2.duplicate().retain();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/RequestMessageSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/RequestMessageSerializer.java
index 3277598..a98b11f 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/RequestMessageSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/RequestMessageSerializer.java
@@ -20,9 +20,11 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.UUID;
 
@@ -50,15 +52,19 @@ public class RequestMessageSerializer {
     }
 
     public ByteBuf writeValue(final RequestMessage value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        return allocator.compositeBuffer(5).addComponents(true,
-                // Version
-                allocator.buffer(1).writeByte(0x81),
-                // RequestId
-                context.writeValue(value.getRequestId(), allocator, false),
-                // Op
-                context.writeValue(value.getOp(), allocator, false),
-                // Processor
-                context.writeValue(value.getProcessor(), allocator, false),
+        final UUID id = value.getRequestId();
+
+        final byte[] opStringBytes = 
value.getOp().getBytes(StandardCharsets.UTF_8);
+        final byte[] processorStringBytes = 
value.getProcessor().getBytes(StandardCharsets.UTF_8);
+
+        return Unpooled.unmodifiableBuffer(
+                // Version, request id, op and processor
+                allocator.buffer(17 + 8 + opStringBytes.length + 
processorStringBytes.length)
+                    .writeByte(0x81)
+                    .writeLong(id.getMostSignificantBits())
+                    .writeLong(id.getLeastSignificantBits())
+                    .writeInt(opStringBytes.length).writeBytes(opStringBytes)
+                    
.writeInt(processorStringBytes.length).writeBytes(processorStringBytes),
                 // Args
                 context.writeValue(value.getArgs(), allocator, false));
     }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/ResponseMessageSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/ResponseMessageSerializer.java
index f93fe28..c203142 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/ResponseMessageSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/ResponseMessageSerializer.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseResult;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatus;
@@ -53,7 +54,7 @@ public class ResponseMessageSerializer {
         final ResponseResult result = value.getResult();
         final ResponseStatus status = value.getStatus();
 
-        return allocator.compositeBuffer(8).addComponents(true,
+        return Unpooled.unmodifiableBuffer(
                 // Version
                 allocator.buffer(1).writeByte(0x81),
                 // Nullable request id
@@ -67,6 +68,7 @@ public class ResponseMessageSerializer {
                 // Result meta
                 context.writeValue(result.getMeta(), allocator, false),
                 // Fully-qualified value
-                context.write(result.getData(), allocator));
+                context.write(result.getData(), allocator)
+        );
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BigDecimalSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BigDecimalSerializer.java
index 9d4a8bd..ad00a10 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BigDecimalSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BigDecimalSerializer.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
+import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -46,9 +46,8 @@ public class BigDecimalSerializer extends 
SimpleTypeSerializer<BigDecimal> {
 
     @Override
     protected ByteBuf writeValue(final BigDecimal value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
-        result.addComponent(true, context.writeValue(value.scale(), allocator, 
false));
-        result.addComponent(true, context.writeValue(value.unscaledValue(), 
allocator, false));
-        return result;
+        return Unpooled.unmodifiableBuffer(
+                context.writeValue(value.scale(), allocator, false),
+                context.writeValue(value.unscaledValue(), allocator, false));
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BindingSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BindingSerializer.java
index 3d9f61a..603e755 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BindingSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BindingSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -44,14 +43,14 @@ public class BindingSerializer extends 
SimpleTypeSerializer<Bytecode.Binding> {
 
     @Override
     protected ByteBuf writeValue(final Bytecode.Binding value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
+        final BufferBuilder result = buildBuffer(2);
         try {
-            result.addComponent(true, context.writeValue(value.variable(), 
allocator, false));
-            result.addComponent(true, context.write(value.value(), allocator));
+            result.add(context.writeValue(value.variable(), allocator, false));
+            result.add(context.write(value.value(), allocator));
         } catch (Exception ex) {
             result.release();
             throw ex;
         }
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BulkSetSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BulkSetSerializer.java
index 04f3d63..60ed090 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BulkSetSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/BulkSetSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -52,13 +51,13 @@ public class BulkSetSerializer extends 
SimpleTypeSerializer<BulkSet> {
     @Override
     protected ByteBuf writeValue(final BulkSet value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
         final Map<Object,Long> raw = value.asBulk();
-        final CompositeByteBuf result = allocator.compositeBuffer(1 + 
raw.size() * 2);
-        result.addComponent(true, allocator.buffer(4).writeInt(raw.size()));
+        final BufferBuilder result = buildBuffer(1 + raw.size() * 2);
+        result.add(allocator.buffer(4).writeInt(raw.size()));
 
         try {
             for (Object key : raw.keySet()) {
-                result.addComponents(true, context.write(key, allocator),
-                        allocator.buffer(8).writeLong(value.get(key)));
+                result.add(context.write(key, allocator));
+                result.add(allocator.buffer(8).writeLong(value.get(key)));
             }
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
@@ -66,6 +65,6 @@ public class BulkSetSerializer extends 
SimpleTypeSerializer<BulkSet> {
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ByteCodeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ByteCodeSerializer.java
index 3b39eb9..3cd0dcf 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ByteCodeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ByteCodeSerializer.java
@@ -20,16 +20,18 @@ package 
org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryWriter;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 public class ByteCodeSerializer extends SimpleTypeSerializer<Bytecode> {
+    private static final Object[] EMPTY_ARGS = new Object[0];
+
     public ByteCodeSerializer() {
         super(DataType.BYTECODE);
     }
@@ -40,19 +42,30 @@ public class ByteCodeSerializer extends 
SimpleTypeSerializer<Bytecode> {
 
         final int stepsLength = buffer.readInt();
         for (int i = 0; i < stepsLength; i++) {
-            result.addStep(context.readValue(buffer, String.class, false), 
getInstructionArguments(buffer, context));
+            result.addStep(readString(buffer), getInstructionArguments(buffer, 
context));
         }
 
         final int sourcesLength = buffer.readInt();
         for (int i = 0; i < sourcesLength; i++) {
-            result.addSource(context.readValue(buffer, String.class, false), 
getInstructionArguments(buffer, context));
+            result.addSource(readString(buffer), 
getInstructionArguments(buffer, context));
         }
 
         return result;
     }
 
+    private static String readString(final ByteBuf buffer) {
+        final byte[] bytes = new byte[buffer.readInt()];
+        buffer.readBytes(bytes);
+        return new String(bytes, StandardCharsets.UTF_8);
+    }
+
     private static Object[] getInstructionArguments(final ByteBuf buffer, 
final GraphBinaryReader context) throws SerializationException {
         final int valuesLength = buffer.readInt();
+
+        if (valuesLength == 0) {
+            return EMPTY_ARGS;
+        }
+
         final Object[] values = new Object[valuesLength];
         for (int j = 0; j < valuesLength; j++) {
             values[j] = context.read(buffer);
@@ -65,7 +78,7 @@ public class ByteCodeSerializer extends 
SimpleTypeSerializer<Bytecode> {
         final List<Bytecode.Instruction> steps = value.getStepInstructions();
         final List<Bytecode.Instruction> sources = 
value.getSourceInstructions();
         // 2 buffers for the length + plus 2 buffers per each step and source
-        final CompositeByteBuf result = allocator.compositeBuffer(2 + 
steps.size() * 2 + sources.size() * 2);
+        final BufferBuilder result = buildBuffer(2 + steps.size() * 2 + 
sources.size() * 2);
 
         try {
             writeInstructions(allocator, context, steps, result);
@@ -76,33 +89,38 @@ public class ByteCodeSerializer extends 
SimpleTypeSerializer<Bytecode> {
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 
     private void writeInstructions(final ByteBufAllocator allocator, final 
GraphBinaryWriter context,
-                                   final List<Bytecode.Instruction> 
instructions, final CompositeByteBuf result) throws SerializationException {
+                                   final List<Bytecode.Instruction> 
instructions, final BufferBuilder result) throws SerializationException {
 
-        result.addComponent(true, context.writeValue(instructions.size(), 
allocator, false));
+        result.add(context.writeValue(instructions.size(), allocator, false));
 
         for (Bytecode.Instruction instruction : instructions) {
-            result.addComponent(true, 
context.writeValue(instruction.getOperator(), allocator, false));
-            result.addComponent(true, 
getArgumentsBuffer(instruction.getArguments(), allocator, context));
+            result.add(context.writeValue(instruction.getOperator(), 
allocator, false));
+            result.add(getArgumentsBuffer(instruction.getArguments(), 
allocator, context));
         }
     }
 
-    private static ByteBuf getArgumentsBuffer(final Object[] arguments, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(1 + 
arguments.length);
-        result.addComponent(true, context.writeValue(arguments.length, 
allocator, false));
+    private ByteBuf getArgumentsBuffer(final Object[] arguments, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
+
+        if (arguments.length == 0) {
+            return context.writeValue(0, allocator, false);
+        }
+
+        final BufferBuilder builder = buildBuffer(1 + arguments.length);
+        builder.add(context.writeValue(arguments.length, allocator, false));
 
         try {
             for (Object value : arguments) {
-                result.addComponent(true, context.write(value, allocator));
+                builder.add(context.write(value, allocator));
             }
         } catch (Exception ex) {
-            result.release();
+            builder.release();
             throw ex;
         }
 
-        return result;
+        return builder.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CollectionSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CollectionSerializer.java
index 858483f..d159f28 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CollectionSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CollectionSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -48,12 +47,12 @@ class CollectionSerializer extends 
SimpleTypeSerializer<Collection> {
 
     @Override
     protected ByteBuf writeValue(final Collection value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(1 + 
value.size());
-        result.addComponent(true, allocator.buffer(4).writeInt(value.size()));
+        final BufferBuilder result = buildBuffer(1 + value.size());
+        result.add(allocator.buffer(4).writeInt(value.size()));
 
         try {
             for (Object item : value) {
-                result.addComponent(true, context.write(item, allocator));
+                result.add(context.write(item, allocator));
             }
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
@@ -61,6 +60,6 @@ class CollectionSerializer extends 
SimpleTypeSerializer<Collection> {
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/EdgeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/EdgeSerializer.java
index 3c9f950..32422bf 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/EdgeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/EdgeSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -60,29 +59,29 @@ public class EdgeSerializer extends 
SimpleTypeSerializer<Edge> {
 
     @Override
     protected ByteBuf writeValue(final Edge value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(8);
+        final BufferBuilder result = buildBuffer(8);
 
         try {
-            result.addComponent(true, context.write(value.id(), allocator));
-            result.addComponent(true, context.writeValue(value.label(), 
allocator, false));
+            result.add(context.write(value.id(), allocator));
+            result.add(context.writeValue(value.label(), allocator, false));
 
-            result.addComponent(true, context.write(value.inVertex().id(), 
allocator));
-            result.addComponent(true, 
context.writeValue(value.inVertex().label(), allocator, false));
-            result.addComponent(true, context.write(value.outVertex().id(), 
allocator));
-            result.addComponent(true, 
context.writeValue(value.outVertex().label(), allocator, false));
+            result.add(context.write(value.inVertex().id(), allocator));
+            result.add(context.writeValue(value.inVertex().label(), allocator, 
false));
+            result.add(context.write(value.outVertex().id(), allocator));
+            result.add(context.writeValue(value.outVertex().label(), 
allocator, false));
 
             // we don't serialize the parent Vertex for edges. they are 
"references", but we leave a place holder
             // here as an option for the future as we've waffled this 
soooooooooo many times now
-            result.addComponent(true, context.write(null, allocator));
+            result.add(context.write(null, allocator));
             // we don't serialize properties for graph vertices/edges. they 
are "references", but we leave a place holder
             // here as an option for the future as we've waffled this 
soooooooooo many times now
-            result.addComponent(true, context.write(null, allocator));
+            result.add(context.write(null, allocator));
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
             result.release();
             throw ex;
         }
         
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/GraphSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/GraphSerializer.java
index 0f228c1..c36a873 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/GraphSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/GraphSerializer.java
@@ -115,19 +115,19 @@ public class GraphSerializer extends 
SimpleTypeSerializer<Graph> {
         // graph instance that should live in memory already - not expecting 
"big" stuff here.
         final List<Vertex> vertexList = IteratorUtils.list(value.vertices());
         final List<Edge> edgeList = IteratorUtils.list(value.edges());
-        final CompositeByteBuf result = allocator.compositeBuffer(2 + 
edgeList.size() + vertexList.size());
+        final BufferBuilder result = buildBuffer(2 + edgeList.size() + 
vertexList.size());
 
         try {
-            result.addComponent(true, context.writeValue(vertexList.size(), 
allocator, false));
+            result.add(context.writeValue(vertexList.size(), allocator, 
false));
 
             for (Vertex v : vertexList) {
-                result.addComponent(true, writeVertex(allocator, context, v));
+                result.add(writeVertex(allocator, context, v));
             }
 
-            result.addComponent(true, context.writeValue(edgeList.size(), 
allocator, false));
+            result.add(context.writeValue(edgeList.size(), allocator, false));
 
             for (Edge e : edgeList) {
-                result.addComponent(true, writeEdge(allocator, context, e));
+                result.add(writeEdge(allocator, context, e));
             }
 
         } catch (Exception ex) {
@@ -135,65 +135,65 @@ public class GraphSerializer extends 
SimpleTypeSerializer<Graph> {
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 
     private ByteBuf writeVertex(ByteBufAllocator allocator, GraphBinaryWriter 
context, Vertex vertex) throws SerializationException {
         final List<VertexProperty<Object>> vertexProperties = 
IteratorUtils.list(vertex.properties());
-        final CompositeByteBuf vbb = allocator.compositeBuffer(3 + 
vertexProperties.size() * 5);
+        final BufferBuilder vbb = buildBuffer(3 + vertexProperties.size() * 5);
 
         try {
-            vbb.addComponent(true, context.write(vertex.id(), allocator));
-            vbb.addComponent(true, context.writeValue(vertex.label(), 
allocator, false));
+            vbb.add(context.write(vertex.id(), allocator));
+            vbb.add(context.writeValue(vertex.label(), allocator, false));
 
-            vbb.addComponent(true, context.writeValue(vertexProperties.size(), 
allocator, false));
+            vbb.add(context.writeValue(vertexProperties.size(), allocator, 
false));
             for (VertexProperty<Object> vp : vertexProperties) {
-                vbb.addComponent(true, context.write(vp.id(), allocator));
-                vbb.addComponent(true, context.writeValue(vp.label(), 
allocator, false));
-                vbb.addComponent(true, context.write(vp.value(), allocator));
+                vbb.add(context.write(vp.id(), allocator));
+                vbb.add(context.writeValue(vp.label(), allocator, false));
+                vbb.add(context.write(vp.value(), allocator));
 
                 // maintain the VertexProperty format we have with this empty 
parent.........
-                vbb.addComponent(true, context.write(null, allocator));
+                vbb.add(context.write(null, allocator));
 
                 // write those properties out using the standard Property 
serializer
-                vbb.addComponent(true, 
context.writeValue(IteratorUtils.list(vp.properties()), allocator, false));
+                
vbb.add(context.writeValue(IteratorUtils.list(vp.properties()), allocator, 
false));
             }
         } catch (Exception ex) {
             vbb.release();
             throw ex;
         }
 
-        return vbb;
+        return vbb.create();
     }
 
     private ByteBuf writeEdge(ByteBufAllocator allocator, GraphBinaryWriter 
context, Edge edge) throws SerializationException {
-        final CompositeByteBuf ebb = allocator.compositeBuffer(8);
+        final BufferBuilder ebb = buildBuffer(8);
 
         try {
-            ebb.addComponent(true, context.write(edge.id(), allocator));
-            ebb.addComponent(true, context.writeValue(edge.label(), allocator, 
false));
+            ebb.add(context.write(edge.id(), allocator));
+            ebb.add(context.writeValue(edge.label(), allocator, false));
 
-            ebb.addComponent(true, context.write(edge.inVertex().id(), 
allocator));
+            ebb.add(context.write(edge.inVertex().id(), allocator));
 
             // vertex labels aren't needed but maintaining the Edge form that 
we have
-            ebb.addComponent(true, context.write(null, allocator));
+            ebb.add(context.write(null, allocator));
 
-            ebb.addComponent(true, context.write(edge.outVertex().id(), 
allocator));
+            ebb.add(context.write(edge.outVertex().id(), allocator));
 
             // vertex labels aren't needed but maintaining the Edge form that 
we have
-            ebb.addComponent(true, context.write(null, allocator));
+            ebb.add(context.write(null, allocator));
 
             // maintain the Edge format we have with this empty 
parent..................
-            ebb.addComponent(true, context.write(null, allocator));
+            ebb.add(context.write(null, allocator));
 
             // write those properties out using the standard Property 
serializer
-            ebb.addComponent(true, 
context.writeValue(IteratorUtils.list(edge.properties()), allocator, false));
+            ebb.add(context.writeValue(IteratorUtils.list(edge.properties()), 
allocator, false));
         } catch (Exception ex) {
             ebb.release();
             throw ex;
         }
 
-        return ebb;
+        return ebb.create();
     }
 
     private static Map<String, List<VertexProperty>> 
indexedVertexProperties(final Vertex v) {
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LambdaSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LambdaSerializer.java
index 545d018..6b57fb8 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LambdaSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LambdaSerializer.java
@@ -53,18 +53,18 @@ public class LambdaSerializer extends 
SimpleTypeSerializer<Lambda> {
 
     @Override
     protected ByteBuf writeValue(final Lambda value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(3);
+        final BufferBuilder result = buildBuffer(3);
 
         try {
-            result.addComponent(true, 
context.writeValue(value.getLambdaLanguage(), allocator, false));
-            result.addComponent(true, 
context.writeValue(value.getLambdaScript(), allocator, false));
-            result.addComponent(true, 
context.writeValue(value.getLambdaArguments(), allocator, false));
+            result.add(context.writeValue(value.getLambdaLanguage(), 
allocator, false));
+            result.add(context.writeValue(value.getLambdaScript(), allocator, 
false));
+            result.add(context.writeValue(value.getLambdaArguments(), 
allocator, false));
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LocalDateTimeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LocalDateTimeSerializer.java
index 0fcc1d5..bc810ab 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LocalDateTimeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/LocalDateTimeSerializer.java
@@ -46,9 +46,9 @@ public class LocalDateTimeSerializer extends 
SimpleTypeSerializer<LocalDateTime>
 
     @Override
     protected ByteBuf writeValue(final LocalDateTime value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
-        result.addComponent(true, context.writeValue(value.toLocalDate(), 
allocator, false));
-        result.addComponent(true, context.writeValue(value.toLocalTime(), 
allocator, false));
-        return result;
+        final BufferBuilder result = buildBuffer(2);
+        result.add(context.writeValue(value.toLocalDate(), allocator, false));
+        result.add(context.writeValue(value.toLocalTime(), allocator, false));
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapSerializer.java
index ad76a74..9244c2a 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapSerializer.java
@@ -48,13 +48,13 @@ public class MapSerializer extends 
SimpleTypeSerializer<Map> {
 
     @Override
     protected ByteBuf writeValue(final Map value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(1 + 
value.size() * 2);
-        result.addComponent(true, allocator.buffer(4).writeInt(value.size()));
+        final BufferBuilder result = buildBuffer(1 + value.size() * 2);
+        result.add(allocator.buffer(4).writeInt(value.size()));
 
         try {
             for (Object key : value.keySet()) {
-                result.addComponent(true, context.write(key, allocator));
-                result.addComponent(true, context.write(value.get(key), 
allocator));
+                result.add(context.write(key, allocator));
+                result.add(context.write(value.get(key), allocator));
             }
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
@@ -62,6 +62,6 @@ public class MapSerializer extends SimpleTypeSerializer<Map> {
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MetricsSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MetricsSerializer.java
index 4ce12a0..de738ce 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MetricsSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MetricsSerializer.java
@@ -57,23 +57,23 @@ public class MetricsSerializer extends 
SimpleTypeSerializer<Metrics> {
 
     @Override
     protected ByteBuf writeValue(final Metrics value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(6);
+        final BufferBuilder result = buildBuffer(6);
 
         try {
-            result.addComponent(true, context.writeValue(value.getId(), 
allocator, false));
-            result.addComponent(true, context.writeValue(value.getName(), 
allocator, false));
-            result.addComponent(true, 
context.writeValue(value.getDuration(TimeUnit.NANOSECONDS), allocator, false));
-            result.addComponent(true, context.writeValue(value.getCounts(), 
allocator, false));
-            result.addComponent(true, 
context.writeValue(value.getAnnotations(), allocator, false));
+            result.add(context.writeValue(value.getId(), allocator, false));
+            result.add(context.writeValue(value.getName(), allocator, false));
+            
result.add(context.writeValue(value.getDuration(TimeUnit.NANOSECONDS), 
allocator, false));
+            result.add(context.writeValue(value.getCounts(), allocator, 
false));
+            result.add(context.writeValue(value.getAnnotations(), allocator, 
false));
 
             // Avoid changing type to List
-            result.addComponent(true, 
collectionSerializer.writeValue(value.getNested(), allocator, context));
+            result.add(collectionSerializer.writeValue(value.getNested(), 
allocator, context));
         } catch (Exception ex) {
             // We should release the CompositeByteBuf as it's not going to be 
yielded for a reader
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetDateTimeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetDateTimeSerializer.java
index 29ad1f9..1ed9443 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetDateTimeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetDateTimeSerializer.java
@@ -47,9 +47,9 @@ public class OffsetDateTimeSerializer extends 
SimpleTypeSerializer<OffsetDateTim
 
     @Override
     protected ByteBuf writeValue(final OffsetDateTime value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
-        result.addComponent(true, context.writeValue(value.toLocalDateTime(), 
allocator, false));
-        result.addComponent(true, context.writeValue(value.getOffset(), 
allocator, false));
-        return result;
+        final BufferBuilder result = buildBuffer(2);
+        result.add(context.writeValue(value.toLocalDateTime(), allocator, 
false));
+        result.add(context.writeValue(value.getOffset(), allocator, false));
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetTimeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetTimeSerializer.java
index 106dd9a..dc811c9 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetTimeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/OffsetTimeSerializer.java
@@ -47,9 +47,9 @@ public class OffsetTimeSerializer extends 
SimpleTypeSerializer<OffsetTime> {
 
     @Override
     protected ByteBuf writeValue(final OffsetTime value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
-        result.addComponent(true, context.writeValue(value.toLocalTime(), 
allocator, false));
-        result.addComponent(true, context.writeValue(value.getOffset(), 
allocator, false));
-        return result;
+        final BufferBuilder result = buildBuffer(2);
+        result.add(context.writeValue(value.toLocalTime(), allocator, false));
+        result.add(context.writeValue(value.getOffset(), allocator, false));
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PSerializer.java
index a1fec9a..7b390a0 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -121,15 +120,15 @@ public class PSerializer<T extends P> extends 
SimpleTypeSerializer<T> {
 
         final List<Object> argsAsList = args instanceof Collection ? new 
ArrayList<>((Collection) args) : Collections.singletonList(args);
         final int length = argsAsList.size();
-        final CompositeByteBuf result = allocator.compositeBuffer(2 + length);
+        final BufferBuilder result = buildBuffer(2 + length);
 
-        result.addComponent(true, context.writeValue(predicateName, allocator, 
false));
-        result.addComponent(true, context.writeValue(length, allocator, 
false));
+        result.add(context.writeValue(predicateName, allocator, false));
+        result.add(context.writeValue(length, allocator, false));
 
         for (Object o : argsAsList) {
-            result.addComponent(true, context.write(o, allocator));
+            result.add(context.write(o, allocator));
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PathSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PathSerializer.java
index 344d9ca..1ca39cc 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PathSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PathSerializer.java
@@ -60,16 +60,16 @@ public class PathSerializer extends 
SimpleTypeSerializer<Path> {
 
     @Override
     protected ByteBuf writeValue(final Path value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
+        final BufferBuilder result = buildBuffer(2);
 
         try {
-            result.addComponent(true, context.write(value.labels(), 
allocator));
-            result.addComponent(true, context.write(value.objects(), 
allocator));
+            result.add(context.write(value.labels(), allocator));
+            result.add(context.write(value.objects(), allocator));
         } catch (Exception ex) {
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PropertySerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PropertySerializer.java
index e4dde14..c013ddf 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PropertySerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/PropertySerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -48,13 +47,13 @@ public class PropertySerializer extends 
SimpleTypeSerializer<Property> {
 
     @Override
     protected ByteBuf writeValue(final Property value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(3);
-        result.addComponent(true, context.writeValue(value.key(), allocator, 
false));
-        result.addComponent(true, context.write(value.value(), allocator));
+        final BufferBuilder result = buildBuffer(3);
+        result.add(context.writeValue(value.key(), allocator, false));
+        result.add(context.write(value.value(), allocator));
 
         // leave space for the parent reference element as it's not serialized 
for references
-        result.addComponent(true, context.write(null, allocator));
+        result.add(context.write(null, allocator));
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/SimpleTypeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/SimpleTypeSerializer.java
index 5d85ad8..507d439 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/SimpleTypeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/SimpleTypeSerializer.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -89,7 +90,38 @@ public abstract class SimpleTypeSerializer<T> implements 
TypeSerializer<T> {
             return valueSequence;
         }
 
-        return allocator.compositeBuffer(2).addComponents(true, 
context.getValueFlagNone(), valueSequence);
+        return Unpooled.unmodifiableBuffer(context.getValueFlagNone(), 
valueSequence);
+    }
+
+    protected BufferBuilder buildBuffer(int components) {
+        return new BufferBuilder(components);
+    }
+
+    protected static class BufferBuilder {
+        private final ByteBuf[] array;
+        private int index;
+
+        private BufferBuilder(int components) {
+            array = new ByteBuf[components];
+        }
+
+        public BufferBuilder add(ByteBuf buffer) {
+            array[index++] = buffer;
+            return this;
+        }
+
+        public ByteBuf create() {
+            return Unpooled.unmodifiableBuffer(array);
+        }
+
+        /**
+         * Releases the buffers added to the builder
+         */
+        public void release() {
+            for (int i = 0; i < index; i++) {
+                array[i].release();
+            }
+        }
     }
 
     /**
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
index 90650ef..fe9ca88 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -49,17 +48,17 @@ public class TraversalMetricsSerializer extends 
SimpleTypeSerializer<TraversalMe
 
     @Override
     protected ByteBuf writeValue(TraversalMetrics value, ByteBufAllocator 
allocator, GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
+        final BufferBuilder result = buildBuffer(2);
 
         try {
-            result.addComponent(true, 
context.writeValue(value.getDuration(TimeUnit.NANOSECONDS), allocator, false));
-            result.addComponent(true, 
collectionSerializer.writeValue(value.getMetrics(), allocator, context));
+            
result.add(context.writeValue(value.getDuration(TimeUnit.NANOSECONDS), 
allocator, false));
+            result.add(collectionSerializer.writeValue(value.getMetrics(), 
allocator, context));
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalStrategySerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalStrategySerializer.java
index 0b63907..f31de4e 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalStrategySerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalStrategySerializer.java
@@ -20,8 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
-import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationConverter;
 import org.apache.commons.configuration.MapConfiguration;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
@@ -54,17 +52,17 @@ public class TraversalStrategySerializer extends 
SimpleTypeSerializer<TraversalS
 
     @Override
     protected ByteBuf writeValue(final TraversalStrategy value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
+        final BufferBuilder result = buildBuffer(2);
 
         try {
-            result.addComponent(true, context.writeValue(value.getClass(), 
allocator, false));
-            result.addComponent(true, 
context.writeValue(translateToBytecode(ConfigurationConverter.getMap(value.getConfiguration())),
 allocator, false));
+            result.add(context.writeValue(value.getClass(), allocator, false));
+            
result.add(context.writeValue(translateToBytecode(ConfigurationConverter.getMap(value.getConfiguration())),
 allocator, false));
         } catch (Exception ex) {
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 
     private static Map<Object,Object> translateToBytecode(final 
Map<Object,Object> conf) {
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraverserSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraverserSerializer.java
index c9f4bd7..84571fe 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraverserSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraverserSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -46,16 +45,16 @@ public class TraverserSerializer extends 
SimpleTypeSerializer<Traverser> {
 
     @Override
     protected ByteBuf writeValue(final Traverser value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
+        final BufferBuilder result = buildBuffer(2);
 
         try {
-            result.addComponent(true, context.writeValue(value.bulk(), 
allocator, false));
-            result.addComponent(true, context.write(value.get(), allocator));
+            result.add(context.writeValue(value.bulk(), allocator, false));
+            result.add(context.write(value.get(), allocator));
         } catch (Exception ex) {
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TreeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TreeSerializer.java
index bc7fa73..c581830 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TreeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TreeSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -46,15 +45,13 @@ public class TreeSerializer extends 
SimpleTypeSerializer<Tree> {
 
     @Override
     protected ByteBuf writeValue(final Tree value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(1 + 
value.size() * 2);
-        result.addComponent(true, allocator.buffer(4).writeInt(value.size()));
+        final BufferBuilder result = buildBuffer(1 + value.size() * 2);
+        result.add(allocator.buffer(4).writeInt(value.size()));
 
         try {
             for (Object key : value.keySet()) {
-                result.addComponents(
-                        true,
-                        context.write(key, allocator),
-                        context.writeValue(value.get(key), allocator, false));
+                result.add(context.write(key, allocator));
+                result.add(context.writeValue(value.get(key), allocator, 
false));
             }
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
@@ -62,6 +59,6 @@ public class TreeSerializer extends 
SimpleTypeSerializer<Tree> {
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexPropertySerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexPropertySerializer.java
index b1d134c..b31094c 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexPropertySerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexPropertySerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -54,24 +53,24 @@ public class VertexPropertySerializer extends 
SimpleTypeSerializer<VertexPropert
 
     @Override
     protected ByteBuf writeValue(final VertexProperty value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(5);
+        final BufferBuilder result = buildBuffer(5);
 
         try {
-            result.addComponent(true, context.write(value.id(), allocator));
-            result.addComponent(true, context.writeValue(value.label(), 
allocator, false));
-            result.addComponent(true, context.write(value.value(), allocator));
+            result.add(context.write(value.id(), allocator));
+            result.add(context.writeValue(value.label(), allocator, false));
+            result.add(context.write(value.value(), allocator));
 
             // we don't serialize the parent vertex even as a "reference", 
but, let's hold a place for it
-            result.addComponent(true, context.write(null, allocator));
+            result.add(context.write(null, allocator));
             // we don't serialize properties for graph elements. they are 
"references", but we leave a place holder
             // here as an option for the future as we've waffled this 
soooooooooo many times now
-            result.addComponent(true, context.write(null, allocator));
+            result.add(context.write(null, allocator));
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
             result.release();
             throw ex;
         }
 
-        return result;
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexSerializer.java
index 5ed5e16..f9b0101 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/VertexSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -49,21 +48,21 @@ public class VertexSerializer extends 
SimpleTypeSerializer<Vertex> {
 
     @Override
     protected ByteBuf writeValue(final Vertex value, final ByteBufAllocator 
allocator, final GraphBinaryWriter context) throws SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(3);
+        final BufferBuilder result = buildBuffer(3);
 
         try {
-            result.addComponent(true, context.write(value.id(), allocator));
-            result.addComponent(true, context.writeValue(value.label(), 
allocator, false));
+            result.add(context.write(value.id(), allocator));
+            result.add(context.writeValue(value.label(), allocator, false));
 
             // we don't serialize properties for graph vertices/edges. they 
are "references", but we leave a place holder
             // here as an option for the future as we've waffled this 
soooooooooo many times now
-            result.addComponent(true, context.write(null, allocator));
+            result.add(context.write(null, allocator));
         } catch (Exception ex) {
             // We should release it as the ByteBuf is not going to be yielded 
for a reader
             result.release();
             throw ex;
         }
-        
-        return result;
+
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ZonedDateTimeSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ZonedDateTimeSerializer.java
index eba89f2..42a28b0 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ZonedDateTimeSerializer.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/ZonedDateTimeSerializer.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.CompositeByteBuf;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.DataType;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
@@ -47,9 +46,9 @@ public class ZonedDateTimeSerializer extends 
SimpleTypeSerializer<ZonedDateTime>
 
     @Override
     protected ByteBuf writeValue(final ZonedDateTime value, final 
ByteBufAllocator allocator, final GraphBinaryWriter context) throws 
SerializationException {
-        final CompositeByteBuf result = allocator.compositeBuffer(2);
-        result.addComponent(true, context.writeValue(value.toLocalDateTime(), 
allocator, false));
-        result.addComponent(true, context.writeValue(value.getOffset(), 
allocator, false));
-        return result;
+        final BufferBuilder result = buildBuffer(2);
+        result.add(context.writeValue(value.toLocalDateTime(), allocator, 
false));
+        result.add(context.writeValue(value.getOffset(), allocator, false));
+        return result.create();
     }
 }
diff --git 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryMessageSerializerV1Test.java
 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryMessageSerializerV1Test.java
index 7321d1e..393720e 100644
--- 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryMessageSerializerV1Test.java
+++ 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryMessageSerializerV1Test.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.UnpooledByteBufAllocator;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
@@ -37,7 +38,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 public class GraphBinaryMessageSerializerV1Test {
-    private final ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
+    private final UnpooledByteBufAllocator allocator = new 
UnpooledByteBufAllocator(false);
     private final GraphBinaryMessageSerializerV1 serializer = new 
GraphBinaryMessageSerializerV1();
 
     @Test
@@ -53,6 +54,10 @@ public class GraphBinaryMessageSerializerV1Test {
         buffer.readBytes(new byte[mimeLen]);
         final RequestMessage deserialized = 
serializer.deserializeRequest(buffer);
         assertThat(request, new ReflectionEquals(deserialized));
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
@@ -67,6 +72,10 @@ public class GraphBinaryMessageSerializerV1Test {
         buffer.readBytes(new byte[mimeLen]);
         final RequestMessage deserialized = 
serializer.deserializeRequest(buffer);
         assertThat(request, new ReflectionEquals(deserialized));
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
@@ -81,6 +90,10 @@ public class GraphBinaryMessageSerializerV1Test {
         buffer.readBytes(new byte[mimeLen]);
         final RequestMessage deserialized = 
serializer.deserializeRequest(buffer);
         assertThat(request, new ReflectionEquals(deserialized));
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
@@ -95,6 +108,10 @@ public class GraphBinaryMessageSerializerV1Test {
         final ByteBuf buffer = serializer.serializeResponseAsBinary(response, 
allocator);
         final ResponseMessage deserialized = 
serializer.deserializeResponse(buffer);
         assertResponseEquals(response, deserialized);
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
@@ -108,6 +125,10 @@ public class GraphBinaryMessageSerializerV1Test {
         final ByteBuf buffer = serializer.serializeResponseAsBinary(response, 
allocator);
         final ResponseMessage deserialized = 
serializer.deserializeResponse(buffer);
         assertResponseEquals(response, deserialized);
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
@@ -120,6 +141,10 @@ public class GraphBinaryMessageSerializerV1Test {
         final ByteBuf buffer = serializer.serializeResponseAsBinary(response, 
allocator);
         final ResponseMessage deserialized = 
serializer.deserializeResponse(buffer);
         assertResponseEquals(response, deserialized);
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
@@ -132,6 +157,10 @@ public class GraphBinaryMessageSerializerV1Test {
         final ByteBuf buffer = serializer.serializeResponseAsBinary(response, 
allocator);
         final ResponseMessage deserialized = 
serializer.deserializeResponse(buffer);
         assertResponseEquals(response, deserialized);
+
+        buffer.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     @Test
diff --git 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
index e3e6281..12dc9bc 100644
--- 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
+++ 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
@@ -20,6 +20,9 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.buffer.UnpooledByteBufAllocator;
+import io.netty.util.ResourceLeakDetector;
 import org.apache.tinkerpop.gremlin.process.computer.Computer;
 import 
org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
 import 
org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
@@ -158,7 +161,8 @@ public class GraphBinaryReaderWriterRoundTripTest {
 
         return Arrays.asList(
                 new Object[] {"String", "ABC", null},
-                new Object[] {"Char", '£', null},
+                new Object[] {"Char", '£', null}
+                ,
 
                 // numerics
                 new Object[] {"Byte", 1, null},
@@ -278,7 +282,8 @@ public class GraphBinaryReaderWriterRoundTripTest {
                 new Object[] {"Map", map, null},
                 new Object[] {"Map", nestedMap, null},
                 new Object[] {"Set", set, null},
-                new Object[] {"SetNested", nestedSet, null});
+                new Object[] {"SetNested", nestedSet, null}
+                );
     }
 
     @Parameterized.Parameter(value = 0)
@@ -292,6 +297,8 @@ public class GraphBinaryReaderWriterRoundTripTest {
 
     @Test
     public void shouldWriteAndRead() throws Exception {
+        final UnpooledByteBufAllocator allocator = new 
UnpooledByteBufAllocator(false);
+
         // Test it multiple times as the type registry might change its 
internal state
         for (int i = 0; i < 5; i++) {
             final ByteBuf buffer = writer.write(value, allocator);
@@ -299,6 +306,10 @@ public class GraphBinaryReaderWriterRoundTripTest {
             final Object result = reader.read(buffer);
 
             Optional.ofNullable(assertion).orElse((Consumer) r -> 
assertEquals(value, r)).accept(result);
+
+            buffer.release();
+            assertEquals(0, allocator.metric().usedHeapMemory());
+            assertEquals(0, allocator.metric().usedDirectMemory());
         }
     }
 }
diff --git 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CharSerializerTest.java
 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CharSerializerTest.java
index 839ab96..57f2c4d 100644
--- 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CharSerializerTest.java
+++ 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/CharSerializerTest.java
@@ -20,8 +20,10 @@ package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.PooledByteBufAllocator;
 import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
+import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryWriter;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -62,9 +64,33 @@ public class CharSerializerTest {
 
     @Test
     public void writeValueTest() throws SerializationException {
-        final ByteBuf actual= serializer.writeValue(charValue, allocator, 
null);
+        final PooledByteBufAllocator allocator = new PooledByteBufAllocator();
+
+        final ByteBuf actual = serializer.writeValue(charValue, allocator, 
null);
+        final byte[] actualBytes = new byte[byteArray.length];
+        actual.readBytes(actualBytes);
+        assertTrue(Arrays.deepEquals(new byte[][]{byteArray}, new 
byte[][]{actualBytes}));
+
+        actual.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
+    }
+
+    @Test
+    public void writeTest() throws SerializationException {
+        final PooledByteBufAllocator allocator = new PooledByteBufAllocator();
+
+        final ByteBuf actual = serializer.write(charValue, allocator, new 
GraphBinaryWriter());
         final byte[] actualBytes = new byte[byteArray.length];
+
+        // Null flag
+        assertEquals(0, actual.readByte());
+
         actual.readBytes(actualBytes);
         assertTrue(Arrays.deepEquals(new byte[][]{byteArray}, new 
byte[][]{actualBytes}));
+
+        actual.release();
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 }
diff --git 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/sample/SamplePersonSerializerTest.java
 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/sample/SamplePersonSerializerTest.java
index f72fbb2..c697084 100644
--- 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/sample/SamplePersonSerializerTest.java
+++ 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/sample/SamplePersonSerializerTest.java
@@ -20,6 +20,8 @@ package 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.sample;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.buffer.UnpooledByteBufAllocator;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
@@ -39,11 +41,12 @@ import java.util.UUID;
 
 import static 
org.apache.tinkerpop.gremlin.driver.ser.AbstractMessageSerializer.TOKEN_IO_REGISTRIES;
 import static 
org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1.TOKEN_CUSTOM;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 public class SamplePersonSerializerTest {
 
-    private static final ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
+    private final UnpooledByteBufAllocator allocator = new 
UnpooledByteBufAllocator(false);
 
     @Test
     public void shouldCustomSerializationWithPerson() throws 
SerializationException {
@@ -84,6 +87,11 @@ public class SamplePersonSerializerTest {
 
         final SamplePerson actual = (SamplePerson) 
deserialized.getResult().getData();
         assertThat(actual, new ReflectionEquals(person));
+
+        serialized.release();
+
+        assertEquals(0, allocator.metric().usedHeapMemory());
+        assertEquals(0, allocator.metric().usedDirectMemory());
     }
 
     public static class CustomIoRegistry extends AbstractIoRegistry {
diff --git 
a/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/GraphBinaryReaderWriterBenchmark.java
 
b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/GraphBinaryReaderWriterBenchmark.java
new file mode 100644
index 0000000..7b21375
--- /dev/null
+++ 
b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/GraphBinaryReaderWriterBenchmark.java
@@ -0,0 +1,4 @@
+package org.apache.tinkerpop.gremlin.driver;
+
+public class GraphBinaryReaderWriterBenchmark {
+}
diff --git 
a/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/GraphSONMapperBenchmark.java
 
b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/GraphSONMapperBenchmark.java
new file mode 100644
index 0000000..95200b1
--- /dev/null
+++ 
b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/GraphSONMapperBenchmark.java
@@ -0,0 +1,4 @@
+package org.apache.tinkerpop.gremlin.driver;
+
+public class GraphSONMapperBenchmark {
+}

Reply via email to