[ https://issues.apache.org/jira/browse/GEODE-8671?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17264558#comment-17264558 ]
Jianxia Chen commented on GEODE-8671: ------------------------------------- Two different stack traces when calling Region.get() and returning PdxInstanceImpl: {code} java.lang.Throwable at org.apache.geode.pdx.internal.PdxInstanceImpl.<init>(PdxInstanceImpl.java:94) at org.apache.geode.internal.InternalDataSerializer.readPdxSerializable(InternalDataSerializer.java:2868) at org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2634) at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2864) at org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:92) at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:2038) at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:2031) at org.apache.geode.internal.cache.PreferBytesCachedDeserializable.getDeserializedValue(PreferBytesCachedDeserializable.java:75) at org.apache.geode.internal.cache.PreferBytesCachedDeserializable.getDeserializedWritableCopy(PreferBytesCachedDeserializable.java:85) at org.apache.geode.internal.cache.LocalRegion.getDeserialized(LocalRegion.java:1275) at org.apache.geode.internal.cache.LocalRegion.getDeserializedValue(LocalRegion.java:1217) at org.apache.geode.internal.cache.LocalRegionDataView.getDeserializedValue(LocalRegionDataView.java:45) at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1368) at org.apache.geode.internal.cache.PartitionedRegionDataStore.getLocally(PartitionedRegionDataStore.java:1991) at org.apache.geode.internal.cache.PartitionedRegion.getFromBucket(PartitionedRegion.java:4118) at org.apache.geode.internal.cache.PartitionedRegion.findObjectInSystem(PartitionedRegion.java:3524) at org.apache.geode.internal.cache.PartitionedRegionDataView.findObject(PartitionedRegionDataView.java:69) at org.apache.geode.internal.cache.PartitionedRegion.get(PartitionedRegion.java:3309) at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1304) at org.apache.geode.internal.cache.AbstractRegion.get(AbstractRegion.java:439) at org.apache.geode.internal.cache.RegionConcurrentOperationDUnitTest.lambda$getOnPartitionedRegionFromMultipleThreadsReturnsDifferentPdxInstances$4(RegionConcurrentOperationDUnitTest.java:163) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) java.lang.Throwable at org.apache.geode.pdx.internal.PdxInstanceImpl.<init>(PdxInstanceImpl.java:94) at org.apache.geode.internal.InternalDataSerializer.readPdxSerializable(InternalDataSerializer.java:2868) at org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2634) at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2864) at org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:92) at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:2038) at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:2031) at org.apache.geode.internal.cache.PreferBytesCachedDeserializable.getDeserializedValue(PreferBytesCachedDeserializable.java:75) at org.apache.geode.internal.cache.PreferBytesCachedDeserializable.getDeserializedWritableCopy(PreferBytesCachedDeserializable.java:85) at org.apache.geode.internal.cache.LocalRegion.getDeserialized(LocalRegion.java:1275) at org.apache.geode.internal.cache.LocalRegion.getDeserializedValue(LocalRegion.java:1217) at org.apache.geode.internal.cache.LocalRegion.getObject(LocalRegion.java:1461) at org.apache.geode.internal.cache.LocalRegion.optimizedGetObject(LocalRegion.java:1543) at org.apache.geode.internal.cache.LocalRegion.nonTxnFindObject(LocalRegion.java:1446) at org.apache.geode.internal.cache.LocalRegionDataView.findObject(LocalRegionDataView.java:197) at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1380) at org.apache.geode.internal.cache.PartitionedRegionDataStore.getLocally(PartitionedRegionDataStore.java:1991) at org.apache.geode.internal.cache.PartitionedRegion.getFromBucket(PartitionedRegion.java:4118) at org.apache.geode.internal.cache.PartitionedRegion.findObjectInSystem(PartitionedRegion.java:3524) at org.apache.geode.internal.cache.PartitionedRegionDataView.findObject(PartitionedRegionDataView.java:69) at org.apache.geode.internal.cache.PartitionedRegion.get(PartitionedRegion.java:3309) at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1304) at org.apache.geode.internal.cache.AbstractRegion.get(AbstractRegion.java:439) at org.apache.geode.internal.cache.RegionConcurrentOperationDUnitTest.lambda$getOnPartitionedRegionFromMultipleThreadsReturnsDifferentPdxInstances$4(RegionConcurrentOperationDUnitTest.java:163) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) {code} > Two threads calling get and retrieve the same PdxInstance, resulting in > corruption > ---------------------------------------------------------------------------------- > > Key: GEODE-8671 > URL: https://issues.apache.org/jira/browse/GEODE-8671 > Project: Geode > Issue Type: Improvement > Components: regions > Reporter: Dan Smith > Assignee: Jianxia Chen > Priority: Major > Labels: blocks-1.14.0, caching-applications > > Even if copy-on-read is set to true, two threads calling get on a partitioned > region can end up with the same PdxInstance object. > This is problematic because some PdxInstances methods are not thread safe. > Although the underlying bytes are immutatable, the PDXInstance has a > ByteSource with a position field that changes. That means two threads doing > serialization or calling toString on the PdxInstance could result in one or > more threads getting a corrupt read. > It looks like they are ending up with the same instance because of the > behavior in LocalRegion.optimizedGetObject. We use futures to make sure there > is only 1 get that goes through, and both threads receive the same value. > > Ending up in optimizedGetObject requires a race with the put, because if the > value was in the cache at the beginning of the get it would be returned > earlier in the get process. > I put a test that reproduces this issue here - > https://github.com/upthewaterspout/geode/pull/new/feature/pdx-instances-shared -- This message was sent by Atlassian Jira (v8.3.4#803005)