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

Reply via email to