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

John Blum edited comment on GEODE-4822 at 5/22/18 4:44 PM:
-----------------------------------------------------------

[SGF-745|https://jira.spring.io/browse/SGF-745] might be of interests to anyone 
hitting this issue.

In a nutshell, I added the ability to filter types when using the 
{{o.s.d.g.mapping.MappingPdxSerializer}}, much like how Apache Geode's 
{{ReflectionBasedAutoSerializer}} allows you to filter using Regex.  However, 
SDG's {{MappingPdxSerializer}} approach is better.

SDG's type filtering can easily be expressed using a Java 8 
{{java.util.function.Predicate}} rather than Apache Geode's 
{{ReflectionBasedAutoSerializer}} using _Regular Expressions_.  Of course, if 
you really prefer Regex, then you can implement a {{Predicate}} using Java's 
Regex support as you see fit.

In SD _Lovelace_, SDG 2.1.0 (currently available in SDG 2.1.0.M3; Milestone 3) 
will automatically filter out Apache GemFire types, i.e. any class in the 
{{org.apache.geode}} package or sub-package.

In the current SD _Kay_, SD 2.0.x release (will be available in SDG 
{{2.0.8.RELEASE}}) as well as the SD _Ingalls_, SDG 1.9.x release (will be 
available in SDG {{1.9.13.RELEASE}}), the {{MappingPdxSerializer}} will allow 
you to register a {{Predicate}} (Kay) or a {{Filter}} (Ingalls) to filter types 
to de/serialize, but will not automatically filter Apache Geode types in 
{{org.apache.geode}} to preserve the current behavior in those releases.


was (Author: jblum):
[SGF-745|https://jira.spring.io/browse/SGF-745] might be of interests to anyone 
hitting this issue.

In a nutshell, I added the ability to filter types when using the 
{{o.s.d.g.mapping.MappingPdxSerializer}}, much like how Apache Geode's 
{{ReflectionBasedAutoSerializer}} allows you to filter using Regex.  However, 
SDG's {{MappingPdxSerializer}} approach is better.

This can be easily expressed using a Java 8 {{java.util.function.Predicate}} 
rather than Apache Geode's {{ReflectionBasedAutoSerializer}} using _Regular 
Expressions_.  Of course, if you really prefer Regex, then you can implement a 
{{Predicate}} using Java's Regex support as you see fit.

In SD _Lovelace_, SDG 2.1.0 (currently available in SDG 2.1.0.M3; Milestone 3) 
will automatically filter out Apache GemFire types, i.e. any class in the 
{{org.apache.geode}} package or sub-package.

In the current SD _Kay_, SD 2.0.x release (will be available in SDG 
{{2.0.8.RELEASE}}) as well as the SD _Ingalls_, SDG 1.9.x release (will be 
available in SDG {{1.9.13.RELEASE}}), the {{MappingPdxSerializer}} will allow 
you to register a {{Predicate}} (Kay) or a {{Filter}} (Ingalls) to filter types 
to de/serialize, but will not automatically filter Apache Geode types in 
{{org.apache.geode}} to preserve the current behavior in those releases.

> The second server instance startup error: Could not create an instance of 
> PartitionRegionConfig
> -----------------------------------------------------------------------------------------------
>
>                 Key: GEODE-4822
>                 URL: https://issues.apache.org/jira/browse/GEODE-4822
>             Project: Geode
>          Issue Type: Bug
>          Components: serialization
>            Reporter: Vlad Ermolaev
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 1h 10m
>  Remaining Estimate: 0h
>
> I have a simple configuration containing a partitioned persistent region and 
> an async queue:
> {code:xml} 
> <async-event-queue id="userQueue" persistent="true" parallel="true" 
> dispatcher-threads="1" enable-batch-conflation="true" batch-size="10" 
> batch-time-interval="10">
>  <async-event-listener>
>  <class-name>test.geode.UserQueueListener</class-name>
>  </async-event-listener>
> </async-event-queue>
> <pdx persistent="true" read-serialized="true">
>  <pdx-serializer>
>  <class-name>test.geode.util.PdxSerializerWrapper</class-name>
>  </pdx-serializer>
> </pdx>
> <region name="Users" refid="PARTITION_REDUNDANT_PERSISTENT">
>  <region-attributes initial-capacity="101" load-factor="0.85" 
> async-event-queue-ids="userQueue">
>  <key-constraint>java.lang.Long</key-constraint>
>  <value-constraint>test.geode.domain.User</value-constraint>
>  </region-attributes>
> </region>
> {code}
>  
> The first server instance successfully started.
> But the second one in always failing on startup. The problem disappears if I 
> remove the <async-event-queue> config or disable PDX serialization.
> Here is the stacktrace of the failed instance:
> {code}
> [info 2018/03/12 11:01:43.880 CET server2 <main> tid=0x1] Initializing region 
> PdxTypes
> [info 2018/03/12 11:01:43.893 CET server2 <main> tid=0x1] Region PdxTypes 
> requesting initial image from 192.168.178.159(server1:23330)<v1>:1025
> [info 2018/03/12 11:01:43.897 CET server2 <main> tid=0x1] PdxTypes is done 
> getting image from 192.168.178.159(server1:23330)<v1>:1025. isDeltaGII is true
> [info 2018/03/12 11:01:43.897 CET server2 <main> tid=0x1] Region PdxTypes 
> initialized persistent id: 
> /192.168.178.159:/u01/home/chet/projects/geode/server2/store/pdx created at 
> timestamp 1520848903878 version 0 diskStoreId 
> 9d7c3e96b525418d-ae5b85e1966f3a51 name server2 with data from 
> 192.168.178.159(server1:23330)<v1>:1025.
> [info 2018/03/12 11:01:43.897 CET server2 <main> tid=0x1] Initialization of 
> region PdxTypes completed
> [info 2018/03/12 11:01:43.901 CET server2 <main> tid=0x1] Recovered disk 
> store mainStore with unique id 11c1012c13d04a3e-9309c26560d9fd33
> [info 2018/03/12 11:01:43.902 CET server2 <main> tid=0x1] recovery region 
> initialization took 0 ms
> [info 2018/03/12 11:01:43.907 CET server2 <main> tid=0x1] Created disk store 
> queueStore with unique id 308f63b00ee045f9-a6cfaea88f894c7a
> [info 2018/03/12 11:01:43.908 CET server2 <main> tid=0x1] recovery region 
> initialization took 0 ms
> [info 2018/03/12 11:01:43.929 CET server2 <main> tid=0x1] Initializing region 
> gatewayEventIdIndexMetaData
> [info 2018/03/12 11:01:43.933 CET server2 <main> tid=0x1] Region 
> gatewayEventIdIndexMetaData requesting initial image from 
> 192.168.178.159(server1:23330)<v1>:1025
> [info 2018/03/12 11:01:43.935 CET server2 <main> tid=0x1] 
> gatewayEventIdIndexMetaData is done getting image from 
> 192.168.178.159(server1:23330)<v1>:1025. isDeltaGII is false
> [info 2018/03/12 11:01:43.935 CET server2 <main> tid=0x1] Initialization of 
> region gatewayEventIdIndexMetaData completed
> [info 2018/03/12 11:01:43.944 CET server2 <main> tid=0x1] 
> ConcurrentParallelGatewaySenderEventProcessor: dispatcher threads 1
> [info 2018/03/12 11:01:43.953 CET server2 <main> tid=0x1] Started  
> ParallelGatewaySender{id=AsyncEventQueue_userQueue,remoteDsId=-1,isRunning 
> =true}
> [info 2018/03/12 11:01:43.985 CET server2 <main> tid=0x1] Initializing region 
> __PR
> [info 2018/03/12 11:01:43.989 CET server2 <main> tid=0x1] Region __PR 
> requesting initial image from 192.168.178.159(server1:23330)<v1>:1025
> [info 2018/03/12 11:01:44.001 CET server2 <Pooled High Priority Message 
> Processor 2> tid=0x32] Adding: PdxType[dsid=0, typenum=2161953
>           name=java.util.Collections$UnmodifiableSet
>           fields=[
>           c:Object:0:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=-1
>           empty:boolean:1:idx0(relativeOffset)=-1:idx1(vlfOffsetIndex)=-1]]
> [info 2018/03/12 11:01:44.005 CET server2 <main> tid=0x1] __PR failed to get 
> image from 192.168.178.159(server1:23330)<v1>:1025
> [warning 2018/03/12 11:01:44.006 CET server2 <main> tid=0x1] Initialization 
> failed for Region /__PR
> org.apache.geode.SerializationException: Could not create an instance of  
> org.apache.geode.internal.cache.PartitionRegionConfig .
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.InternalDataSerializer.invokeFromData(InternalDataSerializer.java:2474)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.DSFIDFactory.create(DSFIDFactory.java:990)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2784)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.DataSerializer.readObject(DataSerializer.java:2961)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:99)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1951)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1944)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.VMCachedDeserializable.getDeserializedValue(VMCachedDeserializable.java:134)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.entries.AbstractRegionEntry.initialImageInit(AbstractRegionEntry.java:693)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.AbstractRegionMap.initialImagePut(AbstractRegionMap.java:977)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.InitialImageOperation.processChunk(InitialImageOperation.java:935)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.InitialImageOperation$ImageProcessor.process(InitialImageOperation.java:1265)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.ReplyMessage.process(ReplyMessage.java:213)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.InitialImageOperation$ImageReplyMessage.process(InitialImageOperation.java:2741)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.ReplyMessage.dmProcess(ReplyMessage.java:193)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.ReplyMessage.process(ReplyMessage.java:186)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionMessage.scheduleAction(DistributionMessage.java:382)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionMessage$1.run(DistributionMessage.java:448)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionManager.runUntilShutdown(DistributionManager.java:1099)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionManager.access$000(DistributionManager.java:108)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionManager$5$1.run(DistributionManager.java:820)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> java.lang.Thread.run(Thread.java:748)
>       at 
> org.apache.geode.distributed.internal.ReplyException.handleAsUnexpected(ReplyException.java:85)
>       at 
> org.apache.geode.internal.cache.InitialImageOperation.getFromOne(InitialImageOperation.java:501)
>       at 
> org.apache.geode.internal.cache.DistributedRegion.getInitialImageAndRecovery(DistributedRegion.java:1217)
>       at 
> org.apache.geode.internal.cache.DistributedRegion.initialize(DistributedRegion.java:1059)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.createVMRegion(GemFireCacheImpl.java:3089)
>       at 
> org.apache.geode.internal.cache.PartitionedRegionHelper.getPRRoot(PartitionedRegionHelper.java:271)
>       at 
> org.apache.geode.internal.cache.PartitionedRegionHelper.getPRRoot(PartitionedRegionHelper.java:190)
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.initializePartitionedRegion(PartitionedRegion.java:1267)
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.initPRInternals(PartitionedRegion.java:985)
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.initialize(PartitionedRegion.java:1166)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.createVMRegion(GemFireCacheImpl.java:3089)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.basicCreateRegion(GemFireCacheImpl.java:2989)
>       at 
> org.apache.geode.internal.cache.xmlcache.RegionCreation.createRoot(RegionCreation.java:243)
>       at 
> org.apache.geode.internal.cache.xmlcache.CacheCreation.initializeRegions(CacheCreation.java:563)
>       at 
> org.apache.geode.internal.cache.xmlcache.CacheCreation.create(CacheCreation.java:517)
>       at 
> org.apache.geode.internal.cache.xmlcache.CacheXmlParser.create(CacheXmlParser.java:338)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.loadCacheXml(GemFireCacheImpl.java:4313)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.initializeDeclarativeCache(GemFireCacheImpl.java:1403)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1203)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.basicCreate(GemFireCacheImpl.java:778)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.create(GemFireCacheImpl.java:764)
>       at org.apache.geode.cache.CacheFactory.create(CacheFactory.java:175)
>       at org.apache.geode.cache.CacheFactory.create(CacheFactory.java:222)
>       at 
> org.apache.geode.distributed.internal.DefaultServerLauncherCacheProvider.createCache(DefaultServerLauncherCacheProvider.java:52)
>       at 
> org.apache.geode.distributed.ServerLauncher.createCache(ServerLauncher.java:844)
>       at 
> org.apache.geode.distributed.ServerLauncher.start(ServerLauncher.java:762)
>       at 
> org.apache.geode.distributed.ServerLauncher.run(ServerLauncher.java:692)
>       at 
> org.apache.geode.distributed.ServerLauncher.main(ServerLauncher.java:226)
> Caused by: java.lang.ClassCastException: 
> org.apache.geode.pdx.internal.PdxInstanceImpl cannot be cast to java.util.Set
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.PartitionRegionConfig.fromData(PartitionRegionConfig.java:320)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.InternalDataSerializer.invokeFromData(InternalDataSerializer.java:2463)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.DSFIDFactory.create(DSFIDFactory.java:990)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2784)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.DataSerializer.readObject(DataSerializer.java:2961)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:99)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1951)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1944)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.VMCachedDeserializable.getDeserializedValue(VMCachedDeserializable.java:134)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.entries.AbstractRegionEntry.initialImageInit(AbstractRegionEntry.java:693)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.AbstractRegionMap.initialImagePut(AbstractRegionMap.java:977)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.InitialImageOperation.processChunk(InitialImageOperation.java:935)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.InitialImageOperation$ImageProcessor.process(InitialImageOperation.java:1265)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.ReplyMessage.process(ReplyMessage.java:213)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.internal.cache.InitialImageOperation$ImageReplyMessage.process(InitialImageOperation.java:2741)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.ReplyMessage.dmProcess(ReplyMessage.java:193)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.ReplyMessage.process(ReplyMessage.java:186)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionMessage.scheduleAction(DistributionMessage.java:382)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionMessage$1.run(DistributionMessage.java:448)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionManager.runUntilShutdown(DistributionManager.java:1099)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionManager.access$000(DistributionManager.java:108)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> org.apache.geode.distributed.internal.DistributionManager$5$1.run(DistributionManager.java:820)
>       at Remote Member '192.168.178.159(server2:24615)<v4>:1026' in 
> java.lang.Thread.run(Thread.java:748)
> {code}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to