SGF-372 - Add GemFire Off-Heap support.

This commit is contained in:
John Blum
2016-04-24 15:48:31 -07:00
parent 4479e5a1a5
commit fd41003805
10 changed files with 53 additions and 25 deletions

View File

@@ -284,6 +284,7 @@ public abstract class RegionFactoryBean<K, V> extends RegionLookupFactoryBean<K,
regionFactory.setLockGrantor(regionAttributes.isLockGrantor());
regionFactory.setMembershipAttributes(regionAttributes.getMembershipAttributes());
regionFactory.setMulticastEnabled(regionAttributes.getMulticastEnabled());
regionFactory.setOffHeap(regionAttributes.getOffHeap());
mergePartitionAttributes(regionFactory, regionAttributes);
regionFactory.setPoolName(regionAttributes.getPoolName());
regionFactory.setRegionIdleTimeout(regionAttributes.getRegionIdleTimeout());

View File

@@ -325,6 +325,7 @@ abstract class ParsingUtils {
setPropertyValue(element, regionAttributesBuilder, "key-constraint");
setPropertyValue(element, regionAttributesBuilder, "load-factor");
setPropertyValue(element, regionAttributesBuilder, "multicast-enabled");
setPropertyValue(element, regionAttributesBuilder, "off-heap");
setPropertyValue(element, regionAttributesBuilder, "publisher");
setPropertyValue(element, regionAttributesBuilder, "value-constraint");

View File

@@ -875,15 +875,6 @@ for the "same" Region (by name), then this can cause confusion or have unexpecte
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="ignore-jta" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation><![CDATA[
Indicates whether operations on this Region participates in active JTA transactions or ignores them and operates
outside of transactions. This is primarily used in cache loaders, writers, and listeners that need to perform
non-transactional operations on a Region, such as caching a result set. GemFire default is false.
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="initial-capacity" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation><![CDATA[
@@ -1080,6 +1071,15 @@ Specifies if WAN Gateway hub id if enable-gateway is true. (Deprecated since Gem
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="ignore-jta" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation><![CDATA[
Indicates whether operations on this Region participates in active JTA transactions or ignores them and operates
outside of transactions. This is primarily used in cache loaders, writers, and listeners that need to perform
non-transactional operations on a Region, such as caching a result set. GemFire default is false.
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="index-update-type" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation><![CDATA[
@@ -1088,6 +1088,15 @@ in a background thread. GemFire default is synchronous.
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="off-heap" type="xsd:string" use="optional" default="false">
<xsd:annotation>
<xsd:documentation><![CDATA[
Specifies that the region uses off-heap memory to store entry values, including values for region entries
and queue entries. The region will still use heap memory for everything else, such as entry keys
and the ConcurrentHashMap. GemFire default is false.
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

View File

@@ -24,12 +24,16 @@ import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyFloat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -167,6 +171,7 @@ public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest {
protected RegionFactory<?, ?> createTestRegionFactory() {
return new TestRegionFactory();
}
@Test
public void testAssertDataPolicyAndPersistentAttributesAreCompatible() {
RegionFactoryBean<?, ?> factoryBean = new TestRegionFactoryBean<Object, Object>();
@@ -368,6 +373,7 @@ public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest {
when(mockRegionAttributes.isLockGrantor()).thenReturn(true);
when(mockRegionAttributes.getMembershipAttributes()).thenReturn(testMembershipAttributes);
when(mockRegionAttributes.getMulticastEnabled()).thenReturn(false);
when(mockRegionAttributes.getOffHeap()).thenReturn(true);
when(mockRegionAttributes.getPartitionAttributes()).thenReturn(testPartitionAttributes);
when(mockRegionAttributes.getPoolName()).thenReturn("swimming");
when(mockRegionAttributes.getRegionIdleTimeout()).thenReturn(testExpirationAttributes);
@@ -406,6 +412,7 @@ public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest {
verify(mockRegionFactory).setLockGrantor(eq(true));
verify(mockRegionFactory).setMembershipAttributes(same(testMembershipAttributes));
verify(mockRegionFactory).setMulticastEnabled(eq(false));
verify(mockRegionFactory).setOffHeap(eq(true));
verify(mockRegionFactory).setPartitionAttributes(eq(testPartitionAttributes));
verify(mockRegionFactory).setPoolName(eq("swimming"));
verify(mockRegionFactory).setRegionIdleTimeout(same(testExpirationAttributes));
@@ -420,30 +427,31 @@ public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest {
factoryBean.mergeRegionAttributes(mockRegionFactory, null);
verify(mockRegionFactory, never()).setCloningEnabled(false);
verify(mockRegionFactory, never()).setConcurrencyChecksEnabled(true);
verify(mockRegionFactory, never()).setConcurrencyLevel(2);
verify(mockRegionFactory, never()).setCloningEnabled(anyBoolean());
verify(mockRegionFactory, never()).setConcurrencyChecksEnabled(anyBoolean());
verify(mockRegionFactory, never()).setConcurrencyLevel(anyInt());
verify(mockRegionFactory, never()).setCustomEntryIdleTimeout(any(CustomExpiry.class));
verify(mockRegionFactory, never()).setCustomEntryTimeToLive(any(CustomExpiry.class));
verify(mockRegionFactory, never()).setDiskSynchronous(true);
verify(mockRegionFactory, never()).setEnableAsyncConflation(true);
verify(mockRegionFactory, never()).setEnableSubscriptionConflation(false);
verify(mockRegionFactory, never()).setDiskSynchronous(anyBoolean());
verify(mockRegionFactory, never()).setEnableAsyncConflation(anyBoolean());
verify(mockRegionFactory, never()).setEnableSubscriptionConflation(anyBoolean());
verify(mockRegionFactory, never()).setEntryIdleTimeout(any(ExpirationAttributes.class));
verify(mockRegionFactory, never()).setEntryTimeToLive(any(ExpirationAttributes.class));
verify(mockRegionFactory, never()).setEvictionAttributes(any(EvictionAttributes.class));
verify(mockRegionFactory, never()).setIgnoreJTA(false);
verify(mockRegionFactory, never()).setIndexMaintenanceSynchronous(false);
verify(mockRegionFactory, never()).setInitialCapacity(51);
verify(mockRegionFactory, never()).setIgnoreJTA(anyBoolean());
verify(mockRegionFactory, never()).setIndexMaintenanceSynchronous(anyBoolean());
verify(mockRegionFactory, never()).setInitialCapacity(anyInt());
verify(mockRegionFactory, never()).setKeyConstraint(any(Class.class));
verify(mockRegionFactory, never()).setLoadFactor(0.75f);
verify(mockRegionFactory, never()).setLockGrantor(true);
verify(mockRegionFactory, never()).setLoadFactor(anyFloat());
verify(mockRegionFactory, never()).setLockGrantor(anyBoolean());
verify(mockRegionFactory, never()).setMembershipAttributes(any(MembershipAttributes.class));
verify(mockRegionFactory, never()).setMulticastEnabled(false);
verify(mockRegionFactory, never()).setMulticastEnabled(anyBoolean());
verify(mockRegionFactory, never()).setOffHeap(anyBoolean());
verify(mockRegionFactory, never()).setPartitionAttributes(any(PartitionAttributes.class));
verify(mockRegionFactory, never()).setPoolName(any(String.class));
verify(mockRegionFactory, never()).setRegionIdleTimeout(any(ExpirationAttributes.class));
verify(mockRegionFactory, never()).setRegionTimeToLive(any(ExpirationAttributes.class));
verify(mockRegionFactory, never()).setStatisticsEnabled(true);
verify(mockRegionFactory, never()).setStatisticsEnabled(anyBoolean());
verify(mockRegionFactory, never()).setSubscriptionAttributes(any(SubscriptionAttributes.class));
verify(mockRegionFactory, never()).setValueConstraint(any(Class.class));
}
@@ -474,6 +482,7 @@ public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest {
when(mockRegionAttributes.isLockGrantor()).thenReturn(false);
when(mockRegionAttributes.getMembershipAttributes()).thenReturn(null);
when(mockRegionAttributes.getMulticastEnabled()).thenReturn(true);
when(mockRegionAttributes.getOffHeap()).thenReturn(true);
when(mockRegionAttributes.getPartitionAttributes()).thenReturn(null);
when(mockRegionAttributes.getPoolName()).thenReturn("swimming");
when(mockRegionAttributes.getRegionIdleTimeout()).thenReturn(testExpirationAttributes);
@@ -512,6 +521,7 @@ public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest {
verify(mockRegionFactory).setLockGrantor(eq(false));
verify(mockRegionFactory).setMembershipAttributes(null);
verify(mockRegionFactory).setMulticastEnabled(eq(true));
verify(mockRegionFactory).setOffHeap(eq(true));
verify(mockRegionFactory, never()).setPartitionAttributes(any(PartitionAttributes.class));
verify(mockRegionFactory).setPoolName(eq("swimming"));
verify(mockRegionFactory).setRegionIdleTimeout(same(testExpirationAttributes));

View File

@@ -133,6 +133,7 @@ public class LocalRegionNamespaceTest {
assertEquals(10, localRegionAttributes.getInitialCapacity());
assertEquals(String.class, localRegionAttributes.getKeyConstraint());
assertEquals("0.9", String.valueOf(localRegionAttributes.getLoadFactor()));
assertTrue(localRegionAttributes.getOffHeap());
assertEquals(String.class, localRegionAttributes.getValueConstraint());
}

View File

@@ -19,6 +19,7 @@ package org.springframework.data.gemfire.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
@@ -88,12 +89,13 @@ public class PartitionedRegionNamespaceTest {
RegionFactoryBean optionsRegionFactoryBean = context.getBean("&options", RegionFactoryBean.class);
assertTrue(optionsRegionFactoryBean instanceof PartitionedRegionFactoryBean);
assertEquals(null, TestUtils.readField("scope", optionsRegionFactoryBean));
assertEquals("redundant", TestUtils.readField("name", optionsRegionFactoryBean));
assertNull(TestUtils.readField("scope", optionsRegionFactoryBean));
RegionAttributes optionsRegionAttributes = TestUtils.readField("attributes", optionsRegionFactoryBean);
assertNotNull(optionsRegionAttributes);
assertTrue(optionsRegionAttributes.getOffHeap());
assertTrue(optionsRegionAttributes.getStatisticsEnabled());
PartitionAttributes optionsRegionPartitionAttributes = optionsRegionAttributes.getPartitionAttributes();

View File

@@ -143,6 +143,7 @@ public class ReplicatedRegionNamespaceTest {
assertEquals(0.50, regionAttributes.getLoadFactor(), 0.001);
assertTrue(regionAttributes.isLockGrantor());
assertTrue(regionAttributes.getMulticastEnabled());
assertTrue(regionAttributes.getOffHeap());
assertEquals(Scope.GLOBAL, regionAttributes.getScope());
assertEquals(String.class, regionAttributes.getValueConstraint());
}

View File

@@ -41,6 +41,7 @@
initial-capacity="10"
key-constraint="java.lang.String"
load-factor="0.90"
off-heap="true"
value-constraint="java.lang.String"
/>

View File

@@ -20,6 +20,7 @@
<util:properties id="props">
<prop key="copies">1</prop>
<prop key="off-heap">true</prop>
<prop key="totalBuckets">4</prop>
</util:properties>
@@ -29,8 +30,8 @@
<gfe:partitioned-region id="simple"/>
<gfe:partitioned-region id="options" name="redundant" copies="${copies}" statistics="true" total-buckets="${totalBuckets}"
close="true" destroy="false">
<gfe:partitioned-region id="options" name="redundant" copies="${copies}" off-heap="${off-heap}" statistics="true"
total-buckets="${totalBuckets}" close="true" destroy="false">
<gfe:partition-resolver>
<bean class="org.springframework.data.gemfire.SimplePartitionResolver"/>
</gfe:partition-resolver>

View File

@@ -50,6 +50,7 @@
key-constraint="java.lang.String"
load-factor="0.5"
multicast-enabled="true"
off-heap="true"
scope="global"
value-constraint="java.lang.String"/>