[ 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)