2016-05-25 19 views
1

Ich benutze Gremlin 3.0.2 zusammen mit Titan 1.0.0.KryoException: Puffer zu klein

Die Anforderung, die ich an den Gremlin Server sende, gibt eine Liste der Knoten und ihrer Eigenschaften zurück. Effektiv, es ist eine Liste der Elemente wie folgt aus:

[coverurl:[https://lh3.googleusercontent.com/RYb-duneinq8ClWVLVKknkIx1jOKm64LjreziFApEnkKME8j9tHNDRi9NMA6PK4PTXO7], appname:[Slack], pkgid:[com.Slack]] 

In einem Fall wurde ein Antrag 38 Artikel wie die zurück oben und alles ist in Ordnung. In einem anderen Fall würde die Liste 56 dieser Elemente enthält, und ich bekomme die folgende Ausnahme:

WARN org.apache.tinkerpop.gremlin.driver.MessageSerializer - Response [PooledUnsafeDirectByteBuf(ridx: 0, widx: 0, cap: 0)] could not be deserialized by org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0. 
ERROR org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler - Could not process the response 
io.netty.handler.codec.DecoderException: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: Buffer too small: capacity: 0, required: 1 
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) 
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308) 
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294) 

Dieses Problem here im vergangenen Jahr diskutiert wurde. Allerdings für verschiedene Versionen von Titan und zum Schreiben von Daten auf Titan, anstatt zu lesen, wie es hier der Fall ist.

Ich sehe keinen programmatischen Weg, um die Puffergröße des (De) Serialisierers anzupassen, also was ist der bevorzugte Weg, um mit diesem Problem umzugehen? Außerdem kann das Festlegen eines Limits (welches ?, wo?) Auf einen höheren Wert nur eine temporäre Lösung sein, da ich nie weiß, wie viele Daten eine Anfrage zurückgeben wird.

Anyways - Die Menge der Daten, die ich erhalte, ist ziemlich klein (wahrscheinlich etwas mehr als 8500 Bytes). Ich bin überrascht, dass diese Ausnahme überhaupt geworfen wird?

Antwort

2

Titan 1.0 basiert auf TinkerPop 3.0.1 ... bauen Sie Titan auf eigene Faust?

TINKERPOP-817 führt eine Korrektur ein, mit der ein bufferSize Parameter konfiguriert werden kann. Wie bereits erwähnt Stephen in den Kommentaren:

der Kryo-Puffergröße wurde 4096 Verzug geraten und würde diejenigen werfen, dass „Puffer zu klein“ Ausnahme

Das Update in TinkerPop ging 3.0.2 und dokumentiert here.

Um dies zu verwenden, müssen Sie Ihren Titan Server auf TinkerPop 3.0.2 aktualisieren, und es wäre am besten, wenn Sie die Quelle nach dem Ändern der tinkerpop.version in der Titan pom.xml erneut kompilieren. Finden Sie die Titan Bauanleitung here. Alternativ können Sie den Zweig für die neuesten verfügbaren Fixes und TinkerPop 3.1.1 erstellen (Hadoop 2-Unterstützung!).

Als nächstes müssen Sie die bufferSize auf dem entsprechenden Serializer in der gremlin-server.yaml Konfiguration konfigurieren. Ich glaube nicht, dass Sie dieses Problem nicht nur mit einer Client-Konfiguration beheben können.

serializers: 
    - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { bufferSize: 8192, useMapperFromGraph: graph }}  # application/vnd.gremlin-v1.0+gryo 

Da Sie einen Java-Client und Sie erwarten, direkt mit den Vertex Objekten arbeiten, vielleicht könnten Sie diese Serialisierung vollständig tun eine direkte Verbindung zu Titan betrachten und vermeiden.

+0

Also, zur Vollständigkeit, wie würde man das richtig konfigurieren? In meinem Kotlin Code (der nahtlos in Java übersetzt) ​​habe ich 'val kryo = GryoMapper.build(). AddRegistry (TitanIoRegistry.INSTANCE) .create(); valser = GryoMessageSerializerV1d0 (kryo); val conf = HashMap (); conf.put (TOKEN_BUFFER_SIZE, serializerBufferSize); ser.configure (conf, null) 'where' var TOKEN_BUFFER_SIZE = "pufferSize" 'und' var serializerBufferSize = 8192'. Offensichtlich hat dies keine Wirkung. –

+0

aktualisierte meine Antwort –