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 { +}