diff --git a/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterServiceImpl.java b/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterServiceImpl.java index 928cc519016a5..3a16b270882a3 100644 --- a/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterServiceImpl.java +++ b/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterServiceImpl.java @@ -81,6 +81,7 @@ import static com.hazelcast.util.Preconditions.checkFalse; import static com.hazelcast.util.Preconditions.checkNotNull; import static com.hazelcast.util.Preconditions.checkTrue; +import static java.lang.String.format; @SuppressWarnings({"checkstyle:methodcount", "checkstyle:classdataabstractioncoupling", "checkstyle:classfanoutcomplexity"}) public class ClusterServiceImpl implements ClusterService, ConnectionListener, ManagedService, @@ -378,7 +379,15 @@ public boolean finalizeJoin(MembersView membersView, Address callerAddress, Stri checkMemberUpdateContainsLocalMember(membersView, targetUuid); - initialClusterState(clusterState, clusterVersion); + try { + initialClusterState(clusterState, clusterVersion); + } catch (VersionMismatchException e) { + // node should shutdown since it cannot handle the cluster version + // it is safe to do so here because no operations have been executed yet + logger.severe(format("This member will shutdown because it cannot join the cluster: %s", e.getMessage())); + node.shutdown(true); + return false; + } setClusterId(clusterId); ClusterClockImpl clusterClock = getClusterClock(); clusterClock.setClusterStartTime(clusterStartTime); diff --git a/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterStateManager.java b/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterStateManager.java index da2e9914e7d87..492d11d8700ba 100644 --- a/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterStateManager.java +++ b/hazelcast/src/main/java/com/hazelcast/internal/cluster/impl/ClusterStateManager.java @@ -117,6 +117,7 @@ void initialClusterState(ClusterState initialState, Version version) { } // no need to validate again logger.fine("Setting initial cluster state: " + initialState + " and version: " + version); + validateNodeCompatibleWith(version); setClusterStateAndVersion(initialState, version, true); } finally { clusterServiceLock.unlock();