Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.14.0
Description
We had reports of this exception when using TLS for cluster communications. I wrote a test that set socket-lease-time to 1 second and then looped creating a thread to do a single 20mb put() and then waiting 2 seconds after the put() completed so that connections would time out.
I saw message-length growth without the fix for GEODE-8506 that went away with the fix for that ticket. If I let the test go on long enough the message-length grew to over 16mb and the test failed with this error:
java.lang.IllegalStateException: tcp message exceeded max size of 16777215 [vm2] at org.apache.geode.internal.tcp.Connection.calcHdrSize(Connection.java:610) [vm2] at org.apache.geode.internal.tcp.MsgStreamer.setMessageHeader(MsgStreamer.java:454) [vm2] at org.apache.geode.internal.tcp.MsgStreamer.realFlush(MsgStreamer.java:311) [vm2] at org.apache.geode.internal.tcp.MsgStreamer.write(MsgStreamer.java:378) [vm2] at org.apache.geode.DataSerializer.writeByteArray(DataSerializer.java:1258) [vm2] at org.apache.geode.DataSerializer.writeByteArray(DataSerializer.java:1226) [vm2] at org.apache.geode.internal.cache.DistributedCacheOperation.writeValue(DistributedCacheOperation.java:134) [vm2] at org.apache.geode.internal.cache.UpdateOperation$UpdateMessage.toData(UpdateOperation.java:413) [vm2] at org.apache.geode.internal.InternalDataSerializer.invokeToData(InternalDataSerializer.java:2300) [vm2] ... 53 more
While the fix for GEODE-8506 made it unlikely that we'll run into this again I think we should bullet-proof the MsgStreamer class to never try to send message chunks larger than Connection.MAX_MSG_SIZE.
Note that we can still send cache operation messages larger than 16mb because MsgStreamer will break them into smaller chunks.