Skip to content

Commit

Permalink
Fail-fast if specify CP config in a Community version [HZ-4648] (#1316)
Browse files Browse the repository at this point in the history
This PR defines the Community version behaviour if a user tries to use
the CPSubsystem.
There are two cases - _without_ CP Config and _with_ CP Config:

1. default CP subsystem config (`cp-member-count`=0)
```
CPSubsystem cpSubsystem = instance.getCPSubsystem();
// don't throw an exception, returns a stub impl - for compatibility with hazelcast-spring
IAtomicLong aLong = cpSubsystem.getAtomicLong("aLong@testGroup");
// throw Unsupported exception
```

2. user-defined CP subsystem config (`cp-member-count`=3, 5, 7)

Member failed to start with `IllegalStateException`

This approach is compatible with the previous behaviour, if trying to
enable CP persistence in the OS version

GitOrigin-RevId: 2fe0e7d9c4d4872d450a143b772d4bbc5048f7b8
  • Loading branch information
arodionov authored and actions-user committed Apr 16, 2024
1 parent a141cb3 commit 6972f9b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1558,8 +1558,8 @@ public void testMemcacheProtocolConfig() {
@Test
public void testCPSubsystemConfig() {
CPSubsystemConfig cpSubsystemConfig = config.getCPSubsystemConfig();
assertEquals(4, cpSubsystemConfig.getCPMemberCount());
assertEquals(3, cpSubsystemConfig.getGroupSize());
assertEquals(0, cpSubsystemConfig.getCPMemberCount());
assertEquals(0, cpSubsystemConfig.getGroupSize());
assertEquals(15, cpSubsystemConfig.getSessionTimeToLiveSeconds());
assertEquals(3, cpSubsystemConfig.getSessionHeartbeatIntervalSeconds());
assertEquals(120, cpSubsystemConfig.getMissingCPMemberAutoRemovalSeconds());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,5 @@ dataconnection.name=my-data-connection
dataconnection.url=jdbc:mysql://dummy:3306
kubernetes.service.name=MY-SERVICE-NAME
kubernetes.service.label=MY-SERVICE-LABEL-VALUE
cp.member.count=4
cp.group.size=3
cp.member.count=0
cp.group.size=0
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@
import static com.hazelcast.config.InstanceTrackingConfig.InstanceTrackingProperties.PRODUCT;
import static com.hazelcast.config.InstanceTrackingConfig.InstanceTrackingProperties.START_TIMESTAMP;
import static com.hazelcast.config.InstanceTrackingConfig.InstanceTrackingProperties.VERSION;
import static com.hazelcast.cp.CPSubsystemStubImpl.CP_SUBSYSTEM_IS_NOT_AVAILABLE_IN_OS;
import static com.hazelcast.instance.impl.Node.getLegacyUCDClassLoader;
import static com.hazelcast.internal.util.ExceptionUtil.rethrow;
import static com.hazelcast.internal.util.InstanceTrackingUtil.writeInstanceTrackingFile;
Expand Down Expand Up @@ -172,6 +173,7 @@ public DefaultNodeExtension(Node node) {
this.logger = node.getLogger(NodeExtension.class);
this.logoLogger = node.getLogger("com.hazelcast.system.logo");
this.systemLogger = node.getLogger("com.hazelcast.system");
checkCPSubsystemAllowed();
checkSecurityAllowed();
checkPersistenceAllowed();
checkLosslessRestartAllowed();
Expand All @@ -186,18 +188,20 @@ public DefaultNodeExtension(Node node) {
integrityChecker = new IntegrityChecker(node.getConfig().getIntegrityCheckerConfig(), this.systemLogger);
}

private void checkPersistenceAllowed() {
PersistenceConfig persistenceConfig = node.getConfig().getPersistenceConfig();
if (persistenceConfig != null && persistenceConfig.isEnabled()) {
private void checkCPSubsystemAllowed() {
CPSubsystemConfig cpSubsystemConfig = node.getConfig().getCPSubsystemConfig();
if (cpSubsystemConfig != null && cpSubsystemConfig.getCPMemberCount() != 0) {
if (!BuildInfoProvider.getBuildInfo().isEnterprise()) {
throw new IllegalStateException("Hot Restart requires Hazelcast Enterprise Edition");
throw new IllegalStateException(CP_SUBSYSTEM_IS_NOT_AVAILABLE_IN_OS);
}
}
}

CPSubsystemConfig cpSubsystemConfig = node.getConfig().getCPSubsystemConfig();
if (cpSubsystemConfig != null && cpSubsystemConfig.isPersistenceEnabled()) {
private void checkPersistenceAllowed() {
PersistenceConfig persistenceConfig = node.getConfig().getPersistenceConfig();
if (persistenceConfig != null && persistenceConfig.isEnabled()) {
if (!BuildInfoProvider.getBuildInfo().isEnterprise()) {
throw new IllegalStateException("CP persistence requires Hazelcast Enterprise Edition");
throw new IllegalStateException("Hot Restart requires Hazelcast Enterprise Edition");
}
}
}
Expand Down

0 comments on commit 6972f9b

Please sign in to comment.