Completed Client Cache Region Template testing for JIRA feature requests SGF-207 and SGF-254 adding support for template-defined Regions. In addition, fixed JIRA bug SGF-310 pertaining to the missing 'concurrency-level' attribute on the <gfe:client-region> element in the SDG XSD as well as SGF-311 involving the ClientRegionFactoryBean not properly setting the 'concurrencyChecksEnabled' property on GemFire's ClientRegionFactory class.

This commit is contained in:
John Blum
2014-08-27 02:18:17 -07:00
committed by John Blum
parent 02fd3ce44e
commit 4bff3d9f7a
5 changed files with 336 additions and 19 deletions

View File

@@ -106,6 +106,7 @@ public class ClientRegionFactoryBean<K, V> extends RegionLookupFactoryBean<K, V>
if (attributes != null) {
factory.setCloningEnabled(attributes.getCloningEnabled());
factory.setCompressor(attributes.getCompressor());
factory.setConcurrencyChecksEnabled(attributes.getConcurrencyChecksEnabled());
factory.setConcurrencyLevel(attributes.getConcurrencyLevel());
factory.setCustomEntryIdleTimeout(attributes.getCustomEntryIdleTimeout());
factory.setCustomEntryTimeToLive(attributes.getCustomEntryTimeToLive());

View File

@@ -46,7 +46,7 @@ class ClientRegionParser extends AbstractRegionParser {
}
@Override
protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder,
protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder regionBuilder,
boolean subRegion) {
validateDataPolicyShortcutAttributesMutualExclusion(element, parserContext);
@@ -54,31 +54,33 @@ class ClientRegionParser extends AbstractRegionParser {
String resolvedCacheRef = ParsingUtils.resolveCacheReference(element.getAttribute("cache-ref"));
if (!subRegion) {
builder.addPropertyReference("cache", resolvedCacheRef);
ParsingUtils.setPropertyValue(element, builder, "close");
ParsingUtils.setPropertyValue(element, builder, "destroy");
regionBuilder.addPropertyReference("cache", resolvedCacheRef);
ParsingUtils.setPropertyValue(element, regionBuilder, "close");
ParsingUtils.setPropertyValue(element, regionBuilder, "destroy");
}
ParsingUtils.setPropertyValue(element, builder, "name");
ParsingUtils.setPropertyValue(element, builder, "data-policy", "dataPolicyName");
ParsingUtils.setPropertyValue(element, builder, "ignore-if-exists", "lookupEnabled");
ParsingUtils.setPropertyValue(element, builder, "persistent");
ParsingUtils.setPropertyValue(element, builder, "pool-name");
ParsingUtils.setPropertyValue(element, builder, "shortcut");
ParsingUtils.setPropertyValue(element, regionBuilder, "name");
ParsingUtils.setPropertyValue(element, regionBuilder, "data-policy", "dataPolicyName");
ParsingUtils.setPropertyValue(element, regionBuilder, "ignore-if-exists", "lookupEnabled");
ParsingUtils.setPropertyValue(element, regionBuilder, "persistent");
ParsingUtils.setPropertyValue(element, regionBuilder, "pool-name");
ParsingUtils.setPropertyValue(element, regionBuilder, "shortcut");
parseDiskStoreAttribute(element, builder);
parseDiskStoreAttribute(element, regionBuilder);
// Client RegionAttributes for overflow/eviction, expiration and statistics
BeanDefinitionBuilder regionAttributesBuilder = BeanDefinitionBuilder.genericBeanDefinition(
RegionAttributesFactoryBean.class);
mergeTemplateRegionAttributes(element, parserContext, regionBuilder, regionAttributesBuilder);
ParsingUtils.parseOptionalRegionAttributes(parserContext, element, regionAttributesBuilder);
ParsingUtils.parseStatistics(element, regionAttributesBuilder);
ParsingUtils.parseExpiration(parserContext, element, regionAttributesBuilder);
ParsingUtils.parseEviction(parserContext, element, regionAttributesBuilder);
ParsingUtils.parseCompressor(parserContext, element, regionAttributesBuilder);
builder.addPropertyValue("attributes", regionAttributesBuilder.getBeanDefinition());
regionBuilder.addPropertyValue("attributes", regionAttributesBuilder.getBeanDefinition());
List<Element> subElements = DomUtils.getChildElements(element);
@@ -88,16 +90,16 @@ class ClientRegionParser extends AbstractRegionParser {
String subElementLocalName = subElement.getLocalName();
if ("cache-listener".equals(subElementLocalName)) {
builder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration(
parserContext, subElement, builder));
regionBuilder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration(
parserContext, subElement, regionBuilder));
}
else if ("cache-loader".equals(subElementLocalName)) {
builder.addPropertyValue("cacheLoader", ParsingUtils.parseRefOrNestedBeanDeclaration(
parserContext, subElement, builder));
regionBuilder.addPropertyValue("cacheLoader", ParsingUtils.parseRefOrNestedBeanDeclaration(
parserContext, subElement, regionBuilder));
}
else if ("cache-writer".equals(subElementLocalName)) {
builder.addPropertyValue("cacheWriter", ParsingUtils.parseRefOrNestedBeanDeclaration(
parserContext, subElement, builder));
regionBuilder.addPropertyValue("cacheWriter", ParsingUtils.parseRefOrNestedBeanDeclaration(
parserContext, subElement, regionBuilder));
}
else if ("key-interest".equals(subElementLocalName)) {
interests.add(parseKeyInterest(subElement, parserContext));
@@ -108,7 +110,7 @@ class ClientRegionParser extends AbstractRegionParser {
}
if (!interests.isEmpty()) {
builder.addPropertyValue("interests", interests);
regionBuilder.addPropertyValue("interests", interests);
}
if (!subRegion) {

View File

@@ -1954,6 +1954,16 @@ The action to take when performing eviction.
</xsd:element>
<xsd:group ref="subRegionGroup" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="concurrency-level">
<xsd:annotation>
<xsd:documentation><![CDATA[
Provides an estimate of the maximum number of application threads that will concurrently access a Region entry
at one time. This attribute does not apply to Partitioned Regions. This attribute helps GemFire optimize the use of
system resources and reduce thread contention. This sets an initial parameter on the underlying
java.util.ConcurrentHashMap used for storing Region entries.
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="data-policy" use="optional">
<xsd:annotation>
<xsd:documentation><![CDATA[