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

Dan Smith commented on GEODE-7491:
----------------------------------

Steps to reproduce:

Clone this repo https://github.com/upthewaterspout/spring-session-data-geode 
and check out the branch feature/demonstrate-GEODE-7491.

Run the integration test:

{noformat}
./gradlew spring-session-data-geode:integrationTest --tests 
SessionSerializationWithPdxRequiresNoServerConfigurationIntegrationTests
{noformat}

It reports the following failure

{noformat}
org.springframework.dao.DataAccessResourceFailureException: remote server on 
10.118.19.28(SpringBasedCacheClientApplication:16789:loner):63897:0497a590:SpringBasedCacheClientApplication:
 : While performing a remote put; nested exception is 
org.apache.geode.cache.client.ServerOperationException: remote server on 
10.118.19.28(SpringBasedCacheClientApplication:16789:loner):63897:0497a590:SpringBasedCacheClientApplication:
 : While performing a remote put
        at 
org.springframework.data.gemfire.GemfireCacheUtils.convertGemfireAccessException(GemfireCacheUtils.java:235)
        at 
org.springframework.data.gemfire.GemfireAccessor.convertGemFireAccessException(GemfireAccessor.java:93)
        at 
org.springframework.data.gemfire.GemfireTemplate.put(GemfireTemplate.java:197)
        at 
org.springframework.session.data.gemfire.GemFireOperationsSessionRepository.doSave(GemFireOperationsSessionRepository.java:226)
        at 
org.springframework.session.data.gemfire.GemFireOperationsSessionRepository.save(GemFireOperationsSessionRepository.java:186)
        at 
org.springframework.session.data.gemfire.AbstractGemFireIntegrationTests.save(AbstractGemFireIntegrationTests.java:409)
        at 
org.springframework.session.data.gemfire.serialization.pdx.SessionSerializationWithPdxRequiresNoServerConfigurationIntegrationTests.operationsOnSessionContainingApplicationDomainModelObjectIsSuccessful(SessionSerializationWithPdxRequiresNoServerConfigurationIntegrationTests.java:221)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at 
org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
        at 
org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
        at 
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at 
org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
        at 
org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
        at 
org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
        at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at 
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at 
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at 
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at 
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
        at 
org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
        at 
org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
        at 
org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
        at 
org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
        at 
org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at 
org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
        at 
org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
        at 
org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at 
org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
        at 
org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
        at 
org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412)
        at 
org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at 
org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at 
org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.geode.cache.client.ServerOperationException: remote 
server on 
10.118.19.28(SpringBasedCacheClientApplication:16789:loner):63897:0497a590:SpringBasedCacheClientApplication:
 : While performing a remote put
        at 
org.apache.geode.cache.client.internal.PutOp$PutOpImpl.processAck(PutOp.java:389)
        at 
org.apache.geode.cache.client.internal.PutOp$PutOpImpl.processResponse(PutOp.java:313)
        at 
org.apache.geode.cache.client.internal.PutOp$PutOpImpl.attemptReadResponse(PutOp.java:454)
        at 
org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:387)
        at 
org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:289)
        at 
org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:338)
        at 
org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:912)
        at 
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:174)
        at 
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:130)
        at 
org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:792)
        at org.apache.geode.cache.client.internal.PutOp.execute(PutOp.java:90)
        at 
org.apache.geode.cache.client.internal.ServerRegionProxy.put(ServerRegionProxy.java:155)
        at 
org.apache.geode.internal.cache.LocalRegion.serverPut(LocalRegion.java:3061)
        at 
org.apache.geode.internal.cache.LocalRegion.cacheWriteBeforePut(LocalRegion.java:3176)
        at 
org.apache.geode.internal.cache.ProxyRegionMap.basicPut(ProxyRegionMap.java:238)
        at 
org.apache.geode.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5691)
        at 
org.apache.geode.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:162)
        at 
org.apache.geode.internal.cache.LocalRegion.basicPut(LocalRegion.java:5119)
        at 
org.apache.geode.internal.cache.LocalRegion.validatedPut(LocalRegion.java:1661)
        at 
org.apache.geode.internal.cache.LocalRegion.put(LocalRegion.java:1648)
        at 
org.apache.geode.internal.cache.AbstractRegion.put(AbstractRegion.java:421)
        at 
org.springframework.data.gemfire.GemfireTemplate.put(GemfireTemplate.java:194)
        ... 62 more
Caused by: org.apache.geode.cache.query.IndexMaintenanceException: 
org.apache.geode.cache.query.internal.index.IMQException, caused by 
org.apache.geode.cache.query.internal.index.IMQException
        at 
org.apache.geode.internal.cache.EntryEventImpl.setNewValueInRegion(EntryEventImpl.java:1736)
        at 
org.apache.geode.internal.cache.EntryEventImpl.putExistingEntry(EntryEventImpl.java:1614)
        at 
org.apache.geode.internal.cache.map.RegionMapPut.updateEntry(RegionMapPut.java:485)
        at 
org.apache.geode.internal.cache.map.RegionMapPut.createOrUpdateEntry(RegionMapPut.java:256)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPutAndDeliverEvent(AbstractRegionMapPut.java:300)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.runWithIndexUpdatingInProgress(AbstractRegionMapPut.java:308)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPutIfPreconditionsSatisified(AbstractRegionMapPut.java:296)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPutOnSynchronizedRegionEntry(AbstractRegionMapPut.java:282)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPutOnRegionEntryInMap(AbstractRegionMapPut.java:273)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.addRegionEntryToMapAndDoPut(AbstractRegionMapPut.java:251)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPutRetryingIfNeeded(AbstractRegionMapPut.java:216)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doWithIndexInUpdateMode(AbstractRegionMapPut.java:193)
        at 
org.apache.geode.internal.cache.map.AbstractRegionMapPut.doPut(AbstractRegionMapPut.java:180)
        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.BucketRegion.virtualPut(BucketRegion.java:532)
        at 
org.apache.geode.internal.cache.PartitionedRegionDataStore.putLocally(PartitionedRegionDataStore.java:1204)
        at 
org.apache.geode.internal.cache.PartitionedRegion.putInBucket(PartitionedRegion.java:2887)
        at 
org.apache.geode.internal.cache.PartitionedRegion.virtualPut(PartitionedRegion.java:2097)
        at 
org.apache.geode.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:162)
        at 
org.apache.geode.internal.cache.LocalRegion.basicUpdate(LocalRegion.java:5671)
        at 
org.apache.geode.internal.cache.LocalRegion.basicBridgePut(LocalRegion.java:5308)
        at 
org.apache.geode.internal.cache.tier.sockets.command.Put65.cmdExecute(Put65.java:393)
        at 
org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:183)
        at 
org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMessage(ServerConnection.java:851)
        at 
org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:75)
        at 
org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1227)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at 
org.apache.geode.internal.cache.tier.sockets.AcceptorImpl.lambda$initializeServerConnectionThreadPool$3(AcceptorImpl.java:616)
        at 
org.apache.geode.internal.logging.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:121)
        ... 1 more
Caused by: org.apache.geode.cache.query.internal.index.IMQException
        at 
org.apache.geode.cache.query.internal.index.CompactRangeIndex$IMQEvaluator.evaluate(CompactRangeIndex.java:1411)
        at 
org.apache.geode.cache.query.internal.index.CompactRangeIndex.removeMapping(CompactRangeIndex.java:162)
        at 
org.apache.geode.cache.query.internal.index.AbstractIndex.removeIndexMapping(AbstractIndex.java:509)
        at 
org.apache.geode.cache.query.internal.index.IndexManager.processAction(IndexManager.java:1132)
        at 
org.apache.geode.cache.query.internal.index.IndexManager.updateIndexes(IndexManager.java:987)
        at 
org.apache.geode.cache.query.internal.index.IndexManager.updateIndexes(IndexManager.java:962)
        at 
org.apache.geode.internal.cache.EntryEventImpl.setNewValueInRegion(EntryEventImpl.java:1733)
        ... 33 more
Caused by: org.apache.geode.pdx.PdxSerializationException: Class not found 
deserializing a PDX field
        at 
org.apache.geode.pdx.internal.PdxInputStream.readObject(PdxInputStream.java:252)
        at 
org.apache.geode.pdx.internal.PdxInputStream.readObject(PdxInputStream.java:93)
        at 
org.apache.geode.pdx.internal.PdxReaderImpl.readObject(PdxReaderImpl.java:366)
        at 
org.apache.geode.pdx.internal.PdxInstanceImpl.readObject(PdxInstanceImpl.java:554)
        at 
org.apache.geode.pdx.internal.PdxInstanceImpl.hashCode(PdxInstanceImpl.java:300)
        at 
org.apache.geode.cache.query.internal.ObjectIntHashMap$IntHashMapStrategy.hashCode(ObjectIntHashMap.java:1076)
        at 
org.apache.geode.cache.query.internal.ObjectIntHashMap.get(ObjectIntHashMap.java:306)
        at 
org.apache.geode.cache.query.internal.ResultsBag.mapGet(ResultsBag.java:200)
        at org.apache.geode.cache.query.internal.Bag.add(Bag.java:223)
        at 
org.apache.geode.cache.query.internal.index.DummyQRegion.getValues(DummyQRegion.java:183)
        at 
org.apache.geode.cache.query.internal.index.DummyQRegion.values(DummyQRegion.java:110)
        at 
org.apache.geode.cache.query.internal.index.DummyQRegion.iterator(DummyQRegion.java:226)
        at 
org.apache.geode.cache.query.internal.index.CompactRangeIndex$IMQEvaluator.doNestedIterations(CompactRangeIndex.java:1540)
        at 
org.apache.geode.cache.query.internal.index.CompactRangeIndex$IMQEvaluator.evaluate(CompactRangeIndex.java:1396)
        ... 39 more
Caused by: java.lang.ClassNotFoundException: 
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)
        at 
org.apache.geode.internal.InternalDataSerializer$DSObjectInputStream.resolveClass(InternalDataSerializer.java:3818)
        at 
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
        at 
org.apache.geode.internal.InternalDataSerializer.readSerializable(InternalDataSerializer.java:2970)
        at 
org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2914)
        at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2978)
        at org.apache.geode.DataSerializer.readHashMap(DataSerializer.java:2374)
        at 
org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2862)
        at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2978)
        at 
org.apache.geode.pdx.internal.PdxInputStream.readObject(PdxInputStream.java:248)
        ... 52 more
{noformat}

> Index triggers deserialization of objects embedded in a PDX object
> ------------------------------------------------------------------
>
>                 Key: GEODE-7491
>                 URL: https://issues.apache.org/jira/browse/GEODE-7491
>             Project: Geode
>          Issue Type: Bug
>          Components: querying
>            Reporter: Dan Smith
>            Priority: Major
>
> Objects that are serialized using PDX are supposed to be indexable even if 
> the classes for those objects are not present on the server. However, in 
> certain cases, having an index triggers deserialization of objects embedded 
> in the PDX object, even if those embedded objects are not indexed. Here's the 
> use case:
> 1. a PDX object with a String field (eg "name") and a nested java 
> serializable object (eg "Customer")
> 2. The class for the java serializable object is not on the classpath of the 
> server
> 3. An index on the string field.
> 4. Performing an update on the object will result in a 
> IndexMaintenanceException caused by a ClassNotFoundException
> The reason seems to be that the CompactRangeIndex.removeMapping method that 
> gets called to remove the old index mapping for the old value adds the old 
> region value to a HashSet. This requires computing the hashCode of the 
> PDXInstance. By default, PDXInstance.hashCode computes the hashcode of all of 
> the fields. The "Customer" Field in the example above cannot be deserialized 
> for a hashCode.
> Setting the identity fields of the PDX using PdxWriter.markIdentityField can 
> work around the issue, but PDX objects should probably be indexable without 
> this.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to