SGF-372 - Add GemFire Off-Heap support.
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
initial-capacity="10"
|
||||
key-constraint="java.lang.String"
|
||||
load-factor="0.90"
|
||||
off-heap="true"
|
||||
value-constraint="java.lang.String"
|
||||
/>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user