Pivotal Knowledge Base

关注

Gemfire: Unexpected IOException: Part length and number of parts inconsistent

适用于

仅适用于GemFire 7

目的

本文的目的是识别一种您可能在日志中发现的特定异常,其与WAN中接受端和发送端的缓冲区(buffer)相关。需要注意的是,该异常显示了如下的信息:

Unexpected IOException: java.io.IOException: Part length ( -2,000,248,199 ) and number of parts ( 18,001 ) inconsistent 

描述

该问题在Gemfire8之后的版本已经被纠正。

如果batch和数据的尺寸都足够大,有可能我们将发送一条尺寸超过2GB的消息。而在接收端试图处理大于预期缓冲区的消息时,会产生不利的影响。具体的异常内容如下问题现象部分所示。

问题现象

[warning 2015/10/07 21:06:29.213 UTC gemfire-gfirep03-49002 tid=0xc3af9] Server connection from [identity(10.x.y.z(gemfire-gfirep08-49002:23053):51883,connection=13; port=18172]: Unexpected IOException: java.io.IOException: Part length ( -2,000,248,199 ) and number of parts ( 18,001 ) inconsistent at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readPayloadFields(Message.java:793) at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:742) at com.gemstone.gemfire.internal.cache.tier.sockets.Message.read(Message.java:587) at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1087) at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1101) at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.readRequest(BaseCommand.java:996) at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:770) at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:952) at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1206) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at com.gemstone.gemfire.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:532) at java.lang.Thread.run(Thread.java:744)

发送端对于将被发送的消息尺寸并没有任何记录,所以如果被放置到缓冲区的事件增长得过大,在缓冲最终被处理前您可能会超过2GB的限制。

从而在接受端的集群系统中,您可以通过如上异常确认该问题是否已经发生。

解决方案

为了在系统中避免该问题,简单的方法是将batch-size设定为一个安全的数值,确保预期中的在WAN中传输到其他分布式系统的预期事件大小不会超过2GB的阈值。

系统恢复

一旦遇到了该问题,如果不将相关节点关闭则很难恢复系统。我们建议与我们全球技术支持联系并确认该问题,之后可能必须将一些disk store文件撤销以恢复系统正常工作状态。而在执行这些步骤过程中,我们强烈推荐我方技术支持工程师的协助,因此请提交一个(Critical)关键级别的请求以促进该问题的解决。

评论

由 Zendesk 提供技术支持