This is an automated email from the ASF dual-hosted git repository. zstan pushed a commit to branch ignite-2.18 in repository https://gitbox.apache.org/repos/asf/ignite.git
commit 2af0e4bf87b332fceb6ab8c0b38cb0238be5cd79 Author: Aleksandr Chesnokov <[email protected]> AuthorDate: Wed Feb 11 15:49:03 2026 +0300 IGNITE-27684 Update IGNITE_HEADER for discovery protocol (#12671) (cherry picked from commit 5999c49eef7ab25d21b1926b7b4ef9fec0c9ad45) --- .../TcpDiscoveryDifferentClusterVersionsTest.java | 109 +++++++++++++++++++++ .../IgniteCompatibilityBasicTestSuite.java | 4 +- .../apache/ignite/internal/util/IgniteUtils.java | 2 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 10 +- 4 files changed, 119 insertions(+), 6 deletions(-) diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/spi/discovery/TcpDiscoveryDifferentClusterVersionsTest.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/spi/discovery/TcpDiscoveryDifferentClusterVersionsTest.java new file mode 100644 index 00000000000..4b805fad271 --- /dev/null +++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/spi/discovery/TcpDiscoveryDifferentClusterVersionsTest.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.compatibility.spi.discovery; + +import java.util.Collection; +import java.util.List; +import org.apache.ignite.compatibility.IgniteReleasedVersion; +import org.apache.ignite.compatibility.testframework.junits.IgniteCompatibilityAbstractTest; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.lang.IgniteInClosure; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.ListeningTestLogger; +import org.apache.ignite.testframework.LogListener; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** */ +@RunWith(Parameterized.class) +public class TcpDiscoveryDifferentClusterVersionsTest extends IgniteCompatibilityAbstractTest { + /** */ + private static final String INCOMPATIBLE_NODE_MSG = "is this an incompatible Ignite node?"; + + /** */ + private static final IgniteReleasedVersion OLD_VERSION = IgniteReleasedVersion.VER_2_17_0; + + /** */ + private ListeningTestLogger listeningLog; + + /** */ + @Parameterized.Parameter + public boolean client; + + /** */ + @Parameterized.Parameters(name = "client={0}") + public static Collection<?> client() { + return List.of(true, false); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + stopAllGrids(); + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + if (listeningLog != null) + cfg.setGridLogger(listeningLog); + + return cfg; + } + + /** Tests that connection from node of old version is properly refused. */ + @Test + public void testOldNodeRejected() throws Exception { + setLoggerDebugLevel(); + + listeningLog = new ListeningTestLogger(log); + + LogListener logListener = LogListener.matches(INCOMPATIBLE_NODE_MSG).build(); + + listeningLog.registerListener(logListener); + + startGrid(0); + + GridTestUtils.assertThrows( + log, + () -> startGrid("old-node", OLD_VERSION.toString(), new ConfigurationClosure()), + AssertionError.class, + null + ); + + assertTrue("Expected log about unknown connection.", logListener.check(getTestTimeout())); + } + + /** Setup node closure. */ + private class ConfigurationClosure implements IgniteInClosure<IgniteConfiguration> { + /** {@inheritDoc} */ + @Override public void apply(IgniteConfiguration cfg) { + cfg.setClientMode(client); + + cfg.setLocalHost("127.0.0.1"); + TcpDiscoverySpi disco = new TcpDiscoverySpi(); + disco.setIpFinder(LOCAL_IP_FINDER); + + cfg.setDiscoverySpi(disco); + } + } +} diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java index d615559ef06..f244737024c 100644 --- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java +++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java @@ -30,6 +30,7 @@ import org.apache.ignite.compatibility.persistence.MigratingToWalV2SerializerWit import org.apache.ignite.compatibility.persistence.MoveBinaryMetadataCompatibility; import org.apache.ignite.compatibility.persistence.PersistenceBasicCompatibilityTest; import org.apache.ignite.compatibility.persistence.SnapshotCompatibilityTest; +import org.apache.ignite.compatibility.spi.discovery.TcpDiscoveryDifferentClusterVersionsTest; import org.apache.ignite.compatibility.testframework.util.MavenUtilsTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -52,7 +53,8 @@ import org.junit.runners.Suite; JavaThinCompatibilityStoragePathTest.class, IgnitePKIndexesMigrationToUnwrapPkTest.class, CompoundIndexCompatibilityTest.class, - SnapshotCompatibilityTest.class + SnapshotCompatibilityTest.class, + TcpDiscoveryDifferentClusterVersionsTest.class }) public class IgniteCompatibilityBasicTestSuite { } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index 65408e6ec0b..ccc98f7684f 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -350,7 +350,7 @@ public abstract class IgniteUtils extends CommonUtils { indexOf('.', IgniteUtils.class.getName().indexOf('.') + 1)); /** Network packet header. */ - public static final byte[] IGNITE_HEADER = intToBytes(0x00004747); + public static final byte[] IGNITE_HEADER = intToBytes(0x0049474E); /** Default buffer size = 4K. */ private static final int BUF_SIZE = 4096; diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java index 0a24730a12c..8d6a8a0284e 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java @@ -6613,14 +6613,16 @@ class ServerImpl extends TcpDiscoveryImpl { if (!Arrays.equals(buf, U.IGNITE_HEADER)) { if (log.isDebugEnabled()) log.debug("Unknown connection detected (is some other software connecting to " + - "this Ignite port?" + + "this Ignite port, or is this an incompatible Ignite node?" + (!spi.isSslEnabled() ? " missed SSL configuration?" : "" ) + - ") [rmtAddr=" + rmtAddr + ", locAddr=" + sock.getLocalSocketAddress() + ']'); + ") [rmtAddr=" + rmtAddr + + ", locAddr=" + sock.getLocalSocketAddress() + + ", rcvdHdr=" + U.byteArray2HexString(buf) + ']'); LT.warn(log, "Unknown connection detected (is some other software connecting to " + - "this Ignite port?" + + "this Ignite port, or is this an incompatible Ignite node?" + (!spi.isSslEnabled() ? " missing SSL configuration on remote node?" : "" ) + - ") [rmtAddr=" + sock.getInetAddress() + ']', true); + ") [rmtAddr=" + sock.getInetAddress() + ", rcvdHdr=" + U.byteArray2HexString(buf) + ']', true); return; }
