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

Diane Hardman commented on GEODE-2689:
--------------------------------------

Barry,
When you say "the same test with OQL works", do you mean that the member is 
started WITH the index or without the index, due to the 
IndexNameConflictException?

My preference is to mimic as much as the OQL behavior as possible. I like your 
suggestion of throwing a  LuceneIndexExistsException and verifying that the 
indexes are the same. Is this done with OQL?

Thanks!

> If a region containing a Lucene index is created in one group and altered in 
> another, a member in the other group will fail to start
> ------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: GEODE-2689
>                 URL: https://issues.apache.org/jira/browse/GEODE-2689
>             Project: Geode
>          Issue Type: Bug
>          Components: lucene
>            Reporter: Barry Oglesby
>
> Steps to reproduce:
> - create lucene index --name=full_index --region=data --field=field1
> - create region --name=data --type=PARTITION_REDUNDANT
> - alter region --name=data --cache-listener=TestCacheListener --group=group1
> At this point, the cluster config xml looks like:
> {noformat}
> [info 2017/03/15 17:04:17.375 PDT server3 <main> tid=0x1] 
>   ***************************************************************
>   Configuration for  'cluster'
>   
>   Jar files to deployed
>   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
>   <cache xmlns="http://geode.apache.org/schema/cache"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; copy-on-read="false" 
> is-server="false" lock-lease="120" lock-timeout="60" search-timeout="300" 
> version="1.0" xsi:schemaLocation="http://geode.apache.org/schema/cache 
> http://geode.apache.org/schema/cache/cache-1.0.xsd";>
>   <region name="data">
>       <region-attributes async-event-queue-ids="full_index#_data" 
> data-policy="partition">
>         <partition-attributes redundant-copies="1"/>
>       </region-attributes>
>       <lucene:index xmlns:lucene="http://geode.apache.org/schema/lucene"; 
> name="full_index">
>         <lucene:field 
> analyzer="org.apache.lucene.analysis.standard.StandardAnalyzer" 
> name="field1"/>
>       </lucene:index>
>     </region>
>   </cache>
>   
>   ***************************************************************
>   Configuration for  'group1'
>   
>   Jar files to deployed
>   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
>   <cache xmlns="http://geode.apache.org/schema/cache"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; copy-on-read="false" 
> is-server="false" lock-lease="120" lock-timeout="60" search-timeout="300" 
> version="1.0" xsi:schemaLocation="http://geode.apache.org/schema/cache 
> http://geode.apache.org/schema/cache/cache-1.0.xsd";>
>   <region name="data">
>       <region-attributes async-event-queue-ids="full_index#_data" 
> data-policy="partition">
>         <partition-attributes redundant-copies="1"/>
>         <cache-listener>
>           <class-name>TestCacheListener</class-name>
>         </cache-listener>
>       </region-attributes>
>       <lucene:index xmlns:lucene="http://geode.apache.org/schema/lucene"; 
> name="full_index">
>         <lucene:field 
> analyzer="org.apache.lucene.analysis.standard.StandardAnalyzer" 
> name="field1"/>
>       </lucene:index>
>     </region>
>   </cache>
> {noformat}
> If a member is started in the group (group1 in this case), it will fail to 
> start with the following error:
> {noformat}
> [error 2017/03/15 17:04:19.715 PDT <main> tid=0x1] Lucene index already 
> exists in region
> Exception in thread "main" java.lang.IllegalArgumentException: Lucene index 
> already exists in region
>       at 
> org.apache.geode.cache.lucene.internal.LuceneServiceImpl.registerDefinedIndex(LuceneServiceImpl.java:201)
>       at 
> org.apache.geode.cache.lucene.internal.LuceneServiceImpl.createIndex(LuceneServiceImpl.java:154)
>       at 
> org.apache.geode.cache.lucene.internal.xml.LuceneIndexCreation.beforeCreate(LuceneIndexCreation.java:85)
>       at 
> org.apache.geode.internal.cache.extension.SimpleExtensionPoint.beforeCreate(SimpleExtensionPoint.java:77)
>       at 
> org.apache.geode.internal.cache.xmlcache.RegionCreation.createRoot(RegionCreation.java:252)
>       at 
> org.apache.geode.internal.cache.xmlcache.CacheCreation.initializeRegions(CacheCreation.java:544)
>       at 
> org.apache.geode.internal.cache.xmlcache.CacheCreation.create(CacheCreation.java:495)
>       at 
> org.apache.geode.internal.cache.xmlcache.CacheXmlParser.create(CacheXmlParser.java:343)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.loadCacheXml(GemFireCacheImpl.java:4479)
>       at 
> org.apache.geode.internal.cache.ClusterConfigurationLoader.applyClusterXmlConfiguration(ClusterConfigurationLoader.java:129)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1243)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.basicCreate(GemFireCacheImpl.java:798)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.create(GemFireCacheImpl.java:783)
>       at org.apache.geode.cache.CacheFactory.create(CacheFactory.java:178)
>       at org.apache.geode.cache.CacheFactory.create(CacheFactory.java:218)
>       at TestBase.initializeServerCache(TestBase.java:22)
>       at TestServer.main(TestServer.java:7)
> {noformat}
> I made a quick change in {{LuceneIndexCreation beforeCreate}} to just log the 
> {{IllegalArgumentException}}. I'm not sure if this is good enough or not.
> {noformat}
> public void beforeCreate(Extensible<Region<?, ?>> source, Cache cache) {
>   LuceneServiceImpl service = (LuceneServiceImpl) 
> LuceneServiceProvider.get(cache);
>   Analyzer analyzer = this.fieldAnalyzers == null ? new StandardAnalyzer()
>     : new PerFieldAnalyzerWrapper(new StandardAnalyzer(), 
> this.fieldAnalyzers);
>   try {
>     service.createIndex(getName(), getRegionPath(), analyzer, 
> this.fieldAnalyzers,
>       getFieldNames());
>   } catch (IllegalArgumentException e) {
>     // log a warning or info here
>   }
> }
> {noformat}
> We might want to create a {{LuceneIndexExistsException}} to catch here. We 
> also might want to compare the indexes to see that they are the same.
> btw - this same test with OQL works:
> In the OQL case, the cluster config looks like:
> {noformat}
> [info 2017/03/15 17:14:12.364 PDT server3 <main> tid=0x1] 
>   ***************************************************************
>   Configuration for  'cluster'
>   
>   Jar files to deployed
>   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
>   <cache xmlns="http://geode.apache.org/schema/cache"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; copy-on-read="false" 
> is-server="false" lock-lease="120" lock-timeout="60" search-timeout="300" 
> version="1.0" xsi:schemaLocation="http://geode.apache.org/schema/cache 
> http://geode.apache.org/schema/cache/cache-1.0.xsd";>
>   <region name="data">
>       <region-attributes data-policy="partition">
>         <partition-attributes redundant-copies="1"/>
>       </region-attributes>
>       <index expression="cusip" from-clause="/data" key-index="false" 
> name="cusip" type="range"/>
>     </region>
>   </cache>
>   
>   ***************************************************************
>   Configuration for  'group1'
>   
>   Jar files to deployed
>   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
>   <cache xmlns="http://geode.apache.org/schema/cache"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; copy-on-read="false" 
> is-server="false" lock-lease="120" lock-timeout="60" search-timeout="300" 
> version="1.0" xsi:schemaLocation="http://geode.apache.org/schema/cache 
> http://geode.apache.org/schema/cache/cache-1.0.xsd";>
>   <region name="data">
>       <region-attributes data-policy="partition">
>         <partition-attributes redundant-copies="1"/>
>         <cache-listener>
>           <class-name>TestCacheListener</class-name>
>         </cache-listener>
>       </region-attributes>
>       <index expression="cusip" from-clause="/data" key-index="false" 
> name="cusip" type="range"/>
>     </region>
>   </cache>
> {noformat}
> When the member is started, an {{IndexNameConflictException}} is thrown in 
> {{PartitionedRegion createIndex}}:
> {noformat}
> org.apache.geode.cache.query.IndexNameConflictException: Index named ' cusip 
> ' already exists.
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.createIndex(PartitionedRegion.java:8632)
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.createIndex(PartitionedRegion.java:8580)
>       at 
> org.apache.geode.cache.query.internal.DefaultQueryService.createIndex(DefaultQueryService.java:190)
>       at 
> org.apache.geode.cache.query.internal.DefaultQueryService.createIndex(DefaultQueryService.java:153)
>       at 
> org.apache.geode.internal.cache.LocalRegion.createOQLIndexes(LocalRegion.java:2490)
>       at 
> org.apache.geode.internal.cache.LocalRegion.createOQLIndexes(LocalRegion.java:2423)
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.initPRInternals(PartitionedRegion.java:917)
>       at 
> org.apache.geode.internal.cache.PartitionedRegion.initialize(PartitionedRegion.java:1057)
> {noformat}
> And handled in {{LocalRegion createOQLIndexes}} like:
> {noformat}
> } catch (Exception ex) {
>   logger.info("Failed to create index {} on region {} with exception: {}",
>     icd.getIndexName(), this.getFullPath(), ex);
> {noformat}
> Which logs a message like:
> {noformat}
> [info 2017/03/15 17:14:13.376 PDT server3 <main> tid=0x1] Failed to create 
> index cusip on region /data with exception: 
> org.apache.geode.cache.query.IndexNameConflictException: Index named ' cusip 
> ' already exists.
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to