[ 
https://issues.apache.org/jira/browse/GEODE-8584?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17210348#comment-17210348
 ] 

Bruce J Schuchardt commented on GEODE-8584:
-------------------------------------------

Here is the crux of the problem:

{noformat}
[info 2020/10/07 15:54:20.931 PDT <vm_3_thr_11_client2_host1_10891> tid=0x9e] 
BRUCE: acquired direct buffer 1a7301b8 of size 65536. requested size 65536 
from: [info 2020/10/07 15:54:20.931 PDT <vm_3_thr_11_client2_host1_10891> 
tid=0x9e] BRUCE: acquired direct buffer 1a7301b8 of size 65536. requested size 
65536 from:  
org.apache.geode.internal.net.BufferPool.acquireDirectSenderBuffer(BufferPool.java:92)
 
org.apache.geode.internal.net.BufferPool.acquireDirectBuffer(BufferPool.java:286)
 
org.apache.geode.internal.net.BufferPool.expandWriteBufferIfNeeded(BufferPool.java:270)
 
org.apache.geode.internal.net.NioSslEngine.expandWriteBuffer(NioSslEngine.java:212)

[info 2020/10/07 15:54:27.077 PDT <AsyncSocketCloser for 
10.32.108.97(clientgemfire1_host1_10887:10887)<v1>:41002> tid=0x94] 
NioSSLEngine releasing two buffers myNetData=1a7301b8(direct), 
peerAppData=6fffd1b(direct)
[info 2020/10/07 15:54:27.077 PDT <AsyncSocketCloser for 
10.32.108.97(clientgemfire1_host1_10887:10887)<v1>:41002> tid=0x94] BRUCE: 
releasing direct buffer 1a7301b8


[info 2020/10/07 15:54:27.078 PDT <vm_3_thr_8_client2_host1_10891> tid=0xeb] 
Exception occurred while processing 
UpdateOperation(EntryEventImpl[op=UPDATE;region=/testRegion;key=85;callbackArg=null;originRemote=false;originMember=10.32.108.97(clientgemfire2_host1_10891:10891)<v1>:41001;callbacksInvoked;version={v42;
 rv571; mbr=414d94d5780a4d72-b562d4269a59a785; ds=1; 
time=1602111267048};id=EventID[id=44 bytes;threadID=37;sequenceID=10]])
org.apache.geode.ToDataException: toData failed on dsfid=71 msg:null
        at 
org.apache.geode.internal.InternalDataSerializer.writeDSFID(InternalDataSerializer.java:1509)
        at 
org.apache.geode.internal.tcp.MsgStreamer.writeMessage(MsgStreamer.java:249)
        at 
org.apache.geode.distributed.internal.direct.DirectChannel.sendToMany(DirectChannel.java:306)
{noformat}

The thread that's writing a serialized message to the socket is using the 
NioSslEngine's "myNetData" buffer.  Another thread is closing the connection 
and has invoked the NioFilter's close() method.  That method closes out the TLS 
session and modifies the "myNetData" buffer in the process.

> Message transmission fails with IllegalStateException in socket i/o code
> ------------------------------------------------------------------------
>
>                 Key: GEODE-8584
>                 URL: https://issues.apache.org/jira/browse/GEODE-8584
>             Project: Geode
>          Issue Type: Bug
>          Components: membership, messaging
>    Affects Versions: 1.12.0, 1.13.0, 1.14.0
>            Reporter: Bruce J Schuchardt
>            Priority: Major
>              Labels: pull-request-available
>
> Transmission of an update operation failed with a toData exception caused by 
> an IllegalStateException in socket i/o code.  It shouldn't be possible for 
> this exception to happen unless multiple threads are using the buffer at the 
> same time.
>  
> {noformat}
> org.apache.geode.ToDataException: toData failed on dsfid=71 msg:null
>       at 
> org.apache.geode.internal.InternalDataSerializer.writeDSFID(InternalDataSerializer.java:1509)
>       at 
> org.apache.geode.internal.tcp.MsgStreamer.writeMessage(MsgStreamer.java:249)
>       at 
> org.apache.geode.distributed.internal.direct.DirectChannel.sendToMany(DirectChannel.java:306)
>       at 
> org.apache.geode.distributed.internal.direct.DirectChannel.sendToOne(DirectChannel.java:182)
>       at 
> org.apache.geode.distributed.internal.direct.DirectChannel.send(DirectChannel.java:511)
>       at 
> org.apache.geode.distributed.internal.DistributionImpl.directChannelSend(DistributionImpl.java:346)
>       at 
> org.apache.geode.distributed.internal.DistributionImpl.send(DistributionImpl.java:291)
>       at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendViaMembershipManager(ClusterDistributionManager.java:2053)
>       at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendOutgoing(ClusterDistributionManager.java:1981)
>       at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendMessage(ClusterDistributionManager.java:2018)
>       at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.putOutgoing(ClusterDistributionManager.java:1083)
>       at 
> org.apache.geode.internal.cache.DistributedCacheOperation._distribute(DistributedCacheOperation.java:572)
>       at 
> org.apache.geode.internal.cache.DistributedCacheOperation.startOperation(DistributedCacheOperation.java:277)
>       at 
> org.apache.geode.internal.cache.DistributedCacheOperation.distribute(DistributedCacheOperation.java:318)
>       at 
> org.apache.geode.internal.cache.DistributedRegion.distributeUpdate(DistributedRegion.java:520)
>       at 
> org.apache.geode.internal.cache.DistributedRegion.basicPutPart3(DistributedRegion.java:498)
>       at 
> org.apache.geode.internal.cache.map.RegionMapPut.doAfterCompletionActions(RegionMapPut.java:307)
>       at 
> org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPut(AbstractRegionMapPut.java:185)
>       at 
> org.apache.geode.internal.cache.map.AbstractRegionMapPut.runWhileLockedForCacheModification(AbstractRegionMapPut.java:119)
>       at 
> org.apache.geode.internal.cache.map.RegionMapPut.runWhileLockedForCacheModification(RegionMapPut.java:161)
>       at 
> org.apache.geode.internal.cache.map.AbstractRegionMapPut.put(AbstractRegionMapPut.java:169)
>       at 
> org.apache.geode.internal.cache.AbstractRegionMap.basicPut(AbstractRegionMap.java:2044)
>       at 
> org.apache.geode.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5599)
>       at 
> org.apache.geode.internal.cache.DistributedRegion.virtualPut(DistributedRegion.java:393)
>       at 
> org.apache.geode.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5577)
>       at 
> org.apache.geode.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:157)
>       at 
> org.apache.geode.internal.cache.LocalRegion.basicPut(LocalRegion.java:5035)
>       at 
> org.apache.geode.internal.cache.LocalRegion.replaceWithCallbackArgument(LocalRegion.java:10600)
>       at 
> org.apache.geode.internal.cache.LocalRegion.replace(LocalRegion.java:10566)
>         [application code traces deleted]
> Caused by: java.lang.IllegalArgumentException
>       at java.nio.Buffer.position(Buffer.java:244)
>       at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:96)
>       at sun.nio.ch.IOUtil.write(IOUtil.java:51)
>       at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:469)
>       at 
> org.apache.geode.internal.tcp.Connection.writeFully(Connection.java:2596)
>       at 
> org.apache.geode.internal.tcp.Connection.sendPreserialized(Connection.java:1866)
>       at 
> org.apache.geode.internal.tcp.MsgStreamer.realFlush(MsgStreamer.java:330)
>       at org.apache.geode.internal.tcp.MsgStreamer.write(MsgStreamer.java:390)
>       at 
> org.apache.geode.DataSerializer.writeByteArray(DataSerializer.java:1185)
>       at 
> org.apache.geode.DataSerializer.writeByteArray(DataSerializer.java:1153)
>       at 
> org.apache.geode.internal.cache.DistributedCacheOperation.writeValue(DistributedCacheOperation.java:137)
>       at 
> org.apache.geode.internal.cache.UpdateOperation$UpdateMessage.toData(UpdateOperation.java:417)
>       at 
> org.apache.geode.internal.serialization.internal.DSFIDSerializerImpl.invokeToData(DSFIDSerializerImpl.java:213)
>       at 
> org.apache.geode.internal.serialization.internal.DSFIDSerializerImpl.write(DSFIDSerializerImpl.java:137)
>       at 
> org.apache.geode.internal.InternalDataSerializer.writeDSFID(InternalDataSerializer.java:1484)
>       ... 37 more {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to