Barry Oglesby created GEODE-2689:
------------------------------------
Summary: 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)