There are many places where a user may see this exception. For instance,
1) On a client when receiving results from a function execution:
org.apache.geode.cache.execute.FunctionException: org.apache.geode.cache.execute.FunctionException: IOException while sending the last chunk to client
at ------
at org.apache.geode.internal.cache.execute.AbstractExecution.executeFunctionLocally(AbstractExecution.java:328)
at org.apache.geode.internal.cache.execute.AbstractExecution.executeFunctionOnLocalPRNode(AbstractExecution.java:263)
at org.apache.geode.internal.cache.PartitionedRegion.executeOnSingleNode(PartitionedRegion.java:3828)
at org.apache.geode.internal.cache.PartitionedRegion.executeFunction(PartitionedRegion.java:3533)
at org.apache.geode.internal.cache.execute.PartitionedRegionFunctionExecutor.executeFunction(PartitionedRegionFunctionExecutor.java:220)
at org.apache.geode.internal.cache.execute.AbstractExecution.execute(AbstractExecution.java:376)
at org.apache.geode.internal.cache.execute.AbstractExecution.execute(AbstractExecution.java:359)
at org.apache.geode.internal.cache.tier.sockets.command.ExecuteRegionFunctionSingleHop.cmdExecute(ExecuteRegionFunctionSingleHop.java:261)
at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:183)
at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMessage(ServerConnection.java:848)
at org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:72)
at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1212)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl.lambda$initializeServerConnectionThreadPool$3(AcceptorImpl.java:676)
at org.apache.geode.logging.internal.executors.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:119)
at java.lang.Thread.run(Thread.java:750)
Caused by: org.apache.geode.cache.execute.FunctionException: IOException while sending the last chunk to client
at org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender65.lastResult(ServerToClientFunctionResultSender65.java:164)
at org.apache.geode.internal.cache.execute.PartitionedRegionFunctionResultSender.lastClientSend(PartitionedRegionFunctionResultSender.java:377)
at org.apache.geode.internal.cache.execute.PartitionedRegionFunctionResultSender.lastResult(PartitionedRegionFunctionResultSender.java:157)
... 19 common frames omitted
Caused by: org.apache.geode.internal.cache.tier.sockets.MessageTooLargeException: Message size (1349791002) exceeds gemfire.client.max-message-size setting (1073741824)
at org.apache.geode.internal.cache.tier.sockets.Message.sendBytes(Message.java:605)
at org.apache.geode.internal.cache.tier.sockets.ChunkedMessage.sendChunk(ChunkedMessage.java:312)
at org.apache.geode.internal.cache.tier.sockets.ChunkedMessage.sendChunk(ChunkedMessage.java:322)
at org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender65.lastResult(ServerToClientFunctionResultSender65.java:158)
... 22 common frames omitted
2) On a cache server when returning results:
[error 2022/10/03 GMT <Function Execution Processor307> tid=0x90c73f] Error while executing function.
org.apache.geode.cache.execute.FunctionException: IOException while sending the last chunk to client
at org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender65.lastResult(ServerToClientFunctionResultSender65.java:164)
at org.apache.geode.internal.cache.execute.PartitionedRegionFunctionResultSender.lastClientSend(PartitionedRegionFunctionResultSender.java:377)
at org.apache.geode.internal.cache.execute.PartitionedRegionFunctionResultSender.lastResult(PartitionedRegionFunctionResultSender.java:157)
----
at org.apache.geode.internal.cache.execute.AbstractExecution.executeFunctionLocally(AbstractExecution.java:328)
at org.apache.geode.internal.cache.execute.AbstractExecution.lambda$executeFunctionOnLocalPRNode$0(AbstractExecution.java:273)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.geode.distributed.internal.ClusterOperationExecutors.runUntilShutdown(ClusterOperationExecutors.java:441)
at org.apache.geode.distributed.internal.ClusterOperationExecutors.doFunctionExecutionThread(ClusterOperationExecutors.java:376)
at org.apache.geode.logging.internal.executors.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:119)
at java.lang.Thread.run(Thread.java:750)
Caused by: org.apache.geode.internal.cache.tier.sockets.MessageTooLargeException: Message size (1160019252) exceeds gemfire.client.max-message-size setting (1073741824)
at org.apache.geode.internal.cache.tier.sockets.Message.sendBytes(Message.java:605)
at org.apache.geode.internal.cache.tier.sockets.ChunkedMessage.sendChunk(ChunkedMessage.java:312)
at org.apache.geode.internal.cache.tier.sockets.ChunkedMessage.sendChunk(ChunkedMessage.java:322)
at org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender65.lastResult(ServerToClientFunctionResultSender65.java:158)
... 13 more
3) Or, on a client doing a very large putAll:
org.apache.geode.GemFireIOException: unable to transmit message to server
at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:178)
at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:130)
at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:792)
at org.apache.geode.cache.client.internal.PutAllOp.execute(PutAllOp.java:100)
at org.apache.geode.cache.client.internal.ServerRegionProxy.putAll(ServerRegionProxy.java:607)
at org.apache.geode.internal.cache.LocalRegion.basicPutAll(LocalRegion.java:9361)
at org.apache.geode.internal.cache.LocalRegion.putAll(LocalRegion.java:9294)
at org.apache.geode.internal.cache.LocalRegion.putAll(LocalRegion.java:9306)
....
Caused by: org.apache.geode.internal.cache.tier.sockets.MessageTooLargeException: Message size (1645984840) exceeds gemfire.client.max-message-size setting (1073741824)
at org.apache.geode.internal.cache.tier.sockets.Message.sendBytes(Message.java:599)
at org.apache.geode.internal.cache.tier.sockets.Message.send(Message.java:1122)
at org.apache.geode.cache.client.internal.AbstractOp.sendMessage(AbstractOp.java:137)
at org.apache.geode.cache.client.internal.AbstractOp.attemptSend(AbstractOp.java:91)
at org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:380)
at org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:289)
at org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:338)
at org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:912)
at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:174)
... 20 more
There are really only two options to resolve this issue. The first, which is *not recommended* as it can seriously impact cluster performance and health, is to set the gemfire.client.max-message-size to something larger than its default of 1073741824 bytes.
The second is to rework client code to make the messages smaller. For instance, in the first two exception stacks above, the problem is a function trying to send too big a reply to the invoking client. This could be addresses with some code refactoring and/or better use of a ResultSender. In the third case above, the client is doing a very large putAll. This problem can only really be solved by limiting the numbers of entries in the putAll. Note, however, that similar putAll throughput should be achievable by using multiple threads with smaller the putAll batch sizes.