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

ASF GitHub Bot commented on GEODE-8584:
---------------------------------------

Bill opened a new pull request #5638:
URL: https://github.com/apache/geode/pull/5638


   A third attempt at fixing GEODE-8584 locking granularity.
   
   This is a refinement of the [Finer-Grained Locking 
PR](https://github.com/apache/geode/pull/5632). That PR split the single lock 
into two.  With that other PR, client code in e.g. .`MsgReader` had to do all 
this ceremony:
   
   ```
   synchronized (ioFilter.getInputSyncObject()) {
     ioFilter.setInputInUse(true);
     try {
       ByteBuffer unwrappedBuffer = readAtLeast(Connection.MSG_HEADER_BYTES);
   
       // do stuff with unwrappedBuffer
   
     } finally {
        ioFilter.setInputInUse(false);
     }
   }
   ```
   
   @dschneider-pivotal noticed that this followed the `AutoCloseable` pattern. 
So this PR makes good on that observation and introduces the auto-closeable 
`ByteBufferSharing`. We now return a `ByteBufferSharing` from methods that used 
to return the input `ByteBuffer`. Callers acquire it in a try-with-resources 
and rely on the `AutoCloseable` protocol to take care of lock closing and 
reference counting (decrement).
   
   With this PR that same `MsgReader` code looks like this:
   
   ```
   try (final ByteBufferSharing sharedBuffer = ioFilter
       .readAtLeast(conn.getSocket().getChannel(), Connection.MSG_HEADER_BYTES, 
peerNetData)) {
     ByteBuffer unwrappedBuffer = sharedBuffer.getBuffer();
   
     // do stuff with unwrappedBuffer
     
   }
   ```      
   
   - [ ] Is there a JIRA ticket associated with this PR? Is it referenced in 
the commit message?
   
   - [ ] Has your PR been rebased against the latest commit within the target 
branch (typically `develop`)?
   
   - [ ] Is your initial contribution a single, squashed commit?
   
   - [ ] Does `gradlew build` run cleanly?
   
   - [ ] Have you written or updated unit tests to verify your changes?
   
   - [ ] If adding new dependencies to the code, are these dependencies 
licensed in a way that is compatible for inclusion under [ASF 
2.0](http://www.apache.org/legal/resolved.html#category-a)?
   
   ### Note:
   Please ensure that once the PR is submitted, check Concourse for build 
issues and
   submit an update to your PR as soon as possible. If you need help, please 
send an
   email to d...@geode.apache.org.
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> 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
>             Fix For: 1.12.1, 1.14.0, 1.13.1
>
>
> 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