[
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 [email protected].
----------------------------------------------------------------
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:
[email protected]
> 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)