You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/04/20 16:17:39 UTC
[02/23] incubator-tinkerpop git commit: Reduce the gryo serialization
size of ResponseMessage for Gremlin Server.
Reduce the gryo serialization size of ResponseMessage for Gremlin Server.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/7bd47a85
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/7bd47a85
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/7bd47a85
Branch: refs/heads/io-docs
Commit: 7bd47a85e615cd6ef91b968974c44a5a7c54b1fd
Parents: 0aea495
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 16 16:38:03 2015 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Apr 16 16:38:03 2015 -0400
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../driver/ser/GryoMessageSerializerV1d0.java | 50 ++++++++++----------
2 files changed, 27 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7bd47a85/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index db78b78..54cf4e8 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
TinkerPop 3.0.0.M9 (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Decreased size of Gremlin Server `RequestMessage` and `ResponseMessage` serialization payloads and reduced object creation.
* `Graph.empty()` no longer required with the introduction of `ShellGraph` which is a placeholder for a graph class and computer.
* `VertexProperty.Cardinality` default is now vendor chosen. If the vendor has not preference, they should use `Cardinality.single`.
* `Messenger.receiveMessages()` no longer takes a `MessageScope` and thus, consistent behavior between message-passing and message-pulling systems.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7bd47a85/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1d0.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1d0.java
index 71cca0f..7fba9a1 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1d0.java
@@ -178,15 +178,19 @@ public class GryoMessageSerializerV1d0 implements MessageSerializer {
final byte[] payload = new byte[msg.readableBytes()];
msg.readBytes(payload);
try (final Input input = new Input(payload)) {
- final Map<String, Object> responseData = (Map<String, Object>) kryo.readClassAndObject(input);
- final Map<String, Object> status = (Map<String, Object>) responseData.get(SerTokens.TOKEN_STATUS);
- final Map<String, Object> result = (Map<String, Object>) responseData.get(SerTokens.TOKEN_RESULT);
- return ResponseMessage.build(UUID.fromString(responseData.get(SerTokens.TOKEN_REQUEST).toString()))
- .code(ResponseStatusCode.getFromValue((Integer) status.get(SerTokens.TOKEN_CODE)))
- .statusMessage(Optional.ofNullable((String) status.get(SerTokens.TOKEN_MESSAGE)).orElse(""))
- .statusAttributes((Map<String, Object>) status.get(SerTokens.TOKEN_ATTRIBUTES))
- .result(result.get(SerTokens.TOKEN_DATA))
- .responseMetaData((Map<String, Object>) result.get(SerTokens.TOKEN_META))
+ final UUID requestId = kryo.readObjectOrNull(input, UUID.class);
+ final int status = input.readShort();
+ final String statusMsg = input.readString();
+ final Map<String,Object> statusAttributes = (Map<String,Object>) kryo.readClassAndObject(input);
+ final Object result = kryo.readClassAndObject(input);
+ final Map<String,Object> metaAttributes = (Map<String,Object>) kryo.readClassAndObject(input);
+
+ return ResponseMessage.build(requestId)
+ .code(ResponseStatusCode.getFromValue(status))
+ .statusMessage(statusMsg)
+ .statusAttributes(statusAttributes)
+ .result(result)
+ .responseMetaData(metaAttributes)
.create();
}
} catch (Exception ex) {
@@ -199,30 +203,28 @@ public class GryoMessageSerializerV1d0 implements MessageSerializer {
public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
ByteBuf encodedMessage = null;
try {
- final Map<String, Object> result = new HashMap<>();
- result.put(SerTokens.TOKEN_DATA, serializeToString ? serializeResultToString(responseMessage) : responseMessage.getResult().getData());
- result.put(SerTokens.TOKEN_META, responseMessage.getResult().getMeta());
-
- final Map<String, Object> status = new HashMap<>();
- status.put(SerTokens.TOKEN_MESSAGE, responseMessage.getStatus().getMessage());
- status.put(SerTokens.TOKEN_CODE, responseMessage.getStatus().getCode().getValue());
- status.put(SerTokens.TOKEN_ATTRIBUTES, responseMessage.getStatus().getAttributes());
-
- final Map<String, Object> message = new HashMap<>();
- message.put(SerTokens.TOKEN_STATUS, status);
- message.put(SerTokens.TOKEN_RESULT, result);
- message.put(SerTokens.TOKEN_REQUEST, responseMessage.getRequestId() != null ? responseMessage.getRequestId() : null);
-
final Kryo kryo = kryoThreadLocal.get();
try (final OutputStream baos = new ByteArrayOutputStream()) {
final Output output = new Output(baos);
- kryo.writeClassAndObject(output, message);
+
+ // request id - if present
+ kryo.writeObjectOrNull(output, responseMessage.getRequestId() != null ? responseMessage.getRequestId() : null, UUID.class);
+
+ // status
+ output.writeShort(responseMessage.getStatus().getCode().getValue());
+ output.writeString(responseMessage.getStatus().getMessage());
+ kryo.writeClassAndObject(output, responseMessage.getStatus().getAttributes());
+
+ // result
+ kryo.writeClassAndObject(output, serializeToString ? serializeResultToString(responseMessage) : responseMessage.getResult().getData());
+ kryo.writeClassAndObject(output, responseMessage.getResult().getMeta());
final long size = output.total();
if (size > Integer.MAX_VALUE)
throw new SerializationException(String.format("Message size of %s exceeds allocatable space", size));
encodedMessage = allocator.buffer((int) output.total());
+ System.out.println(size);
encodedMessage.writeBytes(output.toBytes());
}