This is an automated email from the ASF dual-hosted git repository. zhouxj pushed a commit to branch feature/GEODE-3569 in repository https://gitbox.apache.org/repos/asf/geode.git
commit 5d524a7e80d8facbdd35021b35bd1a74259eb4aa Author: zhouxh <[email protected]> AuthorDate: Fri Sep 15 15:30:06 2017 -0700 GEODE-3569: save the serializer class name into LuceneIndexCreationProfile and compare between members when creating index --- .../geode/internal/i18n/LocalizedStrings.java | 3 ++ .../internal/LuceneIndexCreationProfile.java | 22 +++++++++++++- .../lucene/internal/LuceneRegionListener.java | 2 +- .../cache/lucene/internal/LuceneServiceImpl.java | 4 +-- .../geode/cache/lucene/DummyLuceneSerializer.java | 29 ++++++++++++++++++ .../LuceneIndexCreationProfileJUnitTest.java | 34 ++++++++++++++++++---- .../cache/lucene/test/LuceneTestUtilities.java | 4 +++ 7 files changed, 88 insertions(+), 10 deletions(-) diff --git a/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java b/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java index 3a32db8..777797b 100755 --- a/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java +++ b/geode-core/src/main/java/org/apache/geode/internal/i18n/LocalizedStrings.java @@ -7611,6 +7611,9 @@ public class LocalizedStrings { public static final StringId LuceneService_CANNOT_CREATE_INDEX_0_ON_REGION_1_WITH_ANALYZER_2_ON_FIELD_3_BECAUSE_ANOTHER_MEMBER_DEFINES_THE_SAME_INDEX_WITH_ANALYZER_4_ON_THAT_FIELD = new StringId(6631, "Cannot create Lucene index {0} on region {1} with analyzer {2} on field {3} because another member defines the same index with analyzer {4} on that field."); + public static final StringId LuceneService_CANNOT_CREATE_INDEX_0_ON_REGION_1_WITH_SERIALIZER_2_BECAUSE_ANOTHER_MEMBER_DEFINES_THE_SAME_INDEX_WITH_DIFFERENT_SERIALIZER_3 = + new StringId(6632, + "Cannot create Lucene index {0} on region {1} with Serializer {2} because another member defines the same index with different serializer {3}."); public static final StringId AbstractDistributionConfig_CLUSTER_SSL_ALIAS_0 = new StringId(6633, "SSL communication uses the this alias when determining the key to use from the keystore for SSL. Defaults to \"{0}\"."); diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfile.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfile.java index 28d84e5..c42e2a0 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfile.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfile.java @@ -16,6 +16,8 @@ package org.apache.geode.cache.lucene.internal; import org.apache.geode.DataSerializable; import org.apache.geode.DataSerializer; +import org.apache.geode.cache.lucene.LuceneSerializer; +import org.apache.geode.cache.lucene.internal.repository.serializer.HeterogeneousLuceneSerializer; import org.apache.geode.internal.cache.CacheServiceProfile; import org.apache.geode.internal.i18n.LocalizedStrings; import org.apache.lucene.analysis.Analyzer; @@ -36,18 +38,25 @@ public class LuceneIndexCreationProfile implements CacheServiceProfile, DataSeri private Map<String, String> fieldAnalyzers; + private String serializerClass; + private String regionPath; /* Used by DataSerializer */ public LuceneIndexCreationProfile() {} public LuceneIndexCreationProfile(String indexName, String regionPath, String[] fieldNames, - Analyzer analyzer, Map<String, Analyzer> fieldAnalyzers) { + Analyzer analyzer, Map<String, Analyzer> fieldAnalyzers, LuceneSerializer serializer) { this.indexName = indexName; this.regionPath = regionPath; this.fieldNames = fieldNames; this.analyzerClass = analyzer.getClass().getSimpleName(); initializeFieldAnalyzers(fieldAnalyzers); + if (serializer == null) { + this.serializerClass = HeterogeneousLuceneSerializer.class.getSimpleName(); + } else { + this.serializerClass = serializer.getClass().getSimpleName(); + } } public String getIndexName() { @@ -66,6 +75,10 @@ public class LuceneIndexCreationProfile implements CacheServiceProfile, DataSeri return this.fieldAnalyzers; } + public String getSerializerClass() { + return this.serializerClass; + } + protected void initializeFieldAnalyzers(Map<String, Analyzer> fieldAnalyzers) { this.fieldAnalyzers = new HashMap<>(); for (String field : fieldNames) { @@ -129,6 +142,13 @@ public class LuceneIndexCreationProfile implements CacheServiceProfile, DataSeri } } } + + if (!getSerializerClass().equals(remoteProfile.getSerializerClass())) { + return LocalizedStrings.LuceneService_CANNOT_CREATE_INDEX_0_ON_REGION_1_WITH_SERIALIZER_2_BECAUSE_ANOTHER_MEMBER_DEFINES_THE_SAME_INDEX_WITH_DIFFERENT_SERIALIZER_3 + .toString(getIndexName(), regionPath, getSerializerClass(), + remoteProfile.getSerializerClass()); + } + return result; } diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java index 8866249..8632fca 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java @@ -103,7 +103,7 @@ public class LuceneRegionListener implements RegionListener { // Add index creation profile internalRegionArgs.addCacheServiceProfile(new LuceneIndexCreationProfile(this.indexName, - this.regionPath, this.fields, this.analyzer, this.fieldAnalyzers)); + this.regionPath, this.fields, this.analyzer, this.fieldAnalyzers, null)); luceneIndex = this.service.beforeDataRegionCreated(this.indexName, this.regionPath, attrs, this.analyzer, this.fieldAnalyzers, aeqId, serializer, this.fields); diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java index 60e196c..6af9a07 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java @@ -206,8 +206,8 @@ public class LuceneServiceImpl implements InternalLuceneService { regionPath = "/" + regionPath; } - registerDefinedIndex(indexName, regionPath, - new LuceneIndexCreationProfile(indexName, regionPath, fields, analyzer, fieldAnalyzers)); + registerDefinedIndex(indexName, regionPath, new LuceneIndexCreationProfile(indexName, + regionPath, fields, analyzer, fieldAnalyzers, serializer)); Region region = cache.getRegion(regionPath); if (region != null) { diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/DummyLuceneSerializer.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/DummyLuceneSerializer.java new file mode 100644 index 0000000..2a31768 --- /dev/null +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/DummyLuceneSerializer.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.cache.lucene; + +import java.util.Collection; +import java.util.Collections; + +import org.apache.lucene.document.Document; + +public class DummyLuceneSerializer implements LuceneSerializer { + + @Override + public Collection<Document> toDocuments(Object value) { + return Collections.emptyList(); + } + +} diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfileJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfileJUnitTest.java index b378ca5..926d74b 100644 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfileJUnitTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationProfileJUnitTest.java @@ -15,6 +15,9 @@ package org.apache.geode.cache.lucene.internal; import org.apache.geode.CopyHelper; +import org.apache.geode.cache.lucene.DummyLuceneSerializer; +import org.apache.geode.cache.lucene.LuceneSerializer; +import org.apache.geode.cache.lucene.internal.repository.serializer.HeterogeneousLuceneSerializer; import org.apache.geode.cache.lucene.test.LuceneTestUtilities; import org.apache.geode.test.junit.categories.UnitTest; import junitparams.JUnitParamsRunner; @@ -80,19 +83,38 @@ public class LuceneIndexCreationProfileJUnitTest { new Object[] {getNullField2AnalyzerLuceneIndexCreationProfile(), getNullField1AnalyzerLuceneIndexCreationProfile(), CANNOT_CREATE_LUCENE_INDEX_DIFFERENT_ANALYZERS_1}, + new Object[] {getDefaultSerializerCreationProfile(), getDummySerializerCreationProfile(), + CANNOT_CREATE_LUCENE_INDEX_DIFFERENT_SERIALIZER}, + new Object[] {getDefaultSerializerCreationProfile(), + getHeterogeneousLuceneSerializerCreationProfile(), null}, new Object[] {getNullField1AnalyzerLuceneIndexCreationProfile(), getNullField2AnalyzerLuceneIndexCreationProfile(), LuceneTestUtilities.CANNOT_CREATE_LUCENE_INDEX_DIFFERENT_ANALYZERS_2}); } + private LuceneIndexCreationProfile getDefaultSerializerCreationProfile() { + return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1"}, + new StandardAnalyzer(), null, null); + } + + private LuceneIndexCreationProfile getDummySerializerCreationProfile() { + return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1"}, + new StandardAnalyzer(), null, new DummyLuceneSerializer()); + } + + private LuceneIndexCreationProfile getHeterogeneousLuceneSerializerCreationProfile() { + return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1"}, + new StandardAnalyzer(), null, new HeterogeneousLuceneSerializer(new String[] {"field1"})); + } + private LuceneIndexCreationProfile getOneFieldLuceneIndexCreationProfile() { return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1"}, - new StandardAnalyzer(), null); + new StandardAnalyzer(), null, null); } private LuceneIndexCreationProfile getTwoFieldLuceneIndexCreationProfile() { return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, - new String[] {"field1", "field2"}, new StandardAnalyzer(), null); + new String[] {"field1", "field2"}, new StandardAnalyzer(), null, null); } private LuceneIndexCreationProfile getOneAnalyzerLuceneIndexCreationProfile(Analyzer analyzer) { @@ -100,7 +122,7 @@ public class LuceneIndexCreationProfileJUnitTest { fieldAnalyzers.put("field1", analyzer); return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1", "field2"}, getPerFieldAnalyzerWrapper(fieldAnalyzers), - fieldAnalyzers); + fieldAnalyzers, null); } private LuceneIndexCreationProfile getTwoAnalyzersLuceneIndexCreationProfile() { @@ -109,7 +131,7 @@ public class LuceneIndexCreationProfileJUnitTest { fieldAnalyzers.put("field2", new KeywordAnalyzer()); return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1", "field2"}, getPerFieldAnalyzerWrapper(fieldAnalyzers), - fieldAnalyzers); + fieldAnalyzers, null); } private LuceneIndexCreationProfile getNullField1AnalyzerLuceneIndexCreationProfile() { @@ -118,7 +140,7 @@ public class LuceneIndexCreationProfileJUnitTest { fieldAnalyzers.put("field2", new KeywordAnalyzer()); return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1", "field2"}, getPerFieldAnalyzerWrapper(fieldAnalyzers), - fieldAnalyzers); + fieldAnalyzers, null); } private LuceneIndexCreationProfile getNullField2AnalyzerLuceneIndexCreationProfile() { @@ -127,7 +149,7 @@ public class LuceneIndexCreationProfileJUnitTest { fieldAnalyzers.put("field2", null); return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1", "field2"}, getPerFieldAnalyzerWrapper(fieldAnalyzers), - fieldAnalyzers); + fieldAnalyzers, null); } private Analyzer getPerFieldAnalyzerWrapper(Map<String, Analyzer> fieldAnalyzers) { diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/LuceneTestUtilities.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/LuceneTestUtilities.java index 17f4dea..3d9e9a6 100644 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/LuceneTestUtilities.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/LuceneTestUtilities.java @@ -79,6 +79,10 @@ public class LuceneTestUtilities { "Cannot create Lucene index index2 on region /region because it is not defined in another member."; public static final String CANNOT_CREATE_LUCENE_INDEX_DIFFERENT_INDEXES_3 = "Cannot create Lucene index index on region /region because it is not defined in another member."; + public static final String CANNOT_CREATE_LUCENE_INDEX_DIFFERENT_SERIALIZER = + "Cannot create Lucene index index on region /region with Serializer DummyLuceneSerializer because another member defines the same index with different serializer HeterogeneousLuceneSerializer."; + public static final String SERIALIZER_MATCHED = + "Serializer matched when creating Lucene index index on region /region."; public static String Quarter1 = "Q1"; public static String Quarter2 = "Q2"; -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
