From c60f5ff4bc15ca8192cc0f217fe9d696056d068c Mon Sep 17 00:00:00 2001 From: Mikhail Petrov Date: Sun, 19 Jul 2026 19:13:04 +0300 Subject: [PATCH 1/2] IGNITE-28908 Fixed features activation completion on client nodes with missing component --- .../feature/IgniteFeatureManager.java | 11 ++++++++++- .../AbstractRollingUpgradeTest.java | 16 +++++++++++----- .../CoreVersionRollingUpgradeTest.java | 6 ++---- .../PluginVersionRollingUpgradeTest.java | 5 ++++- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java index 4ee85b0c50e75..120968c6311e4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java @@ -92,7 +92,11 @@ public void listenActivation(IgniteFeature feature, IgniteRunnable lsnr) { /** */ public void onGridDataReceived(IgniteNodeFeatureSet activeClusterFeatures) { - if (locVerFeatures.equals(activeClusterFeatures)) + boolean hasSameFeatures = ctx.clientNode() + ? activeClusterFeatures.containsAll(locVerFeatures) + : locVerFeatures.equals(activeClusterFeatures); + + if (hasSameFeatures) activateLocalVersionFeatures(); else this.activeFeatures = activeClusterFeatures; @@ -114,6 +118,11 @@ public synchronized void activateLocalVersionFeatures() { locVerFeaturesActivationFut.onDone(); } + /** */ + public boolean isLocalVersionFeaturesActive() { + return locVerFeaturesActivationFut.isDone(); + } + /** */ private void checkActiveFeaturesInitialized(IgniteNodeFeatureSet activeFeatures) { if (activeFeatures == null) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java index 8eef1221032a9..e5d78745b19f1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java @@ -269,6 +269,8 @@ protected void startCluster(String ver) throws Exception { startGrid(0, ver); startGrid(1, ver); startClientGrid(2, ver); + + checkVersionUpgradeInactive(ver); } /** */ @@ -357,14 +359,19 @@ protected void checkVersionUpgradeInProgress(String logicalVer, String srcVer, S /** */ protected void checkVersionUpgradeInactive(String expVer) throws Exception { checkVersionUpgradeEnabledStatus(false); + checkVersionUpgradeFutureCompleted(); checkFeaturesActive(expVer); } /** */ - protected void checkVersionUpgradeEnabledStatus(boolean enabled) { - List cluster = Ignition.allGrids(); + protected void checkVersionUpgradeFutureCompleted() { + for (Ignite ignite : Ignition.allGrids()) + assertTrue(ru(ignite).features().isLocalVersionFeaturesActive()); + } - for (Ignite ignite : cluster) + /** */ + protected void checkVersionUpgradeEnabledStatus(boolean enabled) { + for (Ignite ignite : Ignition.allGrids()) assertEquals(enabled, ru(ignite).isVersionUpgradeEnabled()); } @@ -372,8 +379,7 @@ protected void checkVersionUpgradeEnabledStatus(boolean enabled) { protected void checkFeaturesActive(String ver) throws Exception { TestVersions versions = TestVersions.parse(ver); - if (versions.coreVersion() != null) - checkFeaturesActive(readDeclaredCoreFeatures(versions.coreVersion())); + checkFeaturesActive(readDeclaredCoreFeatures(versions.coreVersion())); if (versions.containsPlugin()) checkFeaturesActive(readDeclaredPluginFeatures(versions.pluginVersion())); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java index e852649829a6d..c773ce7395632 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java @@ -63,10 +63,8 @@ public void testVersionUpgradeDisabledNodeJoin() throws Exception { checkVersionUpgradeInactive(TEST_DEFAULT_VER); - String msg = VER_NOT_EQUAL_ERR; - - checkJoinFailed(3, "2.18.0", msg); - checkJoinFailed(3, "2.19.1", msg); + checkJoinFailed(3, "2.18.0", VER_NOT_EQUAL_ERR); + checkJoinFailed(3, "2.19.1", VER_NOT_EQUAL_ERR); } /** */ diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java index 02879bf669c5c..866716407764c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java @@ -38,7 +38,8 @@ public void testUpgradeDisabledJoinWithMissingComponent() throws Exception { checkJoinFailed(1, "2.19.0 | 2.0.0", VER_NOT_EQUAL_ERR); - checkJoinSuccess(1, "2.19.0", true); + checkJoinSuccess(1, "2.19.0 | 1.0.0", false); + checkJoinSuccess(2, "2.19.0", true); } /** */ @@ -96,6 +97,8 @@ public void testComponentVersionValidationDuringFinalization() throws Exception startGrid(1, "2.19.0 | 1.0.0"); startClientGrid(2, "2.19.0"); + checkVersionUpgradeInactive("2.19.0 | 1.0.0"); + ru(1).enableVersionUpgrade(); startClientGrid(3, "2.19.0 | 2.0.0"); From 7fd42bf07423e9f1689a082c9914bbee4179e406 Mon Sep 17 00:00:00 2001 From: Mikhail Petrov Date: Mon, 20 Jul 2026 11:32:32 +0300 Subject: [PATCH 2/2] IGNITE-28902 Removed public method for tests. --- .../rollingupgrade/feature/IgniteFeatureManager.java | 5 ----- .../rollingupgrade/AbstractRollingUpgradeTest.java | 8 ++++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java index 120968c6311e4..c836bd5bbb740 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java @@ -118,11 +118,6 @@ public synchronized void activateLocalVersionFeatures() { locVerFeaturesActivationFut.onDone(); } - /** */ - public boolean isLocalVersionFeaturesActive() { - return locVerFeaturesActivationFut.isDone(); - } - /** */ private void checkActiveFeaturesInitialized(IgniteNodeFeatureSet activeFeatures) { if (activeFeatures == null) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java index e5d78745b19f1..c54675151a708 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java @@ -54,6 +54,7 @@ import org.apache.ignite.internal.processors.rollingupgrade.feature.TestPluginComponentFeatureSetProvider; import org.apache.ignite.internal.processors.rollingupgrade.feature.TestPluginFeature; import org.apache.ignite.internal.processors.rollingupgrade.feature.TestPluginReleaseFeatures_1_0_0; +import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.lang.ConsumerX; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; @@ -365,8 +366,11 @@ protected void checkVersionUpgradeInactive(String expVer) throws Exception { /** */ protected void checkVersionUpgradeFutureCompleted() { - for (Ignite ignite : Ignition.allGrids()) - assertTrue(ru(ignite).features().isLocalVersionFeaturesActive()); + for (Ignite ignite : Ignition.allGrids()) { + GridFutureAdapter fut = U.field(ru(ignite).features(), "locVerFeaturesActivationFut"); + + assertTrue(fut.isDone()); + } } /** */