Graph KryoException:缓冲区太小

Graph KryoException:缓冲区太小,graph,titan,gremlin,tinkerpop,tinkerpop3,Graph,Titan,Gremlin,Tinkerpop,Tinkerpop3,我正在使用Gremlin3.0.2和Titan1.0.0 我向Gremlin服务器发送的请求将返回节点及其属性的列表。实际上,它是一个如下所示的项目列表: [coverurl:[https://lh3.googleusercontent.com/RYb-duneinq8ClWVLVKknkIx1jOKm64LjreziFApEnkKME8j9tHNDRi9NMA6PK4PTXO7], appname:[Slack], pkgid:[com.Slack]] 在一种情况下,一个请求将返回38个类似

我正在使用Gremlin3.0.2和Titan1.0.0

我向Gremlin服务器发送的请求将返回节点及其属性的列表。实际上,它是一个如下所示的项目列表:

[coverurl:[https://lh3.googleusercontent.com/RYb-duneinq8ClWVLVKknkIx1jOKm64LjreziFApEnkKME8j9tHNDRi9NMA6PK4PTXO7], appname:[Slack], pkgid:[com.Slack]]
在一种情况下,一个请求将返回38个类似于上面的项目,一切正常。在另一种情况下,列表将包含其中56项,我得到以下例外情况:

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)
这个问题去年已经讨论过了。但是,对于不同版本的Titan和向Titan写入数据,而不是像这里这样读取数据

我看不到任何编程方法来调整(反)序列化程序的缓冲区大小,那么处理这个问题的首选方法是什么?此外,将某个限制(which?、where?)设置为某个更高的值只能是一个临时解决方案,因为我永远不知道一个请求将返回多少数据

总之,我接收的数据量相当小(可能略多于8500字节)。我很惊讶这个异常竟然被抛出?

泰坦1.0基于。。。你是在自己建造泰坦吗

引入一个允许配置
bufferSize
参数的修复程序。正如Stephen在评论中提到的:

kryo缓冲区大小默认为4096,这些缓冲区会抛出该值吗 “缓冲区太小”异常

修补程序进入TinkerPop 3.0.2,并记录在案

为了使用它,您需要升级Titan服务器以运行TinkerPop 3.0.2,最好在修改Titan pom.xml中的后从源代码重新编译。找到泰坦的建造方向。另外,您可以考虑为最新可用的修复程序和TinkerPop 3.1.1(Hadoop 2支持!)构建分支。 接下来,您需要在配置中的相应序列化程序上配置
缓冲区大小
。我不认为您不能仅通过客户端配置来解决此问题

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

因为你有一个java客户机,你希望直接使用<代码>顶点< /Cord>对象,也许你可以考虑直接连接到泰坦,避免完全序列化。

所以,为了完整性,如何正确配置这个?在我的Kotlin代码(无缝转换为Java)中,我有val kryo=GryoMapper.build().addRegistry(titaniorRegistry.INSTANCE).create();val ser=gryorv1d0(kryo);val conf=HashMap();conf.put(令牌缓冲区大小,serializerBufferSize);序列配置(conf,null)其中
var-TOKEN\u BUFFER\u SIZE=“bufferSize”
var-serializerBufferSize=8192
。显然,这没有效果。