SGF-384 - Issue with partitioned-region-template when persistence is enabled.

This commit is contained in:
John Blum
2015-03-18 17:53:09 -07:00
parent e514b004d8
commit e9251afa1d
10 changed files with 321 additions and 55 deletions

View File

@@ -0,0 +1,112 @@
/*
* Copyright 2010-2013 the original author or authors.
*
* Licensed 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.springframework.data.gemfire.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import javax.annotation.Resource;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer;
import org.springframework.data.gemfire.test.support.FileSystemUtils;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.gemstone.gemfire.cache.DataPolicy;
import com.gemstone.gemfire.cache.DiskStore;
import com.gemstone.gemfire.cache.EntryOperation;
import com.gemstone.gemfire.cache.EvictionAction;
import com.gemstone.gemfire.cache.EvictionAlgorithm;
import com.gemstone.gemfire.cache.PartitionResolver;
import com.gemstone.gemfire.cache.Region;
/**
* The PersistentPartitionRegionTemplateTest class is a test suite of test cases testing the functionality of
* Spring Data GemFire's Region templates with a 'persistent', PARTITION Region configuration.
*
* @author John Blum
* @see org.junit.Test
* @see org.springframework.data.gemfire.PartitionedRegionFactoryBean
* @see com.gemstone.gemfire.cache.Region
* @link https://jira.spring.io/browse/SGF-384
* @since 1.6.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = GemfireTestApplicationContextInitializer.class)
@SuppressWarnings("unused")
public class TemplatePersistentPartitionRegionNamespaceTest {
@Autowired
private DiskStore exampleDataStore;
@Resource(name = "Example")
private Region<?, ?> example;
@After
public void tearDown() {
for (File diskDirectory : exampleDataStore.getDiskDirs()) {
FileSystemUtils.deleteRecursive(FileSystemUtils.getRootRelativeToWorkingDirectoryOrPath(
diskDirectory.getAbsoluteFile()));
}
}
@Test
public void testExampleTemplatedPersistentPartitionRegion() {
assertNotNull("The '/Example' PARTITION Region was not properly configured and initialized!", example);
assertEquals("Example", example.getName());
assertEquals("/Example", example.getFullPath());
assertNotNull(example.getAttributes());
assertEquals(DataPolicy.PERSISTENT_PARTITION, example.getAttributes().getDataPolicy());
assertNotNull(example.getAttributes().getEvictionAttributes());
assertEquals(EvictionAlgorithm.LRU_HEAP, example.getAttributes().getEvictionAttributes().getAlgorithm());
assertEquals(EvictionAction.OVERFLOW_TO_DISK, example.getAttributes().getEvictionAttributes().getAction());
assertNotNull(example.getAttributes().getPartitionAttributes());
assertEquals(1, example.getAttributes().getPartitionAttributes().getRedundantCopies());
assertEquals(163, example.getAttributes().getPartitionAttributes().getTotalNumBuckets());
assertNotNull(example.getAttributes().getPartitionAttributes().getPartitionResolver());
assertEquals("TestPartitionResolver", example.getAttributes().getPartitionAttributes().getPartitionResolver().getName());
}
public static final class TestPartitionResolver<K, V> implements PartitionResolver<K, V> {
private String name;
@Override
public Object getRoutingObject(final EntryOperation<K, V> kvEntryOperation) {
throw new UnsupportedOperationException("Not Implemented!");
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void close() {
}
}
}

View File

@@ -101,6 +101,9 @@ public class TemplateRegionsNamespaceTests {
@Resource(name = "/TemplateBasedReplicateRegion/TemplateBasedReplicateSubRegion")
private Region<Integer, String> templateBasedReplicateSubRegion;
@Resource(name = "TemplateBasedReplicateRegionNoOverrides")
private Region<String, Object> templateBasedReplicateRegionNoOverrides;
@Resource(name = "TemplateBasedPartitionRegion")
private Region<Date, Object> templateBasedPartitionRegion;
@@ -234,7 +237,7 @@ public class TemplateRegionsNamespaceTests {
protected void assertDefaultRegionAttributes(final Region region) {
assertNotNull("The Region must not be null!", region);
assertNotNull(String.format("The Region (%1$s) must have 'RegionAttributes' defined!",
assertNotNull(String.format("Region (%1$s) must have 'RegionAttributes' defined!",
region.getFullPath()), region.getAttributes());
assertNull(region.getAttributes().getCompressor());
assertNull(region.getAttributes().getCustomEntryIdleTimeout());
@@ -250,7 +253,7 @@ public class TemplateRegionsNamespaceTests {
protected void assertDefaultSubscriptionAttributes(final SubscriptionAttributes subscriptionAttributes) {
assumeNotNull(subscriptionAttributes);
assertSubscriptionAttributes(subscriptionAttributes, InterestPolicy.CACHE_CONTENT);
assertSubscriptionAttributes(subscriptionAttributes, InterestPolicy.DEFAULT);
}
protected void assertSubscriptionAttributes(final SubscriptionAttributes subscriptionAttributes,
@@ -318,7 +321,7 @@ public class TemplateRegionsNamespaceTests {
assertEmpty(nonTemplateBasedReplicateRegion.getAttributes().getAsyncEventQueueIds());
assertEmpty(nonTemplateBasedReplicateRegion.getAttributes().getCacheListeners());
assertCacheLoader(nonTemplateBasedReplicateRegion, "ABC");
assertNull(nonTemplateBasedReplicateRegion.getAttributes().getCacheWriter());
assertCacheWriter(nonTemplateBasedReplicateRegion, "DEF");
assertFalse(nonTemplateBasedReplicateRegion.getAttributes().getCloningEnabled());
assertTrue(nonTemplateBasedReplicateRegion.getAttributes().getConcurrencyChecksEnabled());
assertEquals(12, nonTemplateBasedReplicateRegion.getAttributes().getConcurrencyLevel());
@@ -351,9 +354,9 @@ public class TemplateRegionsNamespaceTests {
assertEmpty(templateBasedReplicateRegion.getAttributes().getAsyncEventQueueIds());
assertCacheListeners(templateBasedReplicateRegion, "XYZ");
assertCacheLoader(templateBasedReplicateRegion, "dbLoader");
assertNull(templateBasedReplicateRegion.getAttributes().getCacheWriter());
assertCacheWriter(templateBasedReplicateRegion, "dbWriter");
assertTrue(templateBasedReplicateRegion.getAttributes().getCloningEnabled());
assertFalse(templateBasedReplicateRegion.getAttributes().getConcurrencyChecksEnabled());
assertTrue(templateBasedReplicateRegion.getAttributes().getConcurrencyChecksEnabled());
assertEquals(24, templateBasedReplicateRegion.getAttributes().getConcurrencyLevel());
assertEquals(DataPolicy.REPLICATE, templateBasedReplicateRegion.getAttributes().getDataPolicy());
assertFalse(templateBasedReplicateRegion.getAttributes().isDiskSynchronous());
@@ -386,7 +389,7 @@ public class TemplateRegionsNamespaceTests {
assertRegionMetaData(templateBasedReplicateSubRegion, "TemplateBasedReplicateSubRegion",
"/TemplateBasedReplicateRegion/TemplateBasedReplicateSubRegion");
assertDefaultRegionAttributes(templateBasedReplicateSubRegion);
assertAsyncEventQueues(templateBasedReplicateSubRegion, "TestAsyncEventQueue");
assertEmpty(templateBasedReplicateSubRegion.getAttributes().getAsyncEventQueueIds());
assertCacheListeners(templateBasedReplicateSubRegion, "testListener");
assertCacheLoader(templateBasedReplicateSubRegion, "A");
assertCacheWriter(templateBasedReplicateSubRegion, "B");
@@ -402,7 +405,7 @@ public class TemplateRegionsNamespaceTests {
ExpirationAction.DESTROY, 600);
assertExpirationAttributes(templateBasedReplicateSubRegion.getAttributes().getEntryTimeToLive(),
ExpirationAction.DESTROY, 600);
assertGatewaySenders(templateBasedReplicateSubRegion, "TestGatewaySender");
assertEmpty(templateBasedReplicateSubRegion.getAttributes().getGatewaySenderIds());
assertTrue(templateBasedReplicateSubRegion.getAttributes().getIgnoreJTA());
assertFalse(templateBasedReplicateSubRegion.getAttributes().getIndexMaintenanceSynchronous());
assertEquals(51, templateBasedReplicateSubRegion.getAttributes().getInitialCapacity());
@@ -418,6 +421,43 @@ public class TemplateRegionsNamespaceTests {
assertEquals(String.class, templateBasedReplicateSubRegion.getAttributes().getValueConstraint());
}
@Test
public void testTemplateBasedReplicateRegionNoOverrides() {
assertRegionMetaData(templateBasedReplicateRegionNoOverrides, "TemplateBasedReplicateRegionNoOverrides");
assertDefaultRegionAttributes(templateBasedReplicateRegionNoOverrides);
assertEmpty(templateBasedReplicateRegionNoOverrides.getAttributes().getAsyncEventQueueIds());
assertCacheListeners(templateBasedReplicateRegionNoOverrides, "XYZ");
assertNull(templateBasedReplicateRegionNoOverrides.getAttributes().getCacheLoader());
assertNull(templateBasedReplicateRegionNoOverrides.getAttributes().getCacheWriter());
assertTrue(templateBasedReplicateRegionNoOverrides.getAttributes().getCloningEnabled());
assertTrue(templateBasedReplicateRegionNoOverrides.getAttributes().getConcurrencyChecksEnabled());
assertEquals(24, templateBasedReplicateRegionNoOverrides.getAttributes().getConcurrencyLevel());
assertEquals(DataPolicy.PERSISTENT_REPLICATE, templateBasedReplicateRegionNoOverrides.getAttributes().getDataPolicy());
assertFalse(templateBasedReplicateRegionNoOverrides.getAttributes().isDiskSynchronous());
assertFalse(templateBasedReplicateRegionNoOverrides.getAttributes().getEnableAsyncConflation());
assertTrue(templateBasedReplicateRegionNoOverrides.getAttributes().getEnableSubscriptionConflation());
assertEvictionAttributes(templateBasedReplicateRegionNoOverrides.getAttributes().getEvictionAttributes(),
EvictionAction.OVERFLOW_TO_DISK, EvictionAlgorithm.LRU_ENTRY, 2024, null);
assertExpirationAttributes(templateBasedReplicateRegionNoOverrides.getAttributes().getEntryIdleTimeout(),
ExpirationAction.DESTROY, 600);
assertExpirationAttributes(templateBasedReplicateRegionNoOverrides.getAttributes().getEntryTimeToLive(),
ExpirationAction.INVALIDATE, 300);
assertEmpty(templateBasedReplicateRegionNoOverrides.getAttributes().getGatewaySenderIds());
assertTrue(templateBasedReplicateRegionNoOverrides.getAttributes().getIgnoreJTA());
assertTrue(templateBasedReplicateRegionNoOverrides.getAttributes().getIndexMaintenanceSynchronous());
assertEquals(51, templateBasedReplicateRegionNoOverrides.getAttributes().getInitialCapacity());
assertEquals(String.class, templateBasedReplicateRegionNoOverrides.getAttributes().getKeyConstraint());
assertEquals(0.85f, templateBasedReplicateRegionNoOverrides.getAttributes().getLoadFactor(), 0.0f);
assertFalse(templateBasedReplicateRegionNoOverrides.getAttributes().isLockGrantor());
assertDefaultMembershipAttributes(templateBasedReplicateRegionNoOverrides.getAttributes().getMembershipAttributes());
assertNull(templateBasedReplicateRegionNoOverrides.getAttributes().getPartitionAttributes());
assertEquals(Scope.DISTRIBUTED_ACK, templateBasedReplicateRegionNoOverrides.getAttributes().getScope());
assertTrue(templateBasedReplicateRegionNoOverrides.getAttributes().getStatisticsEnabled());
assertSubscriptionAttributes(templateBasedReplicateRegionNoOverrides.getAttributes().getSubscriptionAttributes(),
InterestPolicy.CACHE_CONTENT);
assertEquals(Object.class, templateBasedReplicateRegionNoOverrides.getAttributes().getValueConstraint());
}
@Test
public void testTemplateBasedPartitionRegion() {
assertRegionMetaData(templateBasedPartitionRegion, "TemplateBasedPartitionRegion");

View File

@@ -30,18 +30,44 @@ import com.gemstone.gemfire.management.internal.cli.util.spring.Assert;
*
* @author John Blum
* @see java.io.File
* @see java.io.FileFilter
* @see org.springframework.data.gemfire.test.support.FileUtils
* @see org.springframework.data.gemfire.test.support.IOUtils
* @since 1.5.0
*/
@SuppressWarnings("unused")
public abstract class FileSystemUtils extends IOUtils {
public abstract class FileSystemUtils extends FileUtils {
public static final File JAVA_HOME = new File(System.getProperty("java.home"));
public static final File USER_HOME = new File(System.getProperty("user.home"));
public static final File WORKING_DIRECTORY = new File(System.getProperty("user.dir"));
public static boolean deleteRecursive(final File path) {
assert path != null;
boolean success = true;
if (path.isDirectory()) {
for (File file : safeListFiles(path)) {
success &= deleteRecursive(file);
}
}
return (path.delete() && success);
}
public static File getRootRelativeToWorkingDirectoryOrPath(final File path) {
File localPath = path;
if (isDirectory(localPath)) {
while (localPath != null && !WORKING_DIRECTORY.equals(localPath.getParentFile())) {
localPath = localPath.getParentFile();
}
}
return (localPath != null ? localPath : path);
}
public static File[] listFiles(final File directory, final FileFilter fileFilter) {
Assert.isTrue(directory != null && directory.isDirectory(), String.format(
"The File (%1$s) does not refer to a valid directory!", directory));
@@ -60,9 +86,23 @@ public abstract class FileSystemUtils extends IOUtils {
return results.toArray(new File[results.size()]);
}
private static File[] safeListFiles(final File directory) {
return safeListFiles(directory, AllFiles.INSTANCE);
}
private static File[] safeListFiles(final File directory, final FileFilter fileFilter) {
File[] files = (directory != null ? directory.listFiles(fileFilter) : new File[0]);
return (files != null ? files : new File[0]);
}
public static final class AllFiles implements FileFilter {
public static final AllFiles INSTANCE = new AllFiles();
@Override
public boolean accept(final File pathname) {
return true;
}
}
}

View File

@@ -32,6 +32,8 @@ import com.gemstone.gemfire.management.internal.cli.util.spring.StringUtils;
*
* @author John Blum
* @see java.io.File
* @see java.io.FileReader
* @see java.io.FileWriter
* @see org.springframework.data.gemfire.test.support.IOUtils
* @since 1.5.0
*/
@@ -40,7 +42,15 @@ public abstract class FileUtils extends IOUtils {
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
// TODO refactor and perhaps replace with org.springframework.util.FileCopytUtils.copyToString(:Reader)
public static boolean isDirectory(final File path) {
return (path != null && path.isDirectory());
}
public static boolean isFile(final File path) {
return (path != null && path.isFile());
}
// TODO refactor and perhaps replace with org.springframework.util.FileCopyUtils.copyToString(:Reader)
public static String read(final File file) throws IOException {
Assert.isTrue(file != null && file.isFile(), String.format(
"The File reference (%1$s) from which to read the contents is not a valid file!", file));
@@ -64,7 +74,7 @@ public abstract class FileUtils extends IOUtils {
}
}
// TODO refactor and perhaps replace with org.springframework.util.FileCopytUtils.copy(:String, :Writer)
// TODO refactor and perhaps replace with org.springframework.util.FileCopyUtils.copy(:String, :Writer)
public static void write(final File file, final String contents) throws IOException {
Assert.notNull(file, "The File to write to must not be null!");
Assert.isTrue(StringUtils.hasText(contents), "The 'contents' of the file cannot be null or empty!");