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