Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove legacy CountdownLatch #15538

Merged
merged 1 commit into from Sep 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -43,7 +43,9 @@
import com.hazelcast.config.PredicateConfig;
import com.hazelcast.config.QueryCacheConfig;
import com.hazelcast.config.SSLConfig;
import com.hazelcast.cp.CPSubsystem;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedList;
Expand All @@ -60,6 +62,7 @@
import static com.hazelcast.config.DomConfigHelper.cleanNodeName;
import static com.hazelcast.config.DomConfigHelper.getBooleanValue;
import static com.hazelcast.config.DomConfigHelper.getIntegerValue;
import static com.hazelcast.spring.HazelcastInstanceDefinitionParser.CP_SUBSYSTEM_SUFFX;
import static com.hazelcast.util.StringUtil.upperCaseInternal;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import static org.springframework.util.Assert.isTrue;
Expand Down Expand Up @@ -87,7 +90,20 @@ public class HazelcastClientBeanDefinitionParser extends AbstractHazelcastBeanDe
@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
SpringXmlBuilder springXmlBuilder = new SpringXmlBuilder(parserContext);
return springXmlBuilder.handleClient(element);
AbstractBeanDefinition bean = springXmlBuilder.handleClient(element);
registerCPSubsystemBean(element, parserContext);
return bean;
}

private void registerCPSubsystemBean(Element element, ParserContext parserContext) {
String instanceBeanRef = element.getAttribute("id");
BeanDefinitionBuilder cpBeanDefBuilder = BeanDefinitionBuilder.rootBeanDefinition(CPSubsystem.class);
cpBeanDefBuilder.setFactoryMethodOnBean("getCPSubsystem", instanceBeanRef);
cpBeanDefBuilder.setLazyInit(true);

BeanDefinitionHolder holder =
new BeanDefinitionHolder(cpBeanDefBuilder.getBeanDefinition(), instanceBeanRef + CP_SUBSYSTEM_SUFFX);
registerBeanDefinition(holder, parserContext.getRegistry());
}

/**
Expand Down Expand Up @@ -504,6 +520,7 @@ private void handleLabels(Node node) {
}
configBuilder.addPropertyValue("labels", labels);
}

}

}
Expand Up @@ -31,7 +31,6 @@
import com.hazelcast.config.CacheSimpleEntryListenerConfig;
import com.hazelcast.config.CardinalityEstimatorConfig;
import com.hazelcast.config.Config;
import com.hazelcast.config.CountDownLatchConfig;
import com.hazelcast.config.CredentialsFactoryConfig;
import com.hazelcast.config.CustomWanPublisherConfig;
import com.hazelcast.config.DurableExecutorConfig;
Expand Down Expand Up @@ -202,7 +201,6 @@ private class SpringXmlConfigBuilder extends SpringXmlBuilderHelper {
private ManagedMap<String, AbstractBeanDefinition> ringbufferManagedMap;
private ManagedMap<String, AbstractBeanDefinition> atomicLongManagedMap;
private ManagedMap<String, AbstractBeanDefinition> atomicReferenceManagedMap;
private ManagedMap<String, AbstractBeanDefinition> countDownLatchManagedMap;
private ManagedMap<String, AbstractBeanDefinition> reliableTopicManagedMap;
private ManagedMap<String, AbstractBeanDefinition> semaphoreManagedMap;
private ManagedMap<String, AbstractBeanDefinition> listManagedMap;
Expand Down Expand Up @@ -233,7 +231,6 @@ private class SpringXmlConfigBuilder extends SpringXmlBuilderHelper {
this.ringbufferManagedMap = createManagedMap("ringbufferConfigs");
this.atomicLongManagedMap = createManagedMap("atomicLongConfigs");
this.atomicReferenceManagedMap = createManagedMap("atomicReferenceConfigs");
this.countDownLatchManagedMap = createManagedMap("countDownLatchConfigs");
this.reliableTopicManagedMap = createManagedMap("reliableTopicConfigs");
this.semaphoreManagedMap = createManagedMap("semaphoreConfigs");
this.listManagedMap = createManagedMap("listConfigs");
Expand Down Expand Up @@ -294,8 +291,6 @@ public void handleConfig(Element element) {
handleAtomicLong(node);
} else if ("atomic-reference".equals(nodeName)) {
handleAtomicReference(node);
} else if ("count-down-latch".equals(nodeName)) {
handleCountDownLatch(node);
} else if ("reliable-topic".equals(nodeName)) {
handleReliableTopic(node);
} else if ("semaphore".equals(nodeName)) {
Expand Down Expand Up @@ -1149,18 +1144,6 @@ public void handleAtomicReference(Node node) {
atomicReferenceManagedMap.put(getAttribute(node, "name"), atomicReferenceConfigBuilder.getBeanDefinition());
}

public void handleCountDownLatch(Node node) {
BeanDefinitionBuilder countDownLatchConfigBuilder = createBeanBuilder(CountDownLatchConfig.class);
fillAttributeValues(node, countDownLatchConfigBuilder);
for (Node childNode : childElements(node)) {
String nodeName = cleanNodeName(childNode);
if ("split-brain-protection-ref".equals(nodeName)) {
countDownLatchConfigBuilder.addPropertyValue("splitBrainProtectionName", getTextContent(childNode));
}
}
countDownLatchManagedMap.put(getAttribute(node, "name"), countDownLatchConfigBuilder.getBeanDefinition());
}

public void handleQueue(Node node) {
BeanDefinitionBuilder queueConfigBuilder = createBeanBuilder(QueueConfig.class);
Node attName = node.getAttributes().getNamedItem("name");
Expand Down
Expand Up @@ -16,7 +16,9 @@

package com.hazelcast.spring;

import com.hazelcast.cp.CPSubsystem;
import com.hazelcast.instance.impl.HazelcastInstanceFactory;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
Expand Down Expand Up @@ -51,6 +53,8 @@
*/
public class HazelcastInstanceDefinitionParser extends AbstractHazelcastBeanDefinitionParser {

static final String CP_SUBSYSTEM_SUFFX = "@cp-subsystem";

@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
SpringXmlBuilder springXmlBuilder = new SpringXmlBuilder(parserContext);
Expand Down Expand Up @@ -86,6 +90,18 @@ public void handle(Element element) {
HazelcastConfigBeanDefinitionParser configParser = new HazelcastConfigBeanDefinitionParser();
AbstractBeanDefinition configBeanDef = configParser.parseInternal(config, parserContext);
builder.addConstructorArgValue(configBeanDef);

registerCPSubsystemBean(element);
}

private void registerCPSubsystemBean(Element element) {
String instanceBeanRef = element.getAttribute("id");
BeanDefinitionBuilder cpBeanDefBuilder = BeanDefinitionBuilder.rootBeanDefinition(CPSubsystem.class);
cpBeanDefBuilder.setFactoryMethodOnBean("getCPSubsystem", instanceBeanRef);

BeanDefinitionHolder holder =
new BeanDefinitionHolder(cpBeanDefBuilder.getBeanDefinition(), instanceBeanRef + CP_SUBSYSTEM_SUFFX);
registerBeanDefinition(holder, parserContext.getRegistry());
}
}
}
Expand Up @@ -19,11 +19,41 @@
import com.hazelcast.spring.hibernate.RegionFactoryBeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

import java.util.HashSet;
import java.util.Set;

/**
* Hazelcast Custom Namespace Definitions.
*/
public class HazelcastNamespaceHandler extends NamespaceHandlerSupport {

static final Set<String> CP_TYPES = new HashSet<>();
private static final String MAP = "map";
private static final String MULTI_MAP = "multiMap";
private static final String REPLICATED_MAP = "replicatedMap";
private static final String QUEUE = "queue";
private static final String TOPIC = "topic";
private static final String SET = "set";
private static final String LIST = "list";
private static final String EXECUTOR_SERVICE = "executorService";
private static final String DURABLE_EXECUTOR_SERVICE = "durableExecutorService";
private static final String SCHEDULED_EXECUTOR_SERVICE = "scheduledExecutorService";
private static final String RINGBUFFER = "ringbuffer";
private static final String CARDINALITY_ESTIMATOR = "cardinalityEstimator";
private static final String ID_GENERATOR = "idGenerator";
private static final String FLAKE_ID_GENERATOR = "flakeIdGenerator";
private static final String ATOMIC_LONG = "atomicLong";
private static final String ATOMIC_REFERENCE = "atomicReference";
private static final String COUNT_DOWN_LATCH = "countDownLatch";
private static final String SEMAPHORE = "semaphore";
private static final String LOCK = "lock";
private static final String RELIABLE_TOPIC = "reliableTopic";
private static final String PNCOUNTER = "PNCounter";

static {
CP_TYPES.add(COUNT_DOWN_LATCH);
}

@Override
public void init() {
registerBeanDefinitionParser("config", new HazelcastConfigBeanDefinitionParser());
Expand All @@ -33,29 +63,11 @@ public void init() {
new HazelcastFailoverClientBeanDefinitionParser());
registerBeanDefinitionParser("hibernate-region-factory", new RegionFactoryBeanDefinitionParser());
registerBeanDefinitionParser("cache-manager", new CacheManagerBeanDefinitionParser());
String[] types = {
"map",
"multiMap",
"replicatedMap",
"queue",
"topic",
"set",
"list",
"executorService",
"durableExecutorService",
"scheduledExecutorService",
"ringbuffer",
"cardinalityEstimator",
"idGenerator",
"flakeIdGenerator",
"atomicLong",
"atomicReference",
"countDownLatch",
"semaphore",
"lock",
"reliableTopic",
"PNCounter",
};
String[] types =
{MAP, MULTI_MAP, REPLICATED_MAP, QUEUE, TOPIC, SET, LIST, EXECUTOR_SERVICE,
DURABLE_EXECUTOR_SERVICE, SCHEDULED_EXECUTOR_SERVICE, RINGBUFFER, CARDINALITY_ESTIMATOR,
ID_GENERATOR, FLAKE_ID_GENERATOR, ATOMIC_LONG, ATOMIC_REFERENCE, COUNT_DOWN_LATCH, SEMAPHORE,
LOCK, RELIABLE_TOPIC, PNCOUNTER};
for (String type : types) {
registerBeanDefinitionParser(type, new HazelcastTypeBeanDefinitionParser(type));
}
Expand Down
Expand Up @@ -24,6 +24,8 @@
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import static com.hazelcast.spring.HazelcastInstanceDefinitionParser.CP_SUBSYSTEM_SUFFX;

/**
* BeanDefinitionParser for Type Configuration of Hazelcast Types like map, queue, topic etc.
*/
Expand Down Expand Up @@ -69,7 +71,11 @@ public void handle(Element element) {
throw new IllegalStateException("'instance-ref' attribute is required for creating Hazelcast " + type);
}
String instanceRef = getTextContent(instanceRefNode);
builder.getRawBeanDefinition().setFactoryBeanName(instanceRef);
if (HazelcastNamespaceHandler.CP_TYPES.contains(type)) {
builder.getRawBeanDefinition().setFactoryBeanName(instanceRef + CP_SUBSYSTEM_SUFFX);
} else {
builder.getRawBeanDefinition().setFactoryBeanName(instanceRef);
}
builder.addDependsOn(instanceRef);

Node nameNode = attributes.getNamedItem("name");
Expand Down
15 changes: 0 additions & 15 deletions hazelcast-spring/src/main/resources/hazelcast-spring-4.0.xsd
Expand Up @@ -419,21 +419,6 @@
<xs:attribute name="name" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="count-down-latch" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="split-brain-protection-ref" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Adds the Split Brain Protection for this data-structure which you configure using the split-brain-protection element.
You should set the split-brain-protection-ref's value as the split brain protection's name.
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="semaphore" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
Expand Down
Expand Up @@ -34,7 +34,6 @@
import com.hazelcast.config.ClassFilter;
import com.hazelcast.config.Config;
import com.hazelcast.config.ConsistencyCheckStrategy;
import com.hazelcast.config.CountDownLatchConfig;
import com.hazelcast.config.CustomWanPublisherConfig;
import com.hazelcast.config.DiscoveryConfig;
import com.hazelcast.config.DiscoveryStrategyConfig;
Expand Down Expand Up @@ -618,14 +617,6 @@ public void testAtomicReferenceConfig() {
assertEquals(4223, mergePolicyConfig.getBatchSize());
}

@Test
public void testCountDownLatchConfig() {
CountDownLatchConfig testCountDownLatch = config.getCountDownLatchConfig("testCountDownLatch");
assertNotNull(testCountDownLatch);
assertEquals("testCountDownLatch", testCountDownLatch.getName());
assertEquals("my-split-brain-protection", testCountDownLatch.getSplitBrainProtectionName());
}

@Test
public void testSemaphoreConfig() {
SemaphoreConfig testSemaphore = config.getSemaphoreConfig("testSemaphore");
Expand Down Expand Up @@ -1417,10 +1408,11 @@ public void testMemcacheProtocolConfig() {
assertTrue(memcacheProtocolConfig.isEnabled());
}

@Test
public void testCPSubsystemConfig() {
CPSubsystemConfig cpSubsystemConfig = config.getCPSubsystemConfig();
assertEquals(10, cpSubsystemConfig.getCPMemberCount());
assertEquals(5, cpSubsystemConfig.getGroupSize());
assertEquals(0, cpSubsystemConfig.getCPMemberCount());
assertEquals(0, cpSubsystemConfig.getGroupSize());
assertEquals(15, cpSubsystemConfig.getSessionTimeToLiveSeconds());
assertEquals(3, cpSubsystemConfig.getSessionHeartbeatIntervalSeconds());
assertEquals(120, cpSubsystemConfig.getMissingCPMemberAutoRemovalSeconds());
Expand Down
Expand Up @@ -360,10 +360,6 @@
<hz:merge-policy batch-size="4223">PassThroughMergePolicy</hz:merge-policy>
</hz:atomic-reference>

<hz:count-down-latch name="testCountDownLatch">
<hz:split-brain-protection-ref>my-split-brain-protection</hz:split-brain-protection-ref>
</hz:count-down-latch>

<hz:semaphore name="testSemaphore" async-backup-count="1" backup-count="1" initial-permits="10">
<hz:split-brain-protection-ref>my-split-brain-protection</hz:split-brain-protection-ref>
</hz:semaphore>
Expand Down Expand Up @@ -829,8 +825,8 @@
</hz:pn-counter>

<hz:cp-subsystem>
<hz:cp-member-count>10</hz:cp-member-count>
<hz:group-size>5</hz:group-size>
<hz:cp-member-count>0</hz:cp-member-count>
<hz:group-size>0</hz:group-size>
<hz:session-time-to-live-seconds>15</hz:session-time-to-live-seconds>
<hz:session-heartbeat-interval-seconds>3</hz:session-heartbeat-interval-seconds>
<hz:missing-cp-member-auto-removal-seconds>120</hz:missing-cp-member-auto-removal-seconds>
Expand Down
Expand Up @@ -458,7 +458,7 @@ private void handleExecutorSimulate(String[] args) {
Member member = members.get(k % members.size());
if (taskCount % totalThreadCount == 0) {
latchId = taskCount / totalThreadCount;
hazelcast.getCountDownLatch("latch" + latchId).trySetCount(totalThreadCount);
hazelcast.getCPSubsystem().getCountDownLatch("latch" + latchId).trySetCount(totalThreadCount);

}
Future f = executor.submitToMember(new SimulateLoadTask(durationSec, k + 1, "latch" + latchId), member);
Expand Down
Expand Up @@ -28,7 +28,7 @@
import com.hazelcast.cp.CPSubsystemManagementService;
import com.hazelcast.cp.internal.datastructures.atomiclong.RaftAtomicLongService;
import com.hazelcast.cp.internal.datastructures.atomicref.RaftAtomicRefService;
import com.hazelcast.cp.internal.datastructures.countdownlatch.RaftCountDownLatchService;
import com.hazelcast.cp.internal.datastructures.countdownlatch.CountDownLatchService;
import com.hazelcast.cp.internal.datastructures.lock.RaftLockService;
import com.hazelcast.cp.internal.datastructures.semaphore.RaftSemaphoreService;
import com.hazelcast.cp.lock.FencedLock;
Expand Down Expand Up @@ -61,7 +61,7 @@ public <E> IAtomicReference<E> getAtomicReference(String name) {

@Override
public ICountDownLatch getCountDownLatch(String name) {
return proxyFactory.createProxy(RaftCountDownLatchService.SERVICE_NAME, name);
return proxyFactory.createProxy(CountDownLatchService.SERVICE_NAME, name);
}

@Override
Expand Down