You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2016/05/13 18:46:14 UTC
[2/2] incubator-geode git commit: GEODE-11: Adding tests of fixed
partitions and persistent lucene indexes
GEODE-11: Adding tests of fixed partitions and persistent lucene indexes
In addition to the tests, I fixed some code to properly propagate the
disk synchronous flag to the index.
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/7908467a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/7908467a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/7908467a
Branch: refs/heads/develop
Commit: 7908467a38932edcd781c6c276791e6371522269
Parents: d216e55
Author: Dan Smith <up...@apache.org>
Authored: Thu May 12 15:36:38 2016 -0700
Committer: Dan Smith <up...@apache.org>
Committed: Fri May 13 11:37:02 2016 -0700
----------------------------------------------------------------------
.../com/gemstone/gemfire/test/fake/Fakes.java | 19 +++
.../gemfire/test/junit/rules/DiskDirRule.java | 54 ++++++++
.../test/junit/rules/DiskDirRuleTest.java | 49 +++++++
.../LuceneIndexForPartitionedRegion.java | 28 ++--
.../lucene/internal/LuceneQueryFactoryImpl.java | 3 +
.../internal/PartitionedRepositoryManager.java | 1 +
.../LuceneIndexCreationIntegrationTest.java | 131 +++++++++++++++++--
.../cache/lucene/LuceneIntegrationTest.java | 14 +-
.../LuceneIndexForPartitionedRegionTest.java | 58 ++++----
.../LuceneQueryFactoryImplJUnitTest.java | 21 ++-
10 files changed, 312 insertions(+), 66 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java b/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
index 99644b7..2a1fd8e 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
@@ -23,6 +23,10 @@ import java.net.UnknownHostException;
import org.junit.Assert;
import com.gemstone.gemfire.CancelCriterion;
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.DataPolicy;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionAttributes;
import com.gemstone.gemfire.distributed.internal.DSClock;
import com.gemstone.gemfire.distributed.internal.DistributionConfig;
import com.gemstone.gemfire.distributed.internal.DistributionManager;
@@ -96,6 +100,21 @@ public class Fakes {
return cache().getDistributedSystem();
}
+ /**
+ * A fake region, which contains a fake cache and some other
+ * fake attributes
+ */
+ public static Region region(String name, Cache cache) {
+ Region region = mock(Region.class);
+ RegionAttributes attributes = mock(RegionAttributes.class);
+ DataPolicy policy = mock(DataPolicy.class);
+ when(region.getAttributes()).thenReturn(attributes);
+ when(attributes.getDataPolicy()).thenReturn(policy);
+ when(region.getCache()).thenReturn(cache);
+ when(region.getRegionService()).thenReturn(cache);
+ return region;
+ }
+
private Fakes() {
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DiskDirRule.java
----------------------------------------------------------------------
diff --git a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DiskDirRule.java b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DiskDirRule.java
new file mode 100644
index 0000000..184619f
--- /dev/null
+++ b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DiskDirRule.java
@@ -0,0 +1,54 @@
+/*
+ * 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 com.gemstone.gemfire.test.junit.rules;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+import org.junit.rules.ExternalResource;
+
+public class DiskDirRule extends ExternalResource {
+ private File diskDir;
+
+ @Override protected void before() throws Throwable {
+ diskDir = new File(".", "DiskDirRule-" + System.nanoTime());
+ }
+
+ @Override protected void after() {
+ try {
+ Files.walk(diskDir.toPath()).forEach((path) -> {
+ try {
+ Files.delete(path);
+ }
+ catch (IOException e) {
+ //Ignore
+ }
+ });
+ } catch(IOException e) {
+ throw new RuntimeException("Could not delete disk dir: " + diskDir, e);
+ }
+ diskDir.delete();
+ }
+
+ public File get() {
+ diskDir.mkdirs();
+ return diskDir;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/rules/DiskDirRuleTest.java
----------------------------------------------------------------------
diff --git a/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/rules/DiskDirRuleTest.java b/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/rules/DiskDirRuleTest.java
new file mode 100644
index 0000000..8c322a4
--- /dev/null
+++ b/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/rules/DiskDirRuleTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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 com.gemstone.gemfire.test.junit.rules;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Arrays;
+
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category(UnitTest.class)
+public class DiskDirRuleTest {
+ @Test
+ public void shouldDeleteDirInAfter() throws Throwable {
+ DiskDirRule diskDirRule = new DiskDirRule();
+ diskDirRule.before();
+ final File dir = diskDirRule.get();
+ assertTrue(dir.exists());
+ final File file1 = new File(dir, "file1");
+ final File subdir = new File(dir, "subdir");
+ final File file2 = new File(dir, "file2");
+ subdir.mkdir();
+ Files.write(file1.toPath(), Arrays.asList("abc"));
+ Files.write(file2.toPath(), Arrays.asList("stuff"));
+ diskDirRule.after();
+ assertFalse(dir.exists());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegion.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
index dd9d384..d22ca4a 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
@@ -29,7 +29,6 @@ import com.gemstone.gemfire.cache.RegionAttributes;
import com.gemstone.gemfire.cache.RegionShortcut;
import com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueue;
import com.gemstone.gemfire.cache.asyncqueue.internal.AsyncEventQueueFactoryImpl;
-import com.gemstone.gemfire.cache.asyncqueue.internal.AsyncEventQueueImpl;
import com.gemstone.gemfire.cache.lucene.internal.filesystem.ChunkKey;
import com.gemstone.gemfire.cache.lucene.internal.filesystem.File;
import com.gemstone.gemfire.cache.lucene.internal.repository.serializer.HeterogeneousLuceneSerializer;
@@ -88,46 +87,37 @@ public class LuceneIndexForPartitionedRegion extends LuceneIndexImpl {
repositoryManager = new PartitionedRepositoryManager(dataRegion, (PartitionedRegion)fileRegion, (PartitionedRegion)chunkRegion, mapper, analyzer);
// create AEQ, AEQ listener and specify the listener to repositoryManager
- if (withPersistence) {
- createAEQWithPersistence();
- }
- else {
- createAEQ();
- }
+ createAEQ(dataRegion);
addExtension(dataRegion);
hasInitialized = true;
}
}
- private AsyncEventQueueFactoryImpl createAEQFactory() {
+ private AsyncEventQueueFactoryImpl createAEQFactory(final Region dataRegion) {
AsyncEventQueueFactoryImpl factory = (AsyncEventQueueFactoryImpl) cache.createAsyncEventQueueFactory();
factory.setParallel(true); // parallel AEQ for PR
factory.setMaximumQueueMemory(1000);
factory.setDispatcherThreads(1);
factory.setIsMetaQueue(true);
+ if(dataRegion.getAttributes().getDataPolicy().withPersistence()) {
+ factory.setPersistent(true);
+ }
+ factory.setDiskSynchronous(dataRegion.getAttributes().isDiskSynchronous());
return factory;
}
- AsyncEventQueue createAEQWithPersistence() {
- AsyncEventQueueFactoryImpl factory = createAEQFactory();
- factory.setPersistent(true);
- return createAEQ(factory);
- }
-
- AsyncEventQueue createAEQ() {
- return createAEQ(createAEQFactory());
+ AsyncEventQueue createAEQ(Region dataRegion) {
+ return createAEQ(createAEQFactory(dataRegion));
}
private AsyncEventQueue createAEQ(AsyncEventQueueFactoryImpl factory) {
LuceneEventListener listener = new LuceneEventListener(repositoryManager);
String aeqId = LuceneServiceImpl.getUniqueIndexName(getName(), regionPath);
- AsyncEventQueueImpl aeq = (AsyncEventQueueImpl)cache.getAsyncEventQueue(aeqId);
AsyncEventQueue indexQueue = factory.create(aeqId, listener);
return indexQueue;
}
-
boolean fileRegionExists(String fileRegionName) {
return cache.<String, File> getRegion(fileRegionName) != null;
}
@@ -156,7 +146,7 @@ public class LuceneIndexForPartitionedRegion extends LuceneIndexImpl {
return LuceneServiceImpl.getUniqueIndexName(indexName, regionPath) + ".chunks";
}
- private PartitionAttributesFactory configureLuceneRegionAttributesFactory(PartitionAttributesFactory attributesFactory, PartitionAttributes dataRegionAttributes) {
+ private PartitionAttributesFactory configureLuceneRegionAttributesFactory(PartitionAttributesFactory attributesFactory, PartitionAttributes<?,?> dataRegionAttributes) {
attributesFactory.setTotalNumBuckets(dataRegionAttributes.getTotalNumBuckets());
attributesFactory.setRedundantCopies(dataRegionAttributes.getRedundantCopies());
return attributesFactory;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java
index c6087ea..385b226 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java
@@ -54,6 +54,9 @@ public class LuceneQueryFactoryImpl implements LuceneQueryFactory {
public <K, V> LuceneQuery<K, V> create(String indexName, String regionName, LuceneQueryProvider provider) {
Region<K, V> region = cache.getRegion(regionName);
+ if(region == null) {
+ throw new IllegalArgumentException("Region not found: " + regionName);
+ }
LuceneQueryImpl<K, V> luceneQuery = new LuceneQueryImpl<K, V>(indexName, region, provider, projectionFields, limit, pageSize);
return luceneQuery;
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java
index 07050e2..57b8862 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java
@@ -27,6 +27,7 @@ import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import com.gemstone.gemfire.InternalGemFireError;
import com.gemstone.gemfire.cache.Region;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationIntegrationTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationIntegrationTest.java
index 2d16e32..6429143 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationIntegrationTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationIntegrationTest.java
@@ -29,23 +29,26 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
-import java.util.function.Function;
import com.gemstone.gemfire.cache.EvictionAttributes;
import com.gemstone.gemfire.cache.ExpirationAttributes;
+import com.gemstone.gemfire.cache.FixedPartitionAttributes;
+import com.gemstone.gemfire.cache.PartitionAttributesFactory;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.RegionShortcut;
-import com.gemstone.gemfire.cache.lucene.LuceneIndex;
-import com.gemstone.gemfire.cache.lucene.LuceneIntegrationTest;
-import com.gemstone.gemfire.cache.lucene.LuceneServiceProvider;
+import com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueue;
+import com.gemstone.gemfire.cache.asyncqueue.internal.AsyncEventQueueImpl;
import com.gemstone.gemfire.cache.lucene.internal.LuceneIndexForPartitionedRegion;
+import com.gemstone.gemfire.cache.lucene.internal.LuceneServiceImpl;
import com.gemstone.gemfire.internal.cache.BucketNotFoundException;
import com.gemstone.gemfire.internal.cache.LocalRegion;
+import com.gemstone.gemfire.internal.cache.PartitionedRegion;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
import com.jayway.awaitility.Awaitility;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.core.KeywordTokenizer;
+import org.apache.lucene.queryparser.classic.ParseException;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -122,6 +125,18 @@ public class LuceneIndexCreationIntegrationTest extends LuceneIntegrationTest {
}
@Test
+ public void shouldNotUseOffHeapForInternalRegionsWhenUserRegionHasOffHeap() {
+ createIndex("text");
+ cache.createRegionFactory(RegionShortcut.PARTITION)
+ .setOffHeap(true)
+ .create(REGION_NAME);
+
+ verifyInternalRegions(region -> {
+ assertEquals(false, region.getOffHeap());
+ });
+ }
+
+ @Test
public void shouldNotUseOverflowForInternalRegionsWhenUserRegionHasOverflow() {
createIndex("text");
cache.createRegionFactory(RegionShortcut.PARTITION_OVERFLOW).create(REGION_NAME);
@@ -131,18 +146,112 @@ public class LuceneIndexCreationIntegrationTest extends LuceneIntegrationTest {
}
@Test
- public void shouldCreateInternalRegionsForIndex() {
+ public void shouldUseDiskSynchronousWhenUserRegionHasDiskSynchronous() {
+ createIndex("text");
+ cache.createRegionFactory(RegionShortcut.PARTITION_PERSISTENT)
+ .setDiskSynchronous(true)
+ .create(REGION_NAME);
+ verifyInternalRegions(region -> {
+ assertTrue(region.getDataPolicy().withPersistence());
+ assertTrue(region.isDiskSynchronous());
+ });
+ AsyncEventQueue queue = getIndexQueue();
+ assertEquals(true, queue.isDiskSynchronous());
+ assertEquals(true, queue.isPersistent());
+ }
+
+ @Test
+ public void shouldUseDiskSyncFalseOnQueueWhenUserRegionHasDiskSynchronousFalse() {
createIndex("text");
+ cache.createRegionFactory(RegionShortcut.PARTITION_PERSISTENT)
+ .setDiskSynchronous(false)
+ .create(REGION_NAME);
+ verifyInternalRegions(region -> {
+ assertTrue(region.getDataPolicy().withPersistence());
+ assertTrue(region.isDiskSynchronous());
+ });
+ AsyncEventQueue queue = getIndexQueue();
+ assertEquals(false, queue.isDiskSynchronous());
+ assertEquals(true, queue.isPersistent());
+ }
+
+ @Test
+ public void shouldRecoverPersistentIndexWhenDataStillInQueue() throws ParseException, InterruptedException {
+ createIndex("field1", "field2");
+ Region dataRegion = cache.createRegionFactory(RegionShortcut.PARTITION_PERSISTENT)
+ .create(REGION_NAME);
+ //Pause the sender so that the entry stays in the queue
+ final AsyncEventQueueImpl queue = (AsyncEventQueueImpl) getIndexQueue();
+ queue.getSender().pause();
+
+ dataRegion.put("A", new TestObject());
+ cache.close();
+ createCache();
+ createIndex("field1", "field2");
+ dataRegion = cache.createRegionFactory(RegionShortcut.PARTITION_PERSISTENT)
+ .create(REGION_NAME);
+ LuceneQuery<Object, Object> query = luceneService.createLuceneQueryFactory()
+ .create(INDEX_NAME, REGION_NAME,
+ "field1:world");
+ Awaitility.await().atMost(60, TimeUnit.SECONDS).until(() -> {
+ assertEquals(1, query.search().size());
+ });
+ }
+
+ @Test
+ public void shouldRecoverPersistentIndexWhenDataIsWrittenToIndex() throws ParseException, InterruptedException {
+ createIndex("field1", "field2");
+ Region dataRegion = cache.createRegionFactory(RegionShortcut.PARTITION_PERSISTENT)
+ .create(REGION_NAME);
+ dataRegion.put("A", new TestObject());
+ final AsyncEventQueueImpl queue = (AsyncEventQueueImpl) getIndexQueue();
+
+ //Wait until the queue has drained
+ Awaitility.await().atMost(60, TimeUnit.SECONDS).until(() -> assertEquals(0, queue.size()));
+ cache.close();
+ createCache();
+ createIndex("text");
+ dataRegion = cache.createRegionFactory(RegionShortcut.PARTITION_PERSISTENT)
+ .create(REGION_NAME);
+ LuceneQuery<Object, Object> query = luceneService.createLuceneQueryFactory()
+ .create(INDEX_NAME, REGION_NAME,
+ "field1:world");
+ assertEquals(1, query.search().size());
+ }
+
+ @Test
+ public void shouldCreateInternalRegionsForIndex() {
+ createIndex("field1", "field2");
// Create partitioned region
createRegion();
verifyInternalRegions(region -> {
region.isInternalRegion();
+ assertNotNull(region.getAttributes().getPartitionAttributes().getColocatedWith());
cache.rootRegions().contains(region);
});
}
+ @Test
+ public void shouldUseFixedPartitionsForInternalRegions() {
+ createIndex("text");
+
+ PartitionAttributesFactory partitionAttributesFactory = new PartitionAttributesFactory<>();
+ final FixedPartitionAttributes fixedAttributes = FixedPartitionAttributes.createFixedPartition("A", true, 1);
+ partitionAttributesFactory.addFixedPartitionAttributes(fixedAttributes);
+ cache.createRegionFactory(RegionShortcut.PARTITION)
+ .setPartitionAttributes(partitionAttributesFactory.create())
+ .create(REGION_NAME);
+
+ verifyInternalRegions(region -> {
+ //Fixed partitioned regions don't allow you to specify the partitions on the colocated region
+ assertNull(region.getAttributes().getPartitionAttributes().getFixedPartitionAttributes());
+ assertTrue(((PartitionedRegion) region).isFixedPartitionedRegion());
+ });
+ }
+
+
private void verifyInternalRegions(Consumer<LocalRegion> verify) {
// Get index
LuceneIndexForPartitionedRegion index = (LuceneIndexForPartitionedRegion) luceneService.getIndex(INDEX_NAME, REGION_NAME);
@@ -152,21 +261,25 @@ public class LuceneIndexCreationIntegrationTest extends LuceneIntegrationTest {
LocalRegion fileRegion = (LocalRegion) cache.getRegion(index.createFileRegionName());
verify.accept(chunkRegion);
verify.accept(fileRegion);
+ }
+ private AsyncEventQueue getIndexQueue() {
+ String aeqId = LuceneServiceImpl.getUniqueIndexName(INDEX_NAME, REGION_NAME);
+ return cache.getAsyncEventQueue(aeqId);
}
private Region createRegion() {
return this.cache.createRegionFactory(RegionShortcut.PARTITION).create(REGION_NAME);
}
- private void createIndex(String fieldName) {
- LuceneServiceProvider.get(this.cache).createIndex(INDEX_NAME, REGION_NAME, fieldName);
+ private void createIndex(String ... fieldNames) {
+ LuceneServiceProvider.get(this.cache).createIndex(INDEX_NAME, REGION_NAME, fieldNames);
}
private static class TestObject implements Serializable {
- String field1 = "a b c d";
- String field2 = "f g h";
+ String field1 = "hello world";
+ String field2 = "this is a field";
}
private static class RecordingAnalyzer extends Analyzer {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIntegrationTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIntegrationTest.java
index 8c6f59e..67775d2 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIntegrationTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIntegrationTest.java
@@ -19,10 +19,15 @@
package com.gemstone.gemfire.cache.lucene;
+import java.io.File;
+
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.lucene.LuceneService;
import com.gemstone.gemfire.cache.lucene.LuceneServiceProvider;
+import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
+import com.gemstone.gemfire.internal.offheap.MemoryAllocatorImpl;
+import com.gemstone.gemfire.test.junit.rules.DiskDirRule;
import org.junit.After;
import org.junit.Before;
@@ -33,15 +38,15 @@ public class LuceneIntegrationTest {
protected Cache cache;
protected LuceneService luceneService;
-
@Rule
- public TestName name = new TestName();
+ public DiskDirRule diskDirRule = new DiskDirRule();
@After
public void tearDown() {
if(this.cache != null) {
this.cache.close();
}
+ MemoryAllocatorImpl.freeOffHeapMemory();
}
@Before
@@ -49,7 +54,12 @@ public class LuceneIntegrationTest {
CacheFactory cf = new CacheFactory();
cf.set("mcast-port", "0");
cf.set("locators", "");
+ cf.set("off-heap-memory-size", "100m");
this.cache = cf.create();
+ cache.createDiskStoreFactory()
+ .setDiskDirs(new File[] {diskDirRule.get()})
+ .setMaxOplogSize(1)
+ .create(GemFireCacheImpl.getDefaultDiskStoreName());
luceneService = LuceneServiceProvider.get(this.cache);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
index 984b221..e35de5e 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
@@ -32,6 +32,7 @@ import com.gemstone.gemfire.cache.DataPolicy;
import com.gemstone.gemfire.cache.ExpirationAttributes;
import com.gemstone.gemfire.cache.MembershipAttributes;
import com.gemstone.gemfire.cache.PartitionAttributes;
+import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.RegionAttributes;
import com.gemstone.gemfire.cache.RegionShortcut;
import com.gemstone.gemfire.cache.asyncqueue.internal.AsyncEventQueueFactoryImpl;
@@ -120,12 +121,16 @@ public class LuceneIndexForPartitionedRegionTest {
String name = "indexName";
String regionPath = "regionName";
Cache cache = Fakes.cache();
+ final Region region =Fakes.region(regionPath, cache);
+ RegionAttributes attributes = region.getAttributes();
+ when(attributes.getDataPolicy()).thenReturn(DataPolicy.PERSISTENT_PARTITION);
AsyncEventQueueFactoryImpl aeqFactory = mock(AsyncEventQueueFactoryImpl.class);
when(cache.createAsyncEventQueueFactory()).thenReturn(aeqFactory);
LuceneIndexForPartitionedRegion index = new LuceneIndexForPartitionedRegion(name, regionPath, cache);
- index.createAEQWithPersistence();
+ index.createAEQ(region);
+ verify(aeqFactory).setPersistent(eq(true));
verify(aeqFactory).create(any(), any());
}
@@ -134,21 +139,23 @@ public class LuceneIndexForPartitionedRegionTest {
String name = "indexName";
String regionPath = "regionName";
Cache cache = Fakes.cache();
+ final Region region =Fakes.region(regionPath, cache);
AsyncEventQueueFactoryImpl aeqFactory = mock(AsyncEventQueueFactoryImpl.class);
when(cache.createAsyncEventQueueFactory()).thenReturn(aeqFactory);
LuceneIndexForPartitionedRegion index = new LuceneIndexForPartitionedRegion(name, regionPath, cache);
- index.createAEQ();
+ index.createAEQ(region);
+ verify(aeqFactory, never()).setPersistent(eq(true));
verify(aeqFactory).create(any(), any());
}
- private void initializeScenario(final boolean withPersistence, final String regionPath, final Cache cache) {
+ private Region initializeScenario(final boolean withPersistence, final String regionPath, final Cache cache) {
int defaultLocalMemory = 100;
- initializeScenario(withPersistence, regionPath, cache, defaultLocalMemory);
+ return initializeScenario(withPersistence, regionPath, cache, defaultLocalMemory);
}
- private void initializeScenario(final boolean withPersistence, final String regionPath, final Cache cache, int localMaxMemory) {
+ private Region initializeScenario(final boolean withPersistence, final String regionPath, final Cache cache, int localMaxMemory) {
PartitionedRegion region = mock(PartitionedRegion.class);
RegionAttributes regionAttributes = mock(RegionAttributes.class);
PartitionAttributes partitionAttributes = mock(PartitionAttributes.class);
@@ -162,6 +169,8 @@ public class LuceneIndexForPartitionedRegionTest {
when(partitionAttributes.getTotalNumBuckets()).thenReturn(113);
when(dataPolicy.withPersistence()).thenReturn(withPersistence);
when(region.getExtensionPoint()).thenReturn(extensionPoint);
+
+ return region;
}
private PartitionAttributes initializeAttributes(final Cache cache) {
@@ -192,41 +201,22 @@ public class LuceneIndexForPartitionedRegionTest {
}
@Test
- public void initializeWithPersistenceShouldCreateAEQWithPersistence() {
- boolean withPersistence = true;
- String name = "indexName";
- String regionPath = "regionName";
- Cache cache = Fakes.cache();
- initializeScenario(withPersistence, regionPath, cache);
-
- LuceneIndexForPartitionedRegion index = new LuceneIndexForPartitionedRegion(name, regionPath, cache);
- index.setSearchableFields(new String[]{"field"});
- LuceneIndexForPartitionedRegion spy = spy(index);
- doReturn(null).when(spy).createFileRegion(any(), any(), any());
- doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQWithPersistence();
- spy.initialize();
-
- verify(spy).createAEQWithPersistence();
- }
-
- @Test
public void initializeWithoutPersistenceShouldCreateAEQ() {
boolean withPersistence = false;
String name = "indexName";
String regionPath = "regionName";
Cache cache = Fakes.cache();
- initializeScenario(withPersistence, regionPath, cache);
+ Region region = initializeScenario(withPersistence, regionPath, cache);
LuceneIndexForPartitionedRegion index = new LuceneIndexForPartitionedRegion(name, regionPath, cache);
index.setSearchableFields(new String[]{"field"});
LuceneIndexForPartitionedRegion spy = spy(index);
doReturn(null).when(spy).createFileRegion(any(), any(), any());
doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQ();
+ doReturn(null).when(spy).createAEQ(eq(region));
spy.initialize();
- verify(spy).createAEQ();
+ verify(spy).createAEQ(eq(region));
}
@Test
@@ -235,14 +225,14 @@ public class LuceneIndexForPartitionedRegionTest {
String name = "indexName";
String regionPath = "regionName";
Cache cache = Fakes.cache();
- initializeScenario(withPersistence, regionPath, cache);
+ Region region = initializeScenario(withPersistence, regionPath, cache);
LuceneIndexForPartitionedRegion index = new LuceneIndexForPartitionedRegion(name, regionPath, cache);
index.setSearchableFields(new String[]{"field"});
LuceneIndexForPartitionedRegion spy = spy(index);
doReturn(null).when(spy).createFileRegion(any(), any(), any());
doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQ();
+ doReturn(null).when(spy).createAEQ(eq(region));
spy.initialize();
verify(spy).createChunkRegion(eq(RegionShortcut.PARTITION), eq(index.createFileRegionName()), any(), eq(index.createChunkRegionName()));
@@ -254,14 +244,14 @@ public class LuceneIndexForPartitionedRegionTest {
String name = "indexName";
String regionPath = "regionName";
Cache cache = Fakes.cache();
- initializeScenario(withPersistence, regionPath, cache);
+ Region region = initializeScenario(withPersistence, regionPath, cache);
LuceneIndexForPartitionedRegion index = new LuceneIndexForPartitionedRegion(name, regionPath, cache);
index.setSearchableFields(new String[]{"field"});
LuceneIndexForPartitionedRegion spy = spy(index);
doReturn(null).when(spy).createFileRegion(any(), any(), any());
doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQ();
+ doReturn(null).when(spy).createAEQ(eq(region));
spy.initialize();
verify(spy).createFileRegion(eq(RegionShortcut.PARTITION), eq(index.createFileRegionName()), any());
@@ -309,7 +299,7 @@ public class LuceneIndexForPartitionedRegionTest {
LuceneIndexForPartitionedRegion spy = spy(index);
doReturn(null).when(spy).createFileRegion(any(), any(), any());
doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQWithPersistence();
+ doReturn(null).when(spy).createAEQ(any());
spy.initialize();
verify(spy).createChunkRegion(eq(RegionShortcut.PARTITION_PERSISTENT), eq(index.createFileRegionName()), any(), eq(index.createChunkRegionName()));
@@ -328,7 +318,7 @@ public class LuceneIndexForPartitionedRegionTest {
LuceneIndexForPartitionedRegion spy = spy(index);
doReturn(null).when(spy).createFileRegion(any(), any(), any());
doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQWithPersistence();
+ doReturn(null).when(spy).createAEQ(any());
spy.initialize();
verify(spy).createFileRegion(eq(RegionShortcut.PARTITION_PERSISTENT), eq(index.createFileRegionName()), any());
@@ -347,7 +337,7 @@ public class LuceneIndexForPartitionedRegionTest {
LuceneIndexForPartitionedRegion spy = spy(index);
doReturn(null).when(spy).createFileRegion(any(), any(), any());
doReturn(null).when(spy).createChunkRegion(any(), any(), any(), any());
- doReturn(null).when(spy).createAEQWithPersistence();
+ doReturn(null).when(spy).createAEQ(any());
spy.initialize();
spy.initialize();
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7908467a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImplJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImplJUnitTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImplJUnitTest.java
index 0614e62..975b92f 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImplJUnitTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImplJUnitTest.java
@@ -19,21 +19,30 @@
package com.gemstone.gemfire.cache.lucene.internal;
import static org.junit.Assert.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.lucene.LuceneQuery;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
@Category(UnitTest.class)
public class LuceneQueryFactoryImplJUnitTest {
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
@Test
- public void test() {
- Cache cache = Mockito.mock(Cache.class);
+ public void shouldCreateQueryWithCorrectAttributes() {
+ Cache cache = mock(Cache.class);
+ Region region = mock(Region.class);
+ when(cache.getRegion(any())).thenReturn(region);
LuceneQueryFactoryImpl f = new LuceneQueryFactoryImpl(cache);
f.setPageSize(5);
f.setResultLimit(25);
@@ -47,4 +56,12 @@ public class LuceneQueryFactoryImplJUnitTest {
Mockito.verify(cache).getRegion(Mockito.eq("region"));
}
+ @Test
+ public void shouldThrowIllegalArgumentWhenRegionIsMissing() {
+ Cache cache = mock(Cache.class);
+ LuceneQueryFactoryImpl f = new LuceneQueryFactoryImpl(cache);
+ thrown.expect(IllegalArgumentException.class);
+ LuceneQuery<Object, Object> query = f.create("index", "region", new StringQueryProvider("test"));
+ }
+
}