Skip to content

Commit

Permalink
added new API method getPartitionGroupStrategy(Collection<? extends M…
Browse files Browse the repository at this point in the history
…ember> allMembers)

to allow the implementor to have access to cluster members
  • Loading branch information
lprimak committed Jun 18, 2021
1 parent e22aab3 commit 38a614f
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 15 deletions.
Expand Up @@ -25,6 +25,7 @@
import com.hazelcast.spi.discovery.impl.DefaultDiscoveryService;
import com.hazelcast.spi.discovery.integration.DiscoveryService;
import com.hazelcast.spi.partitiongroup.MemberGroup;
import com.hazelcast.spi.partitiongroup.PartitionGroupStrategy;

import java.util.Collection;
import java.util.Set;
Expand Down Expand Up @@ -62,10 +63,12 @@ protected Set<MemberGroup> createInternalMemberGroups(Collection<? extends Membe
+ "check service definitions under META_INF.services folder. ");
} else {
for (DiscoveryStrategy discoveryStrategy : defaultDiscoveryService.getDiscoveryStrategies()) {
checkNotNull(discoveryStrategy.getPartitionGroupStrategy());
Iterable<MemberGroup> spiGroupsIterator =
discoveryStrategy.getPartitionGroupStrategy().getMemberGroups();
for (MemberGroup group : spiGroupsIterator) {
PartitionGroupStrategy groupStrategy = discoveryStrategy.getPartitionGroupStrategy(allMembers);
if (groupStrategy == null) {
groupStrategy = discoveryStrategy.getPartitionGroupStrategy();
}
checkNotNull(groupStrategy);
for (MemberGroup group : groupStrategy.getMemberGroups()) {
memberGroups.add(group);
}
return memberGroups;
Expand Down
Expand Up @@ -16,11 +16,13 @@

package com.hazelcast.spi.discovery;

import com.hazelcast.cluster.Member;
import com.hazelcast.config.properties.PropertyDefinition;
import com.hazelcast.logging.ILogger;
import com.hazelcast.spi.partitiongroup.PartitionGroupStrategy;
import com.hazelcast.internal.util.StringUtil;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;

Expand Down Expand Up @@ -52,7 +54,7 @@ public void start() {
}

@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
public PartitionGroupStrategy getPartitionGroupStrategy(Collection<? extends Member> allMembers) {
return null;
}

Expand Down
Expand Up @@ -19,6 +19,8 @@
import com.hazelcast.cluster.Member;
import com.hazelcast.spi.partitiongroup.PartitionGroupStrategy;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;

/**
Expand Down Expand Up @@ -65,6 +67,21 @@ public interface DiscoveryStrategy {
void destroy();

/**
* Returns a custom implementation of a {@link PartitionGroupStrategy} to override
* default behavior of zone aware backup strategies {@link com.hazelcast.spi.partitiongroup.PartitionGroupMetaData}
* or to provide a specific behavior in case the discovery environment does not provide
* information about the infrastructure to be used for automatic configuration.
* @param allMembers Current state of Cluster data members, excluding lite members
* @return a custom implementation of a <code>PartitionGroupStrategy</code> otherwise <code>null</code>
* in case of the default implementation is to be used
* @since 4.2.1
*/
default PartitionGroupStrategy getPartitionGroupStrategy(Collection<? extends Member> allMembers) {
return null;
}

/**
* @deprecated - use the above method that takes allMember arguments
* Returns a custom implementation of a {@link PartitionGroupStrategy} to override
* default behavior of zone aware backup strategies {@link com.hazelcast.spi.partitiongroup.PartitionGroupMetaData}
* or to provide a specific behavior in case the discovery environment does not provide
Expand All @@ -74,7 +91,10 @@ public interface DiscoveryStrategy {
* in case of the default implementation is to be used
* @since 3.7
*/
PartitionGroupStrategy getPartitionGroupStrategy();
@Deprecated
default PartitionGroupStrategy getPartitionGroupStrategy() {
return Collections::emptyList;
}

/**
* Returns a map with discovered metadata provided by the runtime environment. Those information
Expand Down
Expand Up @@ -267,7 +267,7 @@ public void testParsing() throws Exception {
@Test
public void testNodeStartup() {
String xmlFileName = "test-hazelcast-discovery-spi.xml";
Config config = getDiscoverySPIConfig(xmlFileName);
Config config = getDiscoverySPIConfig(xmlFileName, false);

try {
final HazelcastInstance hazelcastInstance1 = Hazelcast.newHazelcastInstance(config);
Expand Down Expand Up @@ -376,7 +376,27 @@ public void testSPIAwareMemberGroupFactoryInvalidConfig() throws Exception {
@Test
public void testSPIAwareMemberGroupFactoryCreateMemberGroups() throws Exception {
String xmlFileName = "test-hazelcast-discovery-spi-metadata.xml";
Config config = getDiscoverySPIConfig(xmlFileName);
Config config = getDiscoverySPIConfig(xmlFileName, false);
// we create this instance in order to fully create Node
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config);
Node node = getNode(hazelcastInstance);
assertNotNull(node);

MemberGroupFactory groupFactory = new SPIAwareMemberGroupFactory(node.getDiscoveryService());
Collection<Member> members = createMembers();
Collection<MemberGroup> memberGroups = groupFactory.createMemberGroups(members);

assertEquals("Member Groups: " + String.valueOf(memberGroups), 2, memberGroups.size());
for (MemberGroup memberGroup : memberGroups) {
assertEquals("Member Group: " + String.valueOf(memberGroup), 2, memberGroup.size());
}
hazelcastInstance.shutdown();
}

@Test
public void testSPIAwareMemberGroupFactoryCreateMemberGroups_withDeprecated() throws Exception {
String xmlFileName = "test-hazelcast-discovery-spi-metadata.xml";
Config config = getDiscoverySPIConfig(xmlFileName, true);
// we create this instance in order to fully create Node
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config);
Node node = getNode(hazelcastInstance);
Expand Down Expand Up @@ -552,7 +572,7 @@ public void destroy() {
}

@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
public PartitionGroupStrategy getPartitionGroupStrategy(Collection<? extends Member> allMembers) {
return null;
}

Expand All @@ -562,6 +582,13 @@ public Map<String, String> discoverLocalMetadata() {
}
}

private static class DeprecatedTestDiscoveryStrategy extends TestDiscoveryStrategy {
@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
return null;
}
}

public static class TestDiscoveryStrategyFactory implements DiscoveryStrategyFactory {

private final Collection<PropertyDefinition> propertyDefinitions;
Expand Down Expand Up @@ -594,9 +621,9 @@ public Collection<PropertyDefinition> getConfigurationProperties() {

public static class CollectingDiscoveryStrategyFactory implements DiscoveryStrategyFactory {

private final List<DiscoveryNode> discoveryNodes;
protected final List<DiscoveryNode> discoveryNodes;

private CollectingDiscoveryStrategyFactory(List<DiscoveryNode> discoveryNodes) {
CollectingDiscoveryStrategyFactory(List<DiscoveryNode> discoveryNodes) {
this.discoveryNodes = discoveryNodes;
}

Expand All @@ -616,6 +643,22 @@ public Collection<PropertyDefinition> getConfigurationProperties() {
}
}

private static class DeprecatedCollectingDiscoveryStrategyFactory extends CollectingDiscoveryStrategyFactory {
DeprecatedCollectingDiscoveryStrategyFactory(List<DiscoveryNode> discoveryNodes) {
super(discoveryNodes);
}

@Override
public Class<? extends DiscoveryStrategy> getDiscoveryStrategyType() {
return DeprecatedCollectingDiscoveryStrategy.class;
}

@Override
public DiscoveryStrategy newDiscoveryStrategy(DiscoveryNode node, ILogger logger, Map<String, Comparable> properties) {
return new DeprecatedCollectingDiscoveryStrategy(node, discoveryNodes, logger, properties);
}
}

private static class CollectingDiscoveryStrategy extends AbstractDiscoveryStrategy {

private final List<DiscoveryNode> discoveryNodes;
Expand All @@ -638,7 +681,7 @@ public void start() {

// need to provide a custom impl
@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
public PartitionGroupStrategy getPartitionGroupStrategy(Collection<? extends Member> allMembers) {
return new SPIPartitionGroupStrategy();
}

Expand All @@ -654,6 +697,18 @@ public void destroy() {
}
}

private static class DeprecatedCollectingDiscoveryStrategy extends CollectingDiscoveryStrategy {
DeprecatedCollectingDiscoveryStrategy(DiscoveryNode discoveryNode, List<DiscoveryNode> discoveryNodes, ILogger logger,
Map<String, Comparable> properties) {
super(discoveryNode, discoveryNodes, logger, properties);
}

@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
return new SPIPartitionGroupStrategy();
}
}

public static class TestNodeFilter implements NodeFilter {

private final List<DiscoveryNode> nodes = new ArrayList<DiscoveryNode>();
Expand Down Expand Up @@ -706,7 +761,7 @@ public Iterable<DiscoveryNode> discoverNodes() {
}

@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
public PartitionGroupStrategy getPartitionGroupStrategy(Collection<? extends Member> allMembers) {
return new SPIPartitionGroupStrategy();
}

Expand All @@ -718,6 +773,17 @@ public Map<String, String> discoverLocalMetadata() {
}
}

private static class DeprecatedMetadataProvidingDiscoveryStrategy extends MetadataProvidingDiscoveryStrategy {
DeprecatedMetadataProvidingDiscoveryStrategy(DiscoveryNode discoveryNode, ILogger logger, Map<String, Comparable> properties) {
super(discoveryNode, logger, properties);
}

@Override
public PartitionGroupStrategy getPartitionGroupStrategy() {
return new SPIPartitionGroupStrategy();
}
}

private static class SPIPartitionGroupStrategy implements PartitionGroupStrategy {

@Override
Expand All @@ -743,7 +809,7 @@ private static Collection<Member> createMembers() throws UnknownHostException {
return members;
}

private static Config getDiscoverySPIConfig(String xmlFileName) {
private static Config getDiscoverySPIConfig(String xmlFileName, boolean isDeprecated) {
InputStream xmlResource = DiscoverySpiTest.class.getClassLoader().getResourceAsStream(xmlFileName);
Config config = new XmlConfigBuilder(xmlResource).build();
config.getNetworkConfig().setPort(50001);
Expand All @@ -753,7 +819,8 @@ private static Config getDiscoverySPIConfig(String xmlFileName) {
interfaces.addInterface("127.0.0.1");

List<DiscoveryNode> discoveryNodes = new CopyOnWriteArrayList<DiscoveryNode>();
DiscoveryStrategyFactory factory = new CollectingDiscoveryStrategyFactory(discoveryNodes);
DiscoveryStrategyFactory factory = isDeprecated ? new DeprecatedCollectingDiscoveryStrategyFactory(discoveryNodes)
: new CollectingDiscoveryStrategyFactory(discoveryNodes);

DiscoveryConfig discoveryConfig = config.getNetworkConfig().getJoin().getDiscoveryConfig();
discoveryConfig.getDiscoveryStrategyConfigs().clear();
Expand Down
@@ -1,5 +1,7 @@
com.hazelcast.spi.discovery.DiscoverySpiTest$TestDiscoveryStrategyFactory
com.hazelcast.spi.discovery.DiscoverySpiTest$DeprecatedTestDiscoveryStrategyFactory
com.hazelcast.spi.discovery.DiscoverySpiTest$MetadataProvidingDiscoveryStrategyFactory
com.hazelcast.spi.discovery.DiscoverySpiTest$DeprecatedMetadataProvidingDiscoveryStrategyFactory
com.hazelcast.spi.discovery.DiscoverySpiTest$ParametrizedDiscoveryStrategyFactory
com.hazelcast.client.impl.spi.impl.discovery.ClientDiscoverySpiTest$TestDiscoveryStrategyFactory
com.hazelcast.spi.discovery.impl.AutoDetectionDefaultDiscoveryServiceTest$TestDiscoveryStrategyFactory
Expand Down

0 comments on commit 38a614f

Please sign in to comment.