From 31da6168657082fef3ccd5a12e93723e0026656a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 18 Nov 2025 17:05:02 +0300 Subject: [PATCH 01/86] WIP --- .../managers/discovery/DiscoCache.java | 35 +----- .../ignite/spi/discovery/tcp/ServerImpl.java | 6 - .../tcp/internal/TcpDiscoveryNode.java | 9 +- .../datacenter/MultiDataCenterRignTest.java | 108 ++++++++++++++++++ 4 files changed, 121 insertions(+), 37 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java index a10731bf3cd6e0..b8a2afa864029d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java @@ -378,38 +378,13 @@ public void updateAlives(GridDiscoveryManager discovery) { * @return Server node instance. */ @Nullable public ClusterNode serverNodeByOrder(long order) { - int idx = serverNodeBinarySearch(order); - - if (idx >= 0) - return srvNodes.get(idx); - - return null; - } - - /** - * @param order Node order. - * @return Node index. - */ - private int serverNodeBinarySearch(long order) { - int low = 0; - int high = srvNodes.size() - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - - ClusterNode midVal = srvNodes.get(mid); - - int cmp = Long.compare(midVal.order(), order); - - if (cmp < 0) - low = mid + 1; - else if (cmp > 0) - high = mid - 1; - else - return mid; + for (ClusterNode node : srvNodes) { + if (node.order() == order) { + return node; + } } - return -(low + 1); + return null; } /** 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 8b5bdadbebdde5..4259b93514b8f7 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 @@ -5198,12 +5198,6 @@ else if (spiState == CONNECTING) pendingMsgs.reset(msg.messages(), msg.discardedMessageId(), msg.discardedCustomMessageId()); - - // Clear data to minimize message size. - msg.messages(null, null, null); - msg.topology(null); - msg.topologyHistory(null); - msg.clearDiscoveryData(); } else { if (log.isDebugEnabled()) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java index 89f1f492e9272b..1e349f879121f1 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java @@ -543,7 +543,14 @@ public TcpDiscoveryNode clientReconnectNode(Map nodeAttrs) { if (node == null) return 1; - int res = Long.compare(internalOrder(), node.internalOrder()); + String locDcId = dataCenterId() == null ? "" : dataCenterId(); + String otherDcId = node.dataCenterId() == null ? "" : node.dataCenterId(); + + int res = locDcId.compareTo(otherDcId); + + if (res == 0) { + res = Long.compare(internalOrder(), node.internalOrder()); + } if (res == 0) { assert id().equals(node.id()) : "Duplicate order [this=" + this + ", other=" + node + ']'; diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java new file mode 100644 index 00000000000000..17d435a70cbdbc --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -0,0 +1,108 @@ +/* + * 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.spi.discovery.datacenter; + +import java.util.Collection; +import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +/** */ +public class MultiDataCenterRignTest extends GridCommonAbstractTest { + /** */ + private static final String DC_ID_0 = "DC0"; + + /** */ + private static final String DC_ID_1 = "DC1"; + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + stopAllGrids(); + + System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + } + + /** */ + @Test + public void testRing() throws Exception { + for (int i = 0; i < 10; i += 2) { + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); + + startGrid(i); + + waitForTopology(i + 1); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); + + startGrid(i + 1); + + waitForTopology(i + 2); + } + + Collection nodes = grid(0).cluster().forServers().nodes(); + + int swithes = 0; + String curDcId = null; + + for (ClusterNode node : nodes) { + if (!node.dataCenterId().equals(curDcId)){ + swithes++; + + curDcId = node.dataCenterId(); + } + } + + assertEquals(2, swithes); + } + + /** */ + @Test + public void testRingWithCordinatorChange() throws Exception { + for (int i = 0; i < 10; i += 2) { + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); + + startGrid(i); + + waitForTopology(i + 1); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); + + startGrid(i + 1); + + waitForTopology(i + 2); + } + + Collection nodes = grid(0).cluster().forServers().nodes(); + + int swithes = 0; + String curDcId = null; + + for (ClusterNode node : nodes) { + if (!node.dataCenterId().equals(curDcId)){ + swithes++; + + curDcId = node.dataCenterId(); + } + } + + assertEquals(2, swithes); + } +} From 949237663bebe36e24e7566d6b182a0a1b9d7a86 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 18 Nov 2025 17:41:02 +0300 Subject: [PATCH 02/86] WIP --- .../ignite/internal/util/lang/GridFunc.java | 2 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 52 ++++++++++--------- .../tcp/internal/TcpDiscoveryNodesRing.java | 10 ++-- .../datacenter/MultiDataCenterRignTest.java | 12 ++--- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java index 8bf794062ef454..7e8bd3149580ec 100755 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java @@ -281,7 +281,7 @@ public static Collection concat(boolean cp, @Nullable final Collection } else { if (isEmpty(c1) && isEmpty(c2)) - return Collections.emptyList(); + return new ArrayList<>(0); if (isEmpty(c1) || isEmpty(c2)) { Collection c = isEmpty(c1) ? c2 : c1; 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 4259b93514b8f7..67c9b3d0bc919c 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 @@ -1778,7 +1778,11 @@ private TcpDiscoverySpiState spiStateCopy() { */ @Nullable private TcpDiscoveryNode resolveCoordinator() { synchronized (mux) { - Collection excluded = F.concat(false, failedNodes.keySet(), leavingNodes); + Collection excluded = F.concat(false, failedNodes.values(), joiningNodes); + + for (TcpDiscoveryNode node : leavingNodes) { + excluded.add(node.id()); + } return ring.coordinator(excluded); } @@ -2095,7 +2099,7 @@ void forceNextNodeFailure() { TcpDiscoveryNode next; synchronized (mux) { - next = ring.nextNode(failedNodes.keySet()); + next = ring.nextNode(failedNodes.values()); } if (next != null) @@ -3420,12 +3424,12 @@ private void sendMessageAcrossRing(TcpDiscoveryAbstractMessage msg) { sendMessageToClients(msg); - List failedNodes; + Map failedNodes; TcpDiscoverySpiState state; synchronized (mux) { - failedNodes = U.arrayList(ServerImpl.this.failedNodes.keySet()); + failedNodes = new HashMap<>(ServerImpl.this.failedNodes); state = spiState; } @@ -3442,7 +3446,7 @@ private void sendMessageAcrossRing(TcpDiscoveryAbstractMessage msg) { UUID locNodeId = getLocalNodeId(); ringLoop: while (true) { - TcpDiscoveryNode newNext = ring.nextNode(failedNodes); + TcpDiscoveryNode newNext = ring.nextNode(failedNodes.values()); if (newNext == null) { if (log.isDebugEnabled()) @@ -3563,7 +3567,7 @@ else if (log.isTraceEnabled()) else { newNextNode = false; - newNextNode(ring.nextNode(failedNodes)); + newNextNode(ring.nextNode(failedNodes.values())); } U.closeQuiet(sock); @@ -3571,7 +3575,7 @@ else if (log.isTraceEnabled()) sock = null; if (sndState.isFailed()) { - segmentLocalNodeOnSendFail(failedNodes); + segmentLocalNodeOnSendFail(failedNodes.values()); return; // Nothing to do here. } @@ -3668,7 +3672,7 @@ else if (log.isTraceEnabled()) // Fastens failure detection. if (sndState != null && sndState.checkTimeout()) { - segmentLocalNodeOnSendFail(failedNodes); + segmentLocalNodeOnSendFail(failedNodes.values()); return; // Nothing to do here. } @@ -3738,7 +3742,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs, pendingMsgs.customDiscardId); - addFailedNodes(pendingMsg, failedNodes); + addFailedNodes(pendingMsg, failedNodes.values()); if (timeoutHelper == null) timeoutHelper = serverOperationTimeoutHelper(sndState, lastRingMsgSentTime); @@ -3788,7 +3792,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof if (timeoutHelper == null) timeoutHelper = serverOperationTimeoutHelper(sndState, lastRingMsgSentTime); - addFailedNodes(msg, failedNodes); + addFailedNodes(msg, failedNodes.values()); boolean latencyCheck = msg instanceof TcpDiscoveryRingLatencyCheckMessage; @@ -3888,15 +3892,15 @@ else if (e instanceof SocketTimeoutException || if (sndState == null && spi.getEffectiveConnectionRecoveryTimeout() > 0) sndState = new CrossRingMessageSendState(); else if (sndState != null && sndState.checkTimeout()) { - segmentLocalNodeOnSendFail(failedNodes); + segmentLocalNodeOnSendFail(failedNodes.values()); return; // Nothing to do here. } boolean failedNextNode = sndState == null || sndState.markNextNodeFailed(); - if (failedNextNode && !failedNodes.contains(next)) { - failedNodes.add(next); + if (failedNextNode && !failedNodes.containsValue(next.id())) { + failedNodes.put(next, next.id()); if (state == CONNECTED) { Exception err = errs != null ? @@ -3921,7 +3925,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { else { newNextNode = false; - newNextNode(ring.nextNode(failedNodes)); + newNextNode(ring.nextNode(failedNodes.values())); } } @@ -3934,7 +3938,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { } synchronized (mux) { - failedNodes.removeAll(ServerImpl.this.failedNodes.keySet()); + failedNodes.keySet().removeAll(ServerImpl.this.failedNodes.keySet()); } if (!failedNodes.isEmpty()) { @@ -3948,16 +3952,16 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { } synchronized (mux) { - for (TcpDiscoveryNode failedNode : failedNodes) { + for (TcpDiscoveryNode failedNode : failedNodes.keySet()) { if (!ServerImpl.this.failedNodes.containsKey(failedNode)) ServerImpl.this.failedNodes.put(failedNode, locNodeId); } - for (TcpDiscoveryNode failedNode : failedNodes) + for (TcpDiscoveryNode failedNode : failedNodes.keySet()) failedNodesMsgSent.add(failedNode.id()); } - for (TcpDiscoveryNode n : failedNodes) + for (TcpDiscoveryNode n : failedNodes.keySet()) msgWorker.addMessage(new TcpDiscoveryNodeFailedMessage(locNodeId, n.id(), n.internalOrder())); if (!sent) { @@ -4013,7 +4017,7 @@ private void processPendingMessagesLocally(TcpDiscoveryAbstractMessage curMsg) { /** * Segment local node on failed message send. */ - private void segmentLocalNodeOnSendFail(List failedNodes) { + private void segmentLocalNodeOnSendFail(Collection failedNodes) { String failedNodesStr = failedNodes == null ? "" : (", failedNodes=" + failedNodes); synchronized (mux) { @@ -4050,12 +4054,12 @@ private void segmentLocalNodeOnSendFail(List failedNodes) { * @param msg Message to add failed node IDs. * @param failedNodes Failed nodes to add to the message. */ - private void addFailedNodes(TcpDiscoveryAbstractMessage msg, Collection failedNodes) { + private void addFailedNodes(TcpDiscoveryAbstractMessage msg, Collection failedNodes) { if (!failedNodes.isEmpty()) { - for (TcpDiscoveryNode failedNode : failedNodes) { + for (UUID failedNode : failedNodes) { assert !failedNode.equals(next) : failedNode; - msg.addFailedNode(failedNode.id()); + msg.addFailedNode(failedNode); } } } @@ -6843,10 +6847,10 @@ else if (req.changeTopology()) { if (ok) { // Check case when previous node suddenly died. This will speed up // node failing. - Set failed; + Collection failed; synchronized (mux) { - failed = failedNodes.keySet(); + failed = failedNodes.values(); } previous = ring.previousNode(failed); diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 6a316a9a599b68..2d5ddb4e3bfa34 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -449,7 +449,7 @@ public void clear() { * @param excluded Nodes to exclude from the search (optional). * @return Coordinator node among remaining nodes or {@code null} if all nodes are excluded. */ - @Nullable public TcpDiscoveryNode coordinator(@Nullable Collection excluded) { + @Nullable public TcpDiscoveryNode coordinator(@Nullable Collection excluded) { rwLock.readLock().lock(); try { @@ -494,7 +494,7 @@ public void clear() { * @return Next node or {@code null} if all nodes were filtered out or * topology contains less than two nodes. */ - @Nullable public TcpDiscoveryNode nextNode(@Nullable Collection excluded) { + @Nullable public TcpDiscoveryNode nextNode(@Nullable Collection excluded) { assert locNode.internalOrder() > 0 : locNode; assert excluded == null || excluded.isEmpty() || !excluded.contains(locNode) : excluded; @@ -532,7 +532,7 @@ public void clear() { * @return Previous node or {@code null} if all nodes were filtered out or * topology contains less than two nodes. */ - @Nullable public TcpDiscoveryNode previousNode(@Nullable Collection excluded) { + @Nullable public TcpDiscoveryNode previousNode(@Nullable Collection excluded) { rwLock.readLock().lock(); try { @@ -686,12 +686,12 @@ private Collection nodes(IgnitePredicate serverNodes(@Nullable final Collection excluded) { + private Collection serverNodes(@Nullable final Collection excluded) { final boolean excludedEmpty = F.isEmpty(excluded); return F.view(nodes, new P1() { @Override public boolean apply(TcpDiscoveryNode node) { - return node.clientRouterNodeId() == null && (excludedEmpty || !excluded.contains(node)); + return node.clientRouterNodeId() == null && (excludedEmpty || !excluded.contains(node.id())); } }); } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 17d435a70cbdbc..92d009b5d77d8e 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -48,15 +48,13 @@ public void testRing() throws Exception { startGrid(i); - waitForTopology(i + 1); - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); startGrid(i + 1); - - waitForTopology(i + 2); } + waitForTopology(10); + Collection nodes = grid(0).cluster().forServers().nodes(); int swithes = 0; @@ -81,15 +79,13 @@ public void testRingWithCordinatorChange() throws Exception { startGrid(i); - waitForTopology(i + 1); - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); startGrid(i + 1); - - waitForTopology(i + 2); } + waitForTopology(10); + Collection nodes = grid(0).cluster().forServers().nodes(); int swithes = 0; From a52a71c100f619a3f1d6a09727a66340ab50ffba Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 18 Nov 2025 17:44:45 +0300 Subject: [PATCH 03/86] WIP --- .../datacenter/MultiDataCenterRignTest.java | 36 +++---------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 92d009b5d77d8e..411b0793adc348 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -18,6 +18,7 @@ package org.apache.ignite.spi.discovery.datacenter; import java.util.Collection; +import java.util.concurrent.ThreadLocalRandom; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -43,43 +44,16 @@ public class MultiDataCenterRignTest extends GridCommonAbstractTest { /** */ @Test public void testRing() throws Exception { - for (int i = 0; i < 10; i += 2) { - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); - - startGrid(i); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); - - startGrid(i + 1); - } - - waitForTopology(10); - - Collection nodes = grid(0).cluster().forServers().nodes(); - - int swithes = 0; - String curDcId = null; + ThreadLocalRandom rnd = ThreadLocalRandom.current(); - for (ClusterNode node : nodes) { - if (!node.dataCenterId().equals(curDcId)){ - swithes++; + boolean order = rnd.nextBoolean(); - curDcId = node.dataCenterId(); - } - } - - assertEquals(2, swithes); - } - - /** */ - @Test - public void testRingWithCordinatorChange() throws Exception { for (int i = 0; i < 10; i += 2) { - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_0 : DC_ID_1); startGrid(i); - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_1 : DC_ID_0); startGrid(i + 1); } From bf4fc4725b019490fb73e37b637688ef59719b6b Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 18 Nov 2025 19:19:17 +0300 Subject: [PATCH 04/86] WIP --- .../spi/discovery/datacenter/MultiDataCenterRignTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 411b0793adc348..edfd3945d555c0 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -66,7 +66,7 @@ public void testRing() throws Exception { String curDcId = null; for (ClusterNode node : nodes) { - if (!node.dataCenterId().equals(curDcId)){ + if (!node.dataCenterId().equals(curDcId)) { swithes++; curDcId = node.dataCenterId(); From b2b9092dfcf1491da3d89d59817ed56634517220 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 18 Nov 2025 19:51:16 +0300 Subject: [PATCH 05/86] WIP --- .../ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index a2f818b11110d2..8496711db70473 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -27,6 +27,7 @@ import org.apache.ignite.spi.discovery.IgniteDiscoveryCacheReuseSelfTest; import org.apache.ignite.spi.discovery.LongClientConnectToClusterTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterDeploymentTest; +import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterRignTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryClientSocketTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest; import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectSslTest; @@ -184,7 +185,8 @@ TcpDiscoveryDeadNodeAddressResolvingTest.class, - MultiDataCenterDeploymentTest.class + MultiDataCenterDeploymentTest.class, + MultiDataCenterRignTest.class, }) public class IgniteSpiDiscoverySelfTestSuite { /** */ From e33f606f97e3eb36b2c5eafc93a6488c67f54cef Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 15:05:39 +0300 Subject: [PATCH 06/86] WIP --- .../org/apache/ignite/internal/util/lang/GridFunc.java | 2 +- .../org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java index 7e8bd3149580ec..8bf794062ef454 100755 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java @@ -281,7 +281,7 @@ public static Collection concat(boolean cp, @Nullable final Collection } else { if (isEmpty(c1) && isEmpty(c2)) - return new ArrayList<>(0); + return Collections.emptyList(); if (isEmpty(c1) || isEmpty(c2)) { Collection c = isEmpty(c1) ? c2 : c1; 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 67c9b3d0bc919c..bd6d4fa60602b3 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 @@ -1780,8 +1780,13 @@ private TcpDiscoverySpiState spiStateCopy() { synchronized (mux) { Collection excluded = F.concat(false, failedNodes.values(), joiningNodes); - for (TcpDiscoveryNode node : leavingNodes) { - excluded.add(node.id()); + if (!leavingNodes.isEmpty()) { + Collection leaving = new ArrayList<>(); + + for (TcpDiscoveryNode node : leavingNodes) + leaving.add(node.id()); + + excluded = F.concat(false, excluded, leaving); } return ring.coordinator(excluded); From d367510e071e923836dc625866f906d0c970289a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 15:36:07 +0300 Subject: [PATCH 07/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bd6d4fa60602b3..50db7bf306ca35 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 @@ -3904,7 +3904,7 @@ else if (sndState != null && sndState.checkTimeout()) { boolean failedNextNode = sndState == null || sndState.markNextNodeFailed(); - if (failedNextNode && !failedNodes.containsValue(next.id())) { + if (failedNextNode && !failedNodes.containsKey(next)) { failedNodes.put(next, next.id()); if (state == CONNECTED) { From dbc547597d635dd16eb33310da141cd21d0ac5a4 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 15:40:10 +0300 Subject: [PATCH 08/86] WIP --- .../discovery/datacenter/MultiDataCenterRignTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index edfd3945d555c0..0679a8a39fa041 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -48,7 +48,9 @@ public void testRing() throws Exception { boolean order = rnd.nextBoolean(); - for (int i = 0; i < 10; i += 2) { + int cnt = 10; + + for (int i = 0; i < cnt; i += 2) { System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_0 : DC_ID_1); startGrid(i); @@ -58,9 +60,11 @@ public void testRing() throws Exception { startGrid(i + 1); } - waitForTopology(10); + waitForTopology(cnt); + + Collection nodes = grid(rnd.nextInt(cnt)).cluster().forServers().nodes(); - Collection nodes = grid(0).cluster().forServers().nodes(); + assertEquals(cnt, nodes.size()); int swithes = 0; String curDcId = null; From 509cf23530284a2a23ed06199d2f24194662cece Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 15:40:52 +0300 Subject: [PATCH 09/86] WIP --- .../spi/discovery/datacenter/MultiDataCenterRignTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 0679a8a39fa041..da61e7d3f47a12 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -62,7 +62,7 @@ public void testRing() throws Exception { waitForTopology(cnt); - Collection nodes = grid(rnd.nextInt(cnt)).cluster().forServers().nodes(); + Collection nodes = grid(rnd.nextInt(cnt)).cluster().nodes(); assertEquals(cnt, nodes.size()); From 8a3cd3d5ea1aa9a68c84ddc9d6f75e27c9227d13 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 16:01:51 +0300 Subject: [PATCH 10/86] WIP --- .../spi/discovery/datacenter/MultiDataCenterRignTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index da61e7d3f47a12..04185c0654ef3e 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -78,5 +78,12 @@ public void testRing() throws Exception { } assertEquals(2, swithes); + + stopGrid(cnt - 1); + stopGrid(0); + + nodes = grid(cnt / 2).cluster().nodes(); + + assertEquals(cnt - 2, nodes.size()); } } From abc7b3e0657f405c57f6119e9c875021cf235d2a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 16:06:56 +0300 Subject: [PATCH 11/86] WIP --- .../datacenter/MultiDataCenterRignTest.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 04185c0654ef3e..e9ba57251727ab 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -66,6 +66,19 @@ public void testRing() throws Exception { assertEquals(cnt, nodes.size()); + checkSwitches(2, nodes); + + stopGrid(cnt - 1); + stopGrid(0); + + nodes = grid(cnt / 2).cluster().nodes(); + + assertEquals(cnt - 2, nodes.size()); + + checkSwitches(2, nodes); + } + + private void checkSwitches(int expected, Collection nodes){ int swithes = 0; String curDcId = null; @@ -77,13 +90,6 @@ public void testRing() throws Exception { } } - assertEquals(2, swithes); - - stopGrid(cnt - 1); - stopGrid(0); - - nodes = grid(cnt / 2).cluster().nodes(); - - assertEquals(cnt - 2, nodes.size()); + assertEquals(expected, swithes); } } From eb4e7bebc710da1a58c8911407b325c364936e31 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 19 Nov 2025 20:06:50 +0300 Subject: [PATCH 12/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 50db7bf306ca35..37e6e00261721f 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 @@ -3959,7 +3959,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { synchronized (mux) { for (TcpDiscoveryNode failedNode : failedNodes.keySet()) { if (!ServerImpl.this.failedNodes.containsKey(failedNode)) - ServerImpl.this.failedNodes.put(failedNode, locNodeId); + ServerImpl.this.failedNodes.put(failedNode, failedNode.id()); } for (TcpDiscoveryNode failedNode : failedNodes.keySet()) From 04710f382939fb68ef9e426b65049b3fd598e05c Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 20 Nov 2025 09:58:41 +0300 Subject: [PATCH 13/86] WIP --- .../spi/discovery/datacenter/MultiDataCenterRignTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index e9ba57251727ab..4dcceafb1a7219 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -78,7 +78,7 @@ public void testRing() throws Exception { checkSwitches(2, nodes); } - private void checkSwitches(int expected, Collection nodes){ + private void checkSwitches(int expected, Collection nodes) { int swithes = 0; String curDcId = null; From 5c2817e3ff7fcb6163f2e8f46e35c5567c3d5d7e Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 20 Nov 2025 10:23:29 +0300 Subject: [PATCH 14/86] WIP --- .../ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 4dcceafb1a7219..9828f094c85c7c 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -78,6 +78,7 @@ public void testRing() throws Exception { checkSwitches(2, nodes); } + /** */ private void checkSwitches(int expected, Collection nodes) { int swithes = 0; String curDcId = null; From e16f6e804216e800e0cb149dcb4e26ed335f1b5d Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 20 Nov 2025 17:33:36 +0300 Subject: [PATCH 15/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 e4ca5fd34e071e..c2aaa15b4082be 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 @@ -3945,7 +3945,8 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { } synchronized (mux) { - failedNodes.keySet().removeAll(ServerImpl.this.failedNodes.keySet()); + for (TcpDiscoveryNode node : ServerImpl.this.failedNodes.keySet()) + failedNodes.remove(node); } if (!failedNodes.isEmpty()) { From 85f67bff1bb345cbb0cef8d884270310912f5a81 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 20 Nov 2025 17:39:39 +0300 Subject: [PATCH 16/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c2aaa15b4082be..0aeb5468045201 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 @@ -3962,7 +3962,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { synchronized (mux) { for (TcpDiscoveryNode failedNode : failedNodes.keySet()) { if (!ServerImpl.this.failedNodes.containsKey(failedNode)) - ServerImpl.this.failedNodes.put(failedNode, failedNode.id()); + ServerImpl.this.failedNodes.put(failedNode, locNodeId); } for (TcpDiscoveryNode failedNode : failedNodes.keySet()) From 2c249a0006c8664ab73ed64a327f76945efed90c Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 20 Nov 2025 17:58:53 +0300 Subject: [PATCH 17/86] WIP --- .../org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 0aeb5468045201..8bf9c003af7c43 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 @@ -2438,7 +2438,7 @@ private void processMessageFailedNodes(TcpDiscoveryAbstractMessage msg) { synchronized (mux) { if (!failedNodes.containsKey(failedNode)) { - failedNodes.put(failedNode, msg.senderNodeId() != null ? msg.senderNodeId() : getLocalNodeId()); + failedNodes.put(failedNode, failedNode.id()); added = true; } @@ -3962,7 +3962,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { synchronized (mux) { for (TcpDiscoveryNode failedNode : failedNodes.keySet()) { if (!ServerImpl.this.failedNodes.containsKey(failedNode)) - ServerImpl.this.failedNodes.put(failedNode, locNodeId); + ServerImpl.this.failedNodes.put(failedNode, failedNode.id()); } for (TcpDiscoveryNode failedNode : failedNodes.keySet()) @@ -5706,7 +5706,7 @@ private void processNodeFailedMessage(TcpDiscoveryNodeFailedMessage msg) { if (!skipUpdateFailedNodes) { synchronized (mux) { if (!failedNodes.containsKey(failedNode)) - failedNodes.put(failedNode, msg.senderNodeId() != null ? msg.senderNodeId() : getLocalNodeId()); + failedNodes.put(failedNode, failedNode.id()); } } } From 1c728890b1340f8013bfa9aa26e3b36ed0b21d45 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 21 Nov 2025 15:29:49 +0300 Subject: [PATCH 18/86] WIP --- .../spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 2d5ddb4e3bfa34..cdb01f159dfbaf 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -276,9 +276,13 @@ public long maxInternalOrder() { try { if (maxInternalOrder == 0) { - TcpDiscoveryNode last = nodes.last(); + long last = 0; - return last != null ? maxInternalOrder = last.internalOrder() : -1; + for (TcpDiscoveryNode node : nodes) + if (node.internalOrder() > last) + last = node.internalOrder(); + + return last != 0 ? maxInternalOrder = last : -1; } return maxInternalOrder; From e0441ad8988fd514c2b8971e67782f92b3c2a0fd Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 21 Nov 2025 19:17:20 +0300 Subject: [PATCH 19/86] WIP --- .../spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index cdb01f159dfbaf..e2360ce15e30c9 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -276,13 +276,13 @@ public long maxInternalOrder() { try { if (maxInternalOrder == 0) { - long last = 0; + long last = -1; for (TcpDiscoveryNode node : nodes) if (node.internalOrder() > last) last = node.internalOrder(); - return last != 0 ? maxInternalOrder = last : -1; + return last != -1 ? maxInternalOrder = last : -1; } return maxInternalOrder; From 01892133b992a0db133ecd17aeaadae44f16c3a6 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 24 Nov 2025 16:44:16 +0300 Subject: [PATCH 20/86] WIP --- .../org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 8bf9c003af7c43..6cc3ca990ad1c1 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 @@ -3431,12 +3431,12 @@ private void sendMessageAcrossRing(TcpDiscoveryAbstractMessage msg) { sendMessageToClients(msg); - Map failedNodes; + TreeMap failedNodes; TcpDiscoverySpiState state; synchronized (mux) { - failedNodes = new HashMap<>(ServerImpl.this.failedNodes); + failedNodes = new TreeMap<>(ServerImpl.this.failedNodes); state = spiState; } @@ -3570,7 +3570,7 @@ else if (log.isTraceEnabled()) boolean previousNode = sndState.markLastFailedNodeAlive(); if (previousNode) - failedNodes.remove(failedNodes.size() - 1); + failedNodes.remove(failedNodes.pollFirstEntry().getKey()); else { newNextNode = false; @@ -3928,7 +3928,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { ", next=" + next + ']'); if (prev) - failedNodes.remove(failedNodes.size() - 1); + failedNodes.remove(failedNodes.pollLastEntry().getKey()); else { newNextNode = false; From 2a1810e03c2ce86345114baf4a2e0ee89e5a7212 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 24 Nov 2025 17:10:39 +0300 Subject: [PATCH 21/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 6cc3ca990ad1c1..21cd7d919a5d93 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 @@ -3570,7 +3570,7 @@ else if (log.isTraceEnabled()) boolean previousNode = sndState.markLastFailedNodeAlive(); if (previousNode) - failedNodes.remove(failedNodes.pollFirstEntry().getKey()); + failedNodes.remove(failedNodes.lastKey()); else { newNextNode = false; @@ -3928,7 +3928,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { ", next=" + next + ']'); if (prev) - failedNodes.remove(failedNodes.pollLastEntry().getKey()); + failedNodes.remove(failedNodes.lastKey()); else { newNextNode = false; From 8f6f0280421848267e0d93d684c22690037f7326 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 25 Nov 2025 16:27:23 +0300 Subject: [PATCH 22/86] WIP --- .../tcp/TcpDiscoveryMdcSelfTest.java | 59 +++++++++++++++++++ .../IgniteSpiDiscoverySelfTestSuite.java | 4 ++ 2 files changed, 63 insertions(+) create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java new file mode 100644 index 00000000000000..627fa533c5826e --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java @@ -0,0 +1,59 @@ +/* + * 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.spi.discovery.tcp; + +import java.util.concurrent.ThreadLocalRandom; +import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * Test for {@link TcpDiscoverySpi} with Multi Data Centers. + */ +public class TcpDiscoveryMdcSelfTest extends TcpDiscoverySelfTest { + /** */ + private static final String DC_ID_0 = "DC0"; + + /** */ + private static final String DC_ID_1 = "DC1"; + + /** + * @throws Exception If fails. + */ + public TcpDiscoveryMdcSelfTest() throws Exception { + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + ThreadLocalRandom rnd = ThreadLocalRandom.current(); + + boolean order = rnd.nextBoolean(); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_0 : DC_ID_1); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index e8334af5f631d8..dafe00524ecd37 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -49,6 +49,7 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryFailedJoinTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; @@ -165,6 +166,9 @@ TcpDiscoverySslTrustedUntrustedTest.class, TcpDiscoverySslParametersTest.class, + // MDC. + TcpDiscoveryMdcSelfTest.class, + // Disco cache reuse. IgniteDiscoveryCacheReuseSelfTest.class, From 8fb697af9600bd476561c4774118e05ece809e3b Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 25 Nov 2025 17:10:18 +0300 Subject: [PATCH 23/86] WIP --- .../ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index dafe00524ecd37..a51faf20a6b22b 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -166,9 +166,6 @@ TcpDiscoverySslTrustedUntrustedTest.class, TcpDiscoverySslParametersTest.class, - // MDC. - TcpDiscoveryMdcSelfTest.class, - // Disco cache reuse. IgniteDiscoveryCacheReuseSelfTest.class, @@ -190,6 +187,8 @@ TcpDiscoveryDeadNodeAddressResolvingTest.class, + // MDC. + TcpDiscoveryMdcSelfTest.class, MultiDataCenterDeploymentTest.class, MultiDataCenterRignTest.class, MultiDataCenterClientRoutingTest.class, From 790ecd5d00a127b493203f9a220fe14ae59264f2 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 25 Nov 2025 18:05:47 +0300 Subject: [PATCH 24/86] WIP --- .../ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java index 627fa533c5826e..aab3eb8dd4dea9 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java @@ -17,7 +17,7 @@ package org.apache.ignite.spi.discovery.tcp; -import java.util.concurrent.ThreadLocalRandom; +import java.util.Objects; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.configuration.IgniteConfiguration; @@ -41,11 +41,9 @@ public TcpDiscoveryMdcSelfTest() throws Exception { @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - ThreadLocalRandom rnd = ThreadLocalRandom.current(); + String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); - boolean order = rnd.nextBoolean(); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_0 : DC_ID_1); + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, Objects.equals(prev, DC_ID_1) ? DC_ID_0 : DC_ID_1); return cfg; } From d8355438c07c643d84f8e6fba6f43df33b066ad5 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 15:24:53 +0300 Subject: [PATCH 25/86] WIP --- ...java => TcpDiscoveryMdcSelfPlainTest.java} | 7 +-- ...overyMdcSelfWithCoordinatorChangeTest.java | 56 +++++++++++++++++++ .../IgniteSpiDiscoverySelfTestSuite.java | 6 +- 3 files changed, 63 insertions(+), 6 deletions(-) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcSelfTest.java => TcpDiscoveryMdcSelfPlainTest.java} (89%) create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java similarity index 89% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java index aab3eb8dd4dea9..2493529dabd96f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java @@ -17,14 +17,13 @@ package org.apache.ignite.spi.discovery.tcp; -import java.util.Objects; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.configuration.IgniteConfiguration; /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers. */ -public class TcpDiscoveryMdcSelfTest extends TcpDiscoverySelfTest { +public class TcpDiscoveryMdcSelfPlainTest extends TcpDiscoverySelfTest { /** */ private static final String DC_ID_0 = "DC0"; @@ -34,7 +33,7 @@ public class TcpDiscoveryMdcSelfTest extends TcpDiscoverySelfTest { /** * @throws Exception If fails. */ - public TcpDiscoveryMdcSelfTest() throws Exception { + public TcpDiscoveryMdcSelfPlainTest() throws Exception { } /** {@inheritDoc} */ @@ -43,7 +42,7 @@ public TcpDiscoveryMdcSelfTest() throws Exception { String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, Objects.equals(prev, DC_ID_1) ? DC_ID_0 : DC_ID_1); + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_0 : DC_ID_1); return cfg; } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java new file mode 100644 index 00000000000000..c6b1cd5e11969a --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -0,0 +1,56 @@ +/* + * 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.spi.discovery.tcp; + +import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * Test for {@link TcpDiscoverySpi} with Multi Data Centers. + */ +public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoverySelfTest { + /** */ + private static final String DC_ID_0 = "DC0"; + + /** */ + private static final String DC_ID_1 = "DC1"; + + /** + * @throws Exception If fails. + */ + public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index a51faf20a6b22b..01102482b72b30 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -49,7 +49,8 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryFailedJoinTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfPlainTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfWithCoordinatorChangeTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; @@ -188,7 +189,8 @@ TcpDiscoveryDeadNodeAddressResolvingTest.class, // MDC. - TcpDiscoveryMdcSelfTest.class, + TcpDiscoveryMdcSelfPlainTest.class, + TcpDiscoveryMdcSelfWithCoordinatorChangeTest.class, MultiDataCenterDeploymentTest.class, MultiDataCenterRignTest.class, MultiDataCenterClientRoutingTest.class, From c977447b86e4d10db910878cbb746a1ad673dee1 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 16:51:37 +0300 Subject: [PATCH 26/86] WIP --- .../tcp/TcpDiscoveryMdcSelfPlainTest.java | 4 ++-- ...DiscoveryMdcSelfWithCoordinatorChangeTest.java | 15 +-------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java index 2493529dabd96f..c5d082109ab204 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java @@ -25,10 +25,10 @@ */ public class TcpDiscoveryMdcSelfPlainTest extends TcpDiscoverySelfTest { /** */ - private static final String DC_ID_0 = "DC0"; + protected static final String DC_ID_0 = "DC0"; /** */ - private static final String DC_ID_1 = "DC1"; + protected static final String DC_ID_1 = "DC1"; /** * @throws Exception If fails. diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index c6b1cd5e11969a..c8fbe0c0640633 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -23,13 +23,7 @@ /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers. */ -public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoverySelfTest { - /** */ - private static final String DC_ID_0 = "DC0"; - - /** */ - private static final String DC_ID_1 = "DC1"; - +public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoveryMdcSelfPlainTest { /** * @throws Exception If fails. */ @@ -46,11 +40,4 @@ public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { return cfg; } - - /** {@inheritDoc} */ - @Override protected void afterTest() throws Exception { - super.afterTest(); - - System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); - } } From 772c3d331f52ba81bcc07cca5e9f883673bf635d Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 17:07:47 +0300 Subject: [PATCH 27/86] WIP --- .../tcp/TcpDiscoveryMdcSelfPlainTest.java | 8 ++- ...overyMdcSelfWithCoordinatorChangeTest.java | 58 ++++++++++++++++--- .../discovery/tcp/TcpDiscoverySelfTest.java | 12 ++-- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java index c5d082109ab204..f651f4205e8eda 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java @@ -40,11 +40,15 @@ public TcpDiscoveryMdcSelfPlainTest() throws Exception { @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + applyDC(); + + return cfg; + } + + protected void applyDC(){ String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_0 : DC_ID_1); - - return cfg; } /** {@inheritDoc} */ diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index c8fbe0c0640633..052651017caa6f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -17,11 +17,13 @@ package org.apache.ignite.spi.discovery.tcp; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteSystemProperties; -import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.CacheConfiguration; +import org.junit.Test; /** - * Test for {@link TcpDiscoverySpi} with Multi Data Centers. + * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. */ public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoveryMdcSelfPlainTest { /** @@ -30,14 +32,56 @@ public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoveryMd public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { } - /** {@inheritDoc} */ - @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { - IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - + @Override protected void applyDC(){ String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); + } + + /** + * @throws Exception If failed. + */ + @Test + @Override public void testDiscoveryEventsDiscard() throws Exception { + try { + // disable metrics to avoid sending metrics messages as they may mess with pending messages counting. + metricsEnabled = false; + + TestEventDiscardSpi spi = new TestEventDiscardSpi(); + + Ignite ignite0 = startGrid(0); + + nodeSpi.set(spi); + + startGrid(1); + + ignite0.createCache(new CacheConfiguration<>(DEFAULT_CACHE_NAME)); // Send custom message. + + ignite0.destroyCache(DEFAULT_CACHE_NAME); // Send custom message. + + // We need to wait for discartion of pending messages from asynchronous processes like removing cache + // metrics from DMS. Initially the test was correct as createCache/destroyCache methods are synchronous + // and block test-runner thread for long enough for pending messages to be discarded. + // But at some point aforementioned operations were added and implicit assumption the test relies on was broken. + boolean pendingMsgsDiscarded = waitPendingMessagesDiscarded(spi); + assertTrue(pendingMsgsDiscarded); + + stopGrid(0); + + log.info("Start new node."); + + spi.checkDuplicates = true; + + startGrid(0); + + spi.checkDuplicates = false; + + assertFalse(spi.failed); + } + finally { + stopAllGrids(); - return cfg; + metricsEnabled = true; + } } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 3195284ba92621..f1fed3f12a486a 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -124,10 +124,10 @@ public class TcpDiscoverySelfTest extends GridCommonAbstractTest { private UUID nodeId; /** Flag to disable metrics for some tests. */ - private boolean metricsEnabled = true; + protected boolean metricsEnabled = true; /** */ - private static ThreadLocal nodeSpi = new ThreadLocal<>(); + protected static ThreadLocal nodeSpi = new ThreadLocal<>(); /** */ private GridStringLogger strLog; @@ -1947,7 +1947,7 @@ public void testFailedCoordinatorNodeNoopSegmentationPolicy() throws Exception { * @return {@code true} If pending messages were discarded in a timeout period. * @throws IgniteInterruptedCheckedException If wait was interrupted. */ - private boolean waitPendingMessagesDiscarded(TcpDiscoverySpi spi) throws IgniteInterruptedCheckedException { + protected boolean waitPendingMessagesDiscarded(TcpDiscoverySpi spi) throws IgniteInterruptedCheckedException { Iterable pendingMsgsIterable = GridTestUtils.getFieldValue(spi.impl, "msgWorker", "pendingMsgs"); return GridTestUtils.waitForCondition(() -> !pendingMsgsIterable.iterator().hasNext(), 1000); @@ -2566,15 +2566,15 @@ else if (msg instanceof TcpDiscoveryNodeAddFinishedMessage) /** * */ - private static class TestEventDiscardSpi extends TcpDiscoverySpi { + protected static class TestEventDiscardSpi extends TcpDiscoverySpi { /** */ private GridConcurrentHashSet msgIds = new GridConcurrentHashSet<>(); /** */ - private volatile boolean checkDuplicates; + protected volatile boolean checkDuplicates; /** */ - private volatile boolean failed; + protected volatile boolean failed; /** {@inheritDoc} */ @Override protected void writeMessage(TcpDiscoveryIoSession ses, From 8cd74c6b4612535f555a897198e602496ea60211 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 17:08:39 +0300 Subject: [PATCH 28/86] WIP --- .../ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index f1fed3f12a486a..85c878ac2b19e6 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -2151,9 +2151,9 @@ public void testSystemMarshallerTypesFilteredOut() throws Exception { try { nodeSpi.set(new TestTcpDiscoveryMarshallerDataSpi()); - Ignite srv1 = startGrid(0); + Ignite srv0 = startGrid(0); - IgniteCache organizations = srv1.createCache("organizations"); + IgniteCache organizations = srv0.createCache("organizations"); organizations.put(1, new Organization()); @@ -2163,7 +2163,7 @@ public void testSystemMarshallerTypesFilteredOut() throws Exception { + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, 1, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); - IgniteCache employees = srv1.createCache("employees"); + IgniteCache employees = srv0.createCache("employees"); employees.put(1, new Employee()); From ac2a7625cab47823cb66f46d6a230ebe6d531942 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 17:20:18 +0300 Subject: [PATCH 29/86] WIP --- .../apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 85c878ac2b19e6..c477341ccf10b7 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -2159,6 +2159,8 @@ public void testSystemMarshallerTypesFilteredOut() throws Exception { startGrid(1); + awaitPartitionMapExchange(); + assertEquals("Expected items in marshaller discovery data: 1, actual: " + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, 1, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); From 4a82bfb657eb21e27dc8b459b4f4d1db1af60a71 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 17:26:17 +0300 Subject: [PATCH 30/86] WIP --- .../apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index c477341ccf10b7..877157c3cd9bb9 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -1182,7 +1182,7 @@ public void testDuplicateId() throws Exception { // Duplicate ID. GridTestUtils.assertThrows( log, - new Callable() { + new Callable<>() { @Nullable @Override public Object call() throws Exception { // Exception will be thrown and output to log. startGrid(3); From 5bc605d970169a71d887cb17baff8facd6d0d3d6 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 26 Nov 2025 17:34:09 +0300 Subject: [PATCH 31/86] WIP --- ...overyMdcSelfWithCoordinatorChangeTest.java | 38 +++++++++++++++++++ .../discovery/tcp/TcpDiscoverySelfTest.java | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index 052651017caa6f..0f0240985aafbf 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -17,9 +17,14 @@ package org.apache.ignite.spi.discovery.tcp; +import java.util.UUID; +import java.util.concurrent.Callable; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.testframework.GridTestUtils; +import org.jetbrains.annotations.Nullable; import org.junit.Test; /** @@ -84,4 +89,37 @@ public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { metricsEnabled = true; } } + + /** + * @throws Exception If any error occurs. + */ + @Test + @Override public void testDuplicateId() throws Exception { + try { + // Random ID. + startGrid(0); + startGrid(1); + + nodeId = UUID.randomUUID(); + + startGrid(2); + + // Duplicate ID. + GridTestUtils.assertThrows( + log, + new Callable<>() { + @Nullable @Override public Object call() throws Exception { + // Exception will be thrown and output to log. + startGrid(3); + + return null; + } + }, + IgniteCheckedException.class, + null); + } + finally { + stopAllGrids(); + } + } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 877157c3cd9bb9..384e3f97b9ac5f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -121,7 +121,7 @@ public class TcpDiscoverySelfTest extends GridCommonAbstractTest { private Map discoMap = new HashMap<>(); /** */ - private UUID nodeId; + protected UUID nodeId; /** Flag to disable metrics for some tests. */ protected boolean metricsEnabled = true; From 8e9c706e5222958eb20274fd8a3720df50e32e4b Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 16:58:45 +0300 Subject: [PATCH 32/86] WIP --- .../datacenter/MultiDataCenterRignTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java index 9828f094c85c7c..8cf437562b6e0e 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java @@ -93,4 +93,16 @@ private void checkSwitches(int expected, Collection nodes) { assertEquals(expected, swithes); } + + /** */ + @Test + public void testCoordinatorChangeOnJoin() throws Exception { + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); + startGrid(0); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); + startGrid(1); + + awaitPartitionMapExchange(); + } } From fc4051f6ffb04423b4cb1391ddffbb4500b452e0 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 19:50:02 +0300 Subject: [PATCH 33/86] WIP --- .../dht/topology/GridDhtPartitionTopologyImpl.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java index 8227e161728142..ecd2f8932a5fa8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java @@ -433,7 +433,7 @@ else if (added) for (int p = 0; p < partitions; p++) { if (localNode(p, affAssignment)) { // Partition is created first time, so it's safe to own it. - boolean shouldOwn = locParts.get(p) == null; + boolean shouldOwn = locParts.get(p) == null && added; GridDhtLocalPartition locPart = getOrCreatePartition(p); @@ -444,6 +444,15 @@ else if (added) log.debug("Partition has been owned (created first time) " + "[grp=" + grp.cacheOrGroupName() + ", p=" + locPart.id() + ']'); } + else { + List> ideal = ctx.affinity().affinity(groupId()).idealAssignmentRaw(); + ctx.cache().context().affinity().addToWaitGroup( + groupId(), + p, + topologyVersionFuture().initialVersion(), + ideal.get(p) + ); + } needRefresh = true; From c40455f287cab1346b6d97ea479fc99fd033a1fd Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 19:50:33 +0300 Subject: [PATCH 34/86] WIP --- .../distributed/dht/topology/GridDhtPartitionTopologyImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java index ecd2f8932a5fa8..a0bcba38d0a97f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java @@ -446,6 +446,7 @@ else if (added) } else { List> ideal = ctx.affinity().affinity(groupId()).idealAssignmentRaw(); + ctx.cache().context().affinity().addToWaitGroup( groupId(), p, From fdd04eb5f9f71f32538a7a85bd327c86edafec3a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 19:52:34 +0300 Subject: [PATCH 35/86] WIP --- .../dht/topology/GridDhtPartitionTopologyImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java index a0bcba38d0a97f..2fa328ca179eb8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java @@ -453,6 +453,10 @@ else if (added) topologyVersionFuture().initialVersion(), ideal.get(p) ); + + if (log.isDebugEnabled()) + log.debug("Partition has been marked as moving (created not first time) " + + "[grp=" + grp.cacheOrGroupName() + ", p=" + locPart.id() + ']'); } needRefresh = true; From 089ab1383de9aa8f94b6b9f644b2cc2b5b500dad Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 19:57:57 +0300 Subject: [PATCH 36/86] WIP --- .../ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java | 3 ++- .../tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java index f651f4205e8eda..a7e45e9f266344 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java @@ -45,7 +45,8 @@ public TcpDiscoveryMdcSelfPlainTest() throws Exception { return cfg; } - protected void applyDC(){ + /** */ + protected void applyDC() { String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_0 : DC_ID_1); diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index 0f0240985aafbf..e94e527530aa10 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -37,7 +37,8 @@ public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoveryMd public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { } - @Override protected void applyDC(){ + /** */ + @Override protected void applyDC() { String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); From e83a227b7b116e936091fc388736b84143d31526 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 20:03:25 +0300 Subject: [PATCH 37/86] WIP --- .../ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 384e3f97b9ac5f..30400852024a7f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -2159,8 +2159,6 @@ public void testSystemMarshallerTypesFilteredOut() throws Exception { startGrid(1); - awaitPartitionMapExchange(); - assertEquals("Expected items in marshaller discovery data: 1, actual: " + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, 1, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); @@ -2385,7 +2383,7 @@ static class DummyPredicate implements IgniteBiPredicate { * SPI used in {@link #testSystemMarshallerTypesFilteredOut()} test to check that only * user types get to discovery messages on joining new nodes. */ - private static class TestTcpDiscoveryMarshallerDataSpi extends TcpDiscoverySpi { + protected static class TestTcpDiscoveryMarshallerDataSpi extends TcpDiscoverySpi { /** Marshalled items. */ static volatile int marshalledItems; @@ -2419,12 +2417,12 @@ private Map getJavaMappings(List allMappings) { /** * User class used in {@link #testSystemMarshallerTypesFilteredOut()} test to feed into marshaller cache. */ - private static class Organization { } + protected static class Organization { } /** * User class used in {@link #testSystemMarshallerTypesFilteredOut()} test to feed into marshaller cache. */ - private static class Employee { } + protected static class Employee { } /** * From 75c73c128945601b47f2e2ce3787e4d7578fa2fe Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 20:10:04 +0300 Subject: [PATCH 38/86] WIP --- ...overyMdcSelfWithCoordinatorChangeTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index e94e527530aa10..3147016ac83987 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -20,6 +20,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.configuration.CacheConfiguration; @@ -123,4 +124,39 @@ public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { stopAllGrids(); } } + + /** + * Test verifies Ignite nodes don't exchange system types on discovery phase but only user types. + */ + @Test + @Override public void testSystemMarshallerTypesFilteredOut() throws Exception { + try { + nodeSpi.set(new TestTcpDiscoveryMarshallerDataSpi()); + + Ignite srv0 = startGrid(0); + + IgniteCache organizations = srv0.createCache("organizations"); + + organizations.put(1, new Organization()); + + startGrid(1); + + assertEquals("Expected items in marshaller discovery data: 1, actual: " + + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, + 1, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); + + IgniteCache employees = srv0.createCache("employees"); + + employees.put(1, new Employee()); + + startGrid(2); + + assertEquals("Expected items in marshaller discovery data: 2, actual: " + + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, + 2, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); + } + finally { + stopAllGrids(); + } + } } From 908fa0184c9ad079664f38396955a92392789e0c Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 20:25:59 +0300 Subject: [PATCH 39/86] WIP --- ...overyMdcSelfWithCoordinatorChangeTest.java | 87 +++++++++++++++++++ .../discovery/tcp/TcpDiscoverySelfTest.java | 4 +- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index 3147016ac83987..aa9064a24eaf8e 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -19,15 +19,26 @@ import java.util.UUID; import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.events.DiscoveryEvent; +import org.apache.ignite.events.Event; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.lang.IgnitePredicate; +import org.apache.ignite.plugin.segmentation.SegmentationPolicy; import org.apache.ignite.testframework.GridTestUtils; import org.jetbrains.annotations.Nullable; import org.junit.Test; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; +import static org.apache.ignite.events.EventType.EVT_NODE_SEGMENTED; + /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. */ @@ -159,4 +170,80 @@ public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { stopAllGrids(); } } + + /** + * @throws Exception If failed. + */ + @Test + @Override public void testFailedCoordinatorNodeNoopSegmentationPolicy() throws Exception { + checkFailedCoordinatorNode(SegmentationPolicy.NOOP); + } + + /** + * @param segPlc Segmentation policy. + * @throws Exception If failed. + */ + private void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { + try { + this.segPlc = segPlc; + + for (int i = 0; i < 4; i++) + startGrid(i); + + IgniteEx coord = grid(1); + + UUID coordId = coord.localNode().id(); + + IgniteEx ignite = grid(2); + + AtomicBoolean coordSegmented = new AtomicBoolean(); + + coord.events().localListen(evt -> { + assertEquals(EVT_NODE_SEGMENTED, evt.type()); + + UUID nodeId = ((DiscoveryEvent)evt).eventNode().id(); + + if (coordId.equals(nodeId)) + coordSegmented.set(true); + + return true; + }, EVT_NODE_SEGMENTED); + + CountDownLatch failedLatch = new CountDownLatch(2); + + IgnitePredicate failLsnr = evt -> { + assertEquals(EVT_NODE_FAILED, evt.type()); + + UUID nodeId = ((DiscoveryEvent)evt).eventNode().id(); + + if (coordId.equals(nodeId)) + failedLatch.countDown(); + + return true; + }; + + ignite.events().localListen(failLsnr, EVT_NODE_FAILED); + + grid(3).events().localListen(failLsnr, EVT_NODE_FAILED); + + ignite.configuration().getDiscoverySpi().failNode(coordId, null); + + assertTrue(failedLatch.await(2000, MILLISECONDS)); + + assertTrue(coordSegmented.get()); + + if (segPlc == SegmentationPolicy.STOP) { + assertTrue(coord.context().isStopping()); + + waitNodeStop(coord.name()); + } + else + assertFalse(coord.context().isStopping()); + + assertEquals(3, ignite.context().discovery().allNodes().size()); + } + finally { + stopAllGrids(); + } + } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 30400852024a7f..d84658dda93e93 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -136,7 +136,7 @@ public class TcpDiscoverySelfTest extends GridCommonAbstractTest { private CacheConfiguration[] ccfgs; /** */ - private SegmentationPolicy segPlc; + protected SegmentationPolicy segPlc; /** */ private ListeningTestLogger testLog; @@ -2328,7 +2328,7 @@ public void testCheckRingLatency() throws Exception { * @param nodeName Node name. * @throws Exception If failed. */ - private void waitNodeStop(final String nodeName) throws Exception { + protected void waitNodeStop(final String nodeName) throws Exception { boolean wait = GridTestUtils.waitForCondition(new GridAbsPredicate() { @Override public boolean apply() { try { From d2d420287ed4e39ace0f463720a8ce45be2d5a29 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 27 Nov 2025 20:27:02 +0300 Subject: [PATCH 40/86] WIP --- .../TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java | 10 +--------- .../ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index aa9064a24eaf8e..51a90100f6b200 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -171,19 +171,11 @@ public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { } } - /** - * @throws Exception If failed. - */ - @Test - @Override public void testFailedCoordinatorNodeNoopSegmentationPolicy() throws Exception { - checkFailedCoordinatorNode(SegmentationPolicy.NOOP); - } - /** * @param segPlc Segmentation policy. * @throws Exception If failed. */ - private void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { + @Override protected void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { try { this.segPlc = segPlc; diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index d84658dda93e93..e6f661a3738516 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -1957,7 +1957,7 @@ protected boolean waitPendingMessagesDiscarded(TcpDiscoverySpi spi) throws Ignit * @param segPlc Segmentation policy. * @throws Exception If failed. */ - private void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { + protected void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { try { this.segPlc = segPlc; From 4297d156bde33f220e5ce674aca02683c5c6d01d Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 28 Nov 2025 15:09:16 +0300 Subject: [PATCH 41/86] WIP --- ...eryMdcPlainPendingMessageDeliveryTest.java | 56 +++++++++++++++ ...natorChangePendingMessageDeliveryTest.java | 70 +++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java new file mode 100644 index 00000000000000..1abf3509c3f9c4 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java @@ -0,0 +1,56 @@ +/* + * 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.spi.discovery.tcp; + +import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class TcpDiscoveryMdcPlainPendingMessageDeliveryTest extends TcpDiscoveryPendingMessageDeliveryTest { + /** */ + protected static final String DC_ID_0 = "DC0"; + + /** */ + protected static final String DC_ID_1 = "DC1"; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + applyDC(); + + return cfg; + } + + /** */ + protected void applyDC() { + String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_0 : DC_ID_1); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + } +} + diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java new file mode 100644 index 00000000000000..93b20947f68fc9 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java @@ -0,0 +1,70 @@ +/* + * 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.spi.discovery.tcp; + +import org.apache.ignite.IgniteSystemProperties; +import org.junit.Test; + +/** + * + */ +public class TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest extends TcpDiscoveryMdcPlainPendingMessageDeliveryTest { + /** + * @throws Exception If fails. + */ + public TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest() throws Exception { + } + + /** */ + @Override protected void applyDC() { + String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); + } + + /** + * @throws Exception If failed. + */ + @Test + @Override public void testPendingMessagesOverflow() throws Exception { + startGrid(0); + + super.testPendingMessagesOverflow(); + } + + /** + * @throws Exception If failed. + */ + @Test + @Override public void testCustomMessageInSingletonCluster() throws Exception { + startGrid(0); + + super.testCustomMessageInSingletonCluster(); + } + + /** + * @throws Exception If failed. + */ + @Test + @Override public void testDeliveryAllFailedMessagesInCorrectOrder() throws Exception { + startGrid(0); + + super.testDeliveryAllFailedMessagesInCorrectOrder(); + } +} + From 3771a7cfb292e248a01483035beac7fec5c16fbb Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 28 Nov 2025 15:11:11 +0300 Subject: [PATCH 42/86] WIP --- ...overyMdcSelfWithCoordinatorChangeTest.java | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java index 51a90100f6b200..1c8f0aa15bed75 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java @@ -18,12 +18,10 @@ package org.apache.ignite.spi.discovery.tcp; import java.util.UUID; -import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; -import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.events.DiscoveryEvent; @@ -31,8 +29,6 @@ import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.plugin.segmentation.SegmentationPolicy; -import org.apache.ignite.testframework.GridTestUtils; -import org.jetbrains.annotations.Nullable; import org.junit.Test; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -109,27 +105,9 @@ public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { @Test @Override public void testDuplicateId() throws Exception { try { - // Random ID. startGrid(0); - startGrid(1); - - nodeId = UUID.randomUUID(); - - startGrid(2); - // Duplicate ID. - GridTestUtils.assertThrows( - log, - new Callable<>() { - @Nullable @Override public Object call() throws Exception { - // Exception will be thrown and output to log. - startGrid(3); - - return null; - } - }, - IgniteCheckedException.class, - null); + super.testDuplicateId(); } finally { stopAllGrids(); From 271d2fcad03b598f65d53b447519618473f8544b Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 28 Nov 2025 15:13:48 +0300 Subject: [PATCH 43/86] WIP --- .../ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index 01102482b72b30..04ab4204e78da3 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -49,8 +49,10 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryFailedJoinTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainPendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfPlainTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfWithCoordinatorChangeTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; @@ -191,6 +193,8 @@ // MDC. TcpDiscoveryMdcSelfPlainTest.class, TcpDiscoveryMdcSelfWithCoordinatorChangeTest.class, + TcpDiscoveryMdcPlainPendingMessageDeliveryTest.class, + TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.class, MultiDataCenterDeploymentTest.class, MultiDataCenterRignTest.class, MultiDataCenterClientRoutingTest.class, From 56913efc814a50e193d56f24d16dcebb89b4b3e6 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 28 Nov 2025 17:26:27 +0300 Subject: [PATCH 44/86] WIP --- .../distributed/dht/topology/GridDhtPartitionTopologyImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java index 2fa328ca179eb8..50065a86961777 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java @@ -433,7 +433,7 @@ else if (added) for (int p = 0; p < partitions; p++) { if (localNode(p, affAssignment)) { // Partition is created first time, so it's safe to own it. - boolean shouldOwn = locParts.get(p) == null && added; + boolean shouldOwn = discoCache.allNodes().size() == 1; GridDhtLocalPartition locPart = getOrCreatePartition(p); From 3be87f63bea275e0208c09f7ad524bb5c62e7e8c Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 28 Nov 2025 19:28:13 +0300 Subject: [PATCH 45/86] WIP --- .../topology/GridDhtPartitionTopologyImpl.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java index 50065a86961777..8227e161728142 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java @@ -433,7 +433,7 @@ else if (added) for (int p = 0; p < partitions; p++) { if (localNode(p, affAssignment)) { // Partition is created first time, so it's safe to own it. - boolean shouldOwn = discoCache.allNodes().size() == 1; + boolean shouldOwn = locParts.get(p) == null; GridDhtLocalPartition locPart = getOrCreatePartition(p); @@ -444,20 +444,6 @@ else if (added) log.debug("Partition has been owned (created first time) " + "[grp=" + grp.cacheOrGroupName() + ", p=" + locPart.id() + ']'); } - else { - List> ideal = ctx.affinity().affinity(groupId()).idealAssignmentRaw(); - - ctx.cache().context().affinity().addToWaitGroup( - groupId(), - p, - topologyVersionFuture().initialVersion(), - ideal.get(p) - ); - - if (log.isDebugEnabled()) - log.debug("Partition has been marked as moving (created not first time) " + - "[grp=" + grp.cacheOrGroupName() + ", p=" + locPart.id() + ']'); - } needRefresh = true; From 42ff4c7192f5ac053a5de11231c9e0803cf52cf9 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 16:07:36 +0300 Subject: [PATCH 46/86] WIP --- .../GridCachePartitionExchangeManager.java | 2 +- .../GridDhtPartitionsExchangeFuture.java | 2 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 68 ++++++++----------- .../tcp/internal/TcpDiscoveryNodesRing.java | 13 ++-- 4 files changed, 38 insertions(+), 47 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java index bbc2e78bbb4c0c..827e05b90062d1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java @@ -3128,7 +3128,7 @@ else if (task instanceof ForceRebalanceExchangeTask) { if (!crd) { List srvNodes = exchFut.firstEventCache().serverNodes(); - crd = newCrd = !srvNodes.isEmpty() && srvNodes.get(0).isLocal(); + crd = newCrd = !srvNodes.isEmpty() && U.oldest(srvNodes, null).isLocal(); } if (!exchFut.changedAffinity()) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java index 3456d33cbab19b..271e657edf49ab 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java @@ -907,7 +907,7 @@ public void init(boolean newCrd) throws IgniteInterruptedCheckedException { remaining.addAll(nodeIds(F.view(srvNodes, remoteNodes(cctx.localNodeId())))); - crd = srvNodes.isEmpty() ? null : srvNodes.get(0); + crd = srvNodes.isEmpty() ? null : U.oldest(srvNodes, null); boolean crdNode = crd != null && crd.isLocal(); 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 21cd7d919a5d93..d2ddf1a22065a0 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 @@ -1780,16 +1780,7 @@ private TcpDiscoverySpiState spiStateCopy() { */ @Nullable private TcpDiscoveryNode resolveCoordinator() { synchronized (mux) { - Collection excluded = F.concat(false, failedNodes.values(), joiningNodes); - - if (!leavingNodes.isEmpty()) { - Collection leaving = new ArrayList<>(); - - for (TcpDiscoveryNode node : leavingNodes) - leaving.add(node.id()); - - excluded = F.concat(false, excluded, leaving); - } + Collection excluded = F.concat(false, failedNodes.keySet(), leavingNodes); return ring.coordinator(excluded); } @@ -2106,7 +2097,7 @@ void forceNextNodeFailure() { TcpDiscoveryNode next; synchronized (mux) { - next = ring.nextNode(failedNodes.values()); + next = ring.nextNode(failedNodes.keySet()); } if (next != null) @@ -2438,7 +2429,7 @@ private void processMessageFailedNodes(TcpDiscoveryAbstractMessage msg) { synchronized (mux) { if (!failedNodes.containsKey(failedNode)) { - failedNodes.put(failedNode, failedNode.id()); + failedNodes.put(failedNode, msg.senderNodeId() != null ? msg.senderNodeId() : getLocalNodeId()); added = true; } @@ -3431,12 +3422,12 @@ private void sendMessageAcrossRing(TcpDiscoveryAbstractMessage msg) { sendMessageToClients(msg); - TreeMap failedNodes; + List failedNodes; TcpDiscoverySpiState state; synchronized (mux) { - failedNodes = new TreeMap<>(ServerImpl.this.failedNodes); + failedNodes = U.arrayList(ServerImpl.this.failedNodes.keySet()); state = spiState; } @@ -3453,7 +3444,7 @@ private void sendMessageAcrossRing(TcpDiscoveryAbstractMessage msg) { UUID locNodeId = getLocalNodeId(); ringLoop: while (true) { - TcpDiscoveryNode newNext = ring.nextNode(failedNodes.values()); + TcpDiscoveryNode newNext = ring.nextNode(failedNodes); if (newNext == null) { if (log.isDebugEnabled()) @@ -3570,11 +3561,11 @@ else if (log.isTraceEnabled()) boolean previousNode = sndState.markLastFailedNodeAlive(); if (previousNode) - failedNodes.remove(failedNodes.lastKey()); + failedNodes.remove(failedNodes.size() - 1); else { newNextNode = false; - newNextNode(ring.nextNode(failedNodes.values())); + newNextNode(ring.nextNode(failedNodes)); } U.closeQuiet(sock); @@ -3582,7 +3573,7 @@ else if (log.isTraceEnabled()) sock = null; if (sndState.isFailed()) { - segmentLocalNodeOnSendFail(failedNodes.values()); + segmentLocalNodeOnSendFail(failedNodes); return; // Nothing to do here. } @@ -3679,7 +3670,7 @@ else if (log.isTraceEnabled()) // Fastens failure detection. if (sndState != null && sndState.checkTimeout()) { - segmentLocalNodeOnSendFail(failedNodes.values()); + segmentLocalNodeOnSendFail(failedNodes); return; // Nothing to do here. } @@ -3749,7 +3740,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs, pendingMsgs.customDiscardId); - addFailedNodes(pendingMsg, failedNodes.values()); + addFailedNodes(pendingMsg, failedNodes); if (timeoutHelper == null) timeoutHelper = serverOperationTimeoutHelper(sndState, lastRingMsgSentTime); @@ -3799,7 +3790,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof if (timeoutHelper == null) timeoutHelper = serverOperationTimeoutHelper(sndState, lastRingMsgSentTime); - addFailedNodes(msg, failedNodes.values()); + addFailedNodes(msg, failedNodes); boolean latencyCheck = msg instanceof TcpDiscoveryRingLatencyCheckMessage; @@ -3899,15 +3890,15 @@ else if (e instanceof SocketTimeoutException || if (sndState == null && spi.getEffectiveConnectionRecoveryTimeout() > 0) sndState = new CrossRingMessageSendState(); else if (sndState != null && sndState.checkTimeout()) { - segmentLocalNodeOnSendFail(failedNodes.values()); + segmentLocalNodeOnSendFail(failedNodes); return; // Nothing to do here. } boolean failedNextNode = sndState == null || sndState.markNextNodeFailed(); - if (failedNextNode && !failedNodes.containsKey(next)) { - failedNodes.put(next, next.id()); + if (failedNextNode && !failedNodes.contains(next)) { + failedNodes.add(next); if (state == CONNECTED) { Exception err = errs != null ? @@ -3928,11 +3919,11 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { ", next=" + next + ']'); if (prev) - failedNodes.remove(failedNodes.lastKey()); + failedNodes.remove(failedNodes.size() - 1); else { newNextNode = false; - newNextNode(ring.nextNode(failedNodes.values())); + newNextNode(ring.nextNode(failedNodes)); } } @@ -3945,8 +3936,7 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { } synchronized (mux) { - for (TcpDiscoveryNode node : ServerImpl.this.failedNodes.keySet()) - failedNodes.remove(node); + failedNodes.removeAll(ServerImpl.this.failedNodes.keySet()); } if (!failedNodes.isEmpty()) { @@ -3960,16 +3950,16 @@ else if (!failedNextNode && sndState != null && sndState.isBackward()) { } synchronized (mux) { - for (TcpDiscoveryNode failedNode : failedNodes.keySet()) { + for (TcpDiscoveryNode failedNode : failedNodes) { if (!ServerImpl.this.failedNodes.containsKey(failedNode)) - ServerImpl.this.failedNodes.put(failedNode, failedNode.id()); + ServerImpl.this.failedNodes.put(failedNode, locNodeId); } - for (TcpDiscoveryNode failedNode : failedNodes.keySet()) + for (TcpDiscoveryNode failedNode : failedNodes) failedNodesMsgSent.add(failedNode.id()); } - for (TcpDiscoveryNode n : failedNodes.keySet()) + for (TcpDiscoveryNode n : failedNodes) msgWorker.addMessage(new TcpDiscoveryNodeFailedMessage(locNodeId, n.id(), n.internalOrder())); if (!sent) { @@ -4025,7 +4015,7 @@ private void processPendingMessagesLocally(TcpDiscoveryAbstractMessage curMsg) { /** * Segment local node on failed message send. */ - private void segmentLocalNodeOnSendFail(Collection failedNodes) { + private void segmentLocalNodeOnSendFail(List failedNodes) { String failedNodesStr = failedNodes == null ? "" : (", failedNodes=" + failedNodes); synchronized (mux) { @@ -4062,12 +4052,12 @@ private void segmentLocalNodeOnSendFail(Collection failedNodes) { * @param msg Message to add failed node IDs. * @param failedNodes Failed nodes to add to the message. */ - private void addFailedNodes(TcpDiscoveryAbstractMessage msg, Collection failedNodes) { + private void addFailedNodes(TcpDiscoveryAbstractMessage msg, Collection failedNodes) { if (!failedNodes.isEmpty()) { - for (UUID failedNode : failedNodes) { + for (TcpDiscoveryNode failedNode : failedNodes) { assert !failedNode.equals(next) : failedNode; - msg.addFailedNode(failedNode); + msg.addFailedNode(failedNode.id()); } } } @@ -5706,7 +5696,7 @@ private void processNodeFailedMessage(TcpDiscoveryNodeFailedMessage msg) { if (!skipUpdateFailedNodes) { synchronized (mux) { if (!failedNodes.containsKey(failedNode)) - failedNodes.put(failedNode, failedNode.id()); + failedNodes.put(failedNode, msg.senderNodeId() != null ? msg.senderNodeId() : getLocalNodeId()); } } } @@ -6882,10 +6872,10 @@ else if (req.changeTopology()) { if (ok) { // Check case when previous node suddenly died. This will speed up // node failing. - Collection failed; + Set failed; synchronized (mux) { - failed = failedNodes.values(); + failed = failedNodes.keySet(); } previous = ring.previousNode(failed); diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index e2360ce15e30c9..661424187cf018 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -453,7 +454,7 @@ public void clear() { * @param excluded Nodes to exclude from the search (optional). * @return Coordinator node among remaining nodes or {@code null} if all nodes are excluded. */ - @Nullable public TcpDiscoveryNode coordinator(@Nullable Collection excluded) { + @Nullable public TcpDiscoveryNode coordinator(@Nullable Collection excluded) { rwLock.readLock().lock(); try { @@ -462,7 +463,7 @@ public void clear() { if (F.isEmpty(filtered)) return null; - return Collections.min(filtered); + return Collections.min(filtered, Comparator.comparingLong(TcpDiscoveryNode::internalOrder)); } finally { rwLock.readLock().unlock(); @@ -498,7 +499,7 @@ public void clear() { * @return Next node or {@code null} if all nodes were filtered out or * topology contains less than two nodes. */ - @Nullable public TcpDiscoveryNode nextNode(@Nullable Collection excluded) { + @Nullable public TcpDiscoveryNode nextNode(@Nullable Collection excluded) { assert locNode.internalOrder() > 0 : locNode; assert excluded == null || excluded.isEmpty() || !excluded.contains(locNode) : excluded; @@ -536,7 +537,7 @@ public void clear() { * @return Previous node or {@code null} if all nodes were filtered out or * topology contains less than two nodes. */ - @Nullable public TcpDiscoveryNode previousNode(@Nullable Collection excluded) { + @Nullable public TcpDiscoveryNode previousNode(@Nullable Collection excluded) { rwLock.readLock().lock(); try { @@ -690,12 +691,12 @@ private Collection nodes(IgnitePredicate serverNodes(@Nullable final Collection excluded) { + private Collection serverNodes(@Nullable final Collection excluded) { final boolean excludedEmpty = F.isEmpty(excluded); return F.view(nodes, new P1() { @Override public boolean apply(TcpDiscoveryNode node) { - return node.clientRouterNodeId() == null && (excludedEmpty || !excluded.contains(node.id())); + return node.clientRouterNodeId() == null && (excludedEmpty || !excluded.contains(node)); } }); } From b81fabec64817bb0d2c1856fc09c2f174d48452b Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 16:33:03 +0300 Subject: [PATCH 47/86] WIP --- .../managers/discovery/DiscoCache.java | 35 ++++++++++++++++--- .../GridCachePartitionExchangeManager.java | 2 +- .../GridDhtPartitionsExchangeFuture.java | 2 +- .../tcp/internal/TcpDiscoveryNode.java | 9 +---- .../tcp/internal/TcpDiscoveryNodesRing.java | 11 ++---- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java index b8a2afa864029d..a10731bf3cd6e0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java @@ -378,15 +378,40 @@ public void updateAlives(GridDiscoveryManager discovery) { * @return Server node instance. */ @Nullable public ClusterNode serverNodeByOrder(long order) { - for (ClusterNode node : srvNodes) { - if (node.order() == order) { - return node; - } - } + int idx = serverNodeBinarySearch(order); + + if (idx >= 0) + return srvNodes.get(idx); return null; } + /** + * @param order Node order. + * @return Node index. + */ + private int serverNodeBinarySearch(long order) { + int low = 0; + int high = srvNodes.size() - 1; + + while (low <= high) { + int mid = (low + high) >>> 1; + + ClusterNode midVal = srvNodes.get(mid); + + int cmp = Long.compare(midVal.order(), order); + + if (cmp < 0) + low = mid + 1; + else if (cmp > 0) + high = mid - 1; + else + return mid; + } + + return -(low + 1); + } + /** * * Returns {@code True} if all nodes has the given attribute and its value equals to {@code expVal}. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java index 827e05b90062d1..bbc2e78bbb4c0c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java @@ -3128,7 +3128,7 @@ else if (task instanceof ForceRebalanceExchangeTask) { if (!crd) { List srvNodes = exchFut.firstEventCache().serverNodes(); - crd = newCrd = !srvNodes.isEmpty() && U.oldest(srvNodes, null).isLocal(); + crd = newCrd = !srvNodes.isEmpty() && srvNodes.get(0).isLocal(); } if (!exchFut.changedAffinity()) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java index 271e657edf49ab..3456d33cbab19b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java @@ -907,7 +907,7 @@ public void init(boolean newCrd) throws IgniteInterruptedCheckedException { remaining.addAll(nodeIds(F.view(srvNodes, remoteNodes(cctx.localNodeId())))); - crd = srvNodes.isEmpty() ? null : U.oldest(srvNodes, null); + crd = srvNodes.isEmpty() ? null : srvNodes.get(0); boolean crdNode = crd != null && crd.isLocal(); diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java index 1e349f879121f1..89f1f492e9272b 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java @@ -543,14 +543,7 @@ public TcpDiscoveryNode clientReconnectNode(Map nodeAttrs) { if (node == null) return 1; - String locDcId = dataCenterId() == null ? "" : dataCenterId(); - String otherDcId = node.dataCenterId() == null ? "" : node.dataCenterId(); - - int res = locDcId.compareTo(otherDcId); - - if (res == 0) { - res = Long.compare(internalOrder(), node.internalOrder()); - } + int res = Long.compare(internalOrder(), node.internalOrder()); if (res == 0) { assert id().equals(node.id()) : "Duplicate order [this=" + this + ", other=" + node + ']'; diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 661424187cf018..6a316a9a599b68 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -19,7 +19,6 @@ import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -277,13 +276,9 @@ public long maxInternalOrder() { try { if (maxInternalOrder == 0) { - long last = -1; + TcpDiscoveryNode last = nodes.last(); - for (TcpDiscoveryNode node : nodes) - if (node.internalOrder() > last) - last = node.internalOrder(); - - return last != -1 ? maxInternalOrder = last : -1; + return last != null ? maxInternalOrder = last.internalOrder() : -1; } return maxInternalOrder; @@ -463,7 +458,7 @@ public void clear() { if (F.isEmpty(filtered)) return null; - return Collections.min(filtered, Comparator.comparingLong(TcpDiscoveryNode::internalOrder)); + return Collections.min(filtered); } finally { rwLock.readLock().unlock(); From 3a88f21ff48df01690c6f5fe5606c4b0b5164a0f Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 17:37:49 +0300 Subject: [PATCH 48/86] WIP --- .../tcp/internal/TcpDiscoveryNodesRing.java | 21 ++++++++++++- .../MultiDataCenterRignTest.java | 30 ++++++++++++------- .../IgniteSpiDiscoverySelfTestSuite.java | 2 +- 3 files changed, 41 insertions(+), 12 deletions(-) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/{datacenter => tcp}/MultiDataCenterRignTest.java (77%) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 6a316a9a599b68..7fb021b7994512 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -17,8 +17,10 @@ package org.apache.ignite.spi.discovery.tcp.internal; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -501,7 +503,24 @@ public void clear() { rwLock.readLock().lock(); try { - Collection filtered = serverNodes(excluded); + List filtered = new ArrayList<>(serverNodes(excluded)); + + Comparator comparator = new Comparator<>() { + @Override public int compare(TcpDiscoveryNode n1, TcpDiscoveryNode n2) { + String n1DcId = n1.dataCenterId() == null ? "" : n1.dataCenterId(); + String n2DcId = n2.dataCenterId() == null ? "" : n2.dataCenterId(); + + int res = n1DcId.compareTo(n2DcId); + + if (res == 0) { + res = n1.compareTo(n2); + } + + return res; + } + }; + + filtered.sort(comparator); if (filtered.size() < 2) return null; diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java similarity index 77% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 8cf437562b6e0e..81baf63d6c8fc9 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/datacenter/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -15,12 +15,16 @@ * limitations under the License. */ -package org.apache.ignite.spi.discovery.datacenter; +package org.apache.ignite.spi.discovery.tcp; import java.util.Collection; import java.util.concurrent.ThreadLocalRandom; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.util.typedef.G; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.spi.discovery.DiscoverySpi; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -66,28 +70,34 @@ public void testRing() throws Exception { assertEquals(cnt, nodes.size()); - checkSwitches(2, nodes); + checkSwitches(2); stopGrid(cnt - 1); stopGrid(0); - nodes = grid(cnt / 2).cluster().nodes(); + nodes = grid(rnd.nextInt(cnt)).cluster().nodes(); assertEquals(cnt - 2, nodes.size()); - checkSwitches(2, nodes); + checkSwitches(2); } /** */ - private void checkSwitches(int expected, Collection nodes) { + private void checkSwitches(int expected) { + Collection nodes = G.allGrids(); + int swithes = 0; - String curDcId = null; - for (ClusterNode node : nodes) { - if (!node.dataCenterId().equals(curDcId)) { - swithes++; + for (Ignite node : nodes) { + DiscoverySpi disco = node.configuration().getDiscoverySpi(); + + ServerImpl serverImpl = U.field(disco, "impl"); - curDcId = node.dataCenterId(); + String nextDcId = serverImpl.ring().nextNode().dataCenterId(); + String localDcId = node.cluster().localNode().dataCenterId(); + + if (!localDcId.equals(nextDcId)) { + swithes++; } } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index 04ab4204e78da3..c3dd9ec3787611 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -28,7 +28,7 @@ import org.apache.ignite.spi.discovery.LongClientConnectToClusterTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterClientRoutingTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterDeploymentTest; -import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterRignTest; +import org.apache.ignite.spi.discovery.tcp.MultiDataCenterRignTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryClientSocketTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest; import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectSslTest; From 5ba77534aebbfa14d271d3fcea144f0287d41048 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 17:50:29 +0300 Subject: [PATCH 49/86] WIP --- ...MdcReversedPendingMessageDeliveryTest.java | 33 +++ ...TcpDiscoveryMdcSelReversedChangeTest.java} | 38 +-- ...overyMdcSelfWithCoordinatorChangeTest.java | 219 ------------------ .../discovery/tcp/TcpDiscoverySelfTest.java | 34 +-- .../IgniteSpiDiscoverySelfTestSuite.java | 8 +- 5 files changed, 57 insertions(+), 275 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java => TcpDiscoveryMdcSelReversedChangeTest.java} (56%) delete mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java new file mode 100644 index 00000000000000..a872b9be340d7f --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java @@ -0,0 +1,33 @@ +/* + * 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.spi.discovery.tcp; + +import org.apache.ignite.IgniteSystemProperties; + +/** + * + */ +public class TcpDiscoveryMdcReversedPendingMessageDeliveryTest extends TcpDiscoveryMdcPlainPendingMessageDeliveryTest { + /** */ + @Override protected void applyDC() { + String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); + } +} + diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelReversedChangeTest.java similarity index 56% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelReversedChangeTest.java index 93b20947f68fc9..63da83f81c57be 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelReversedChangeTest.java @@ -18,16 +18,15 @@ package org.apache.ignite.spi.discovery.tcp; import org.apache.ignite.IgniteSystemProperties; -import org.junit.Test; /** - * + * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. */ -public class TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest extends TcpDiscoveryMdcPlainPendingMessageDeliveryTest { +public class TcpDiscoveryMdcSelReversedChangeTest extends TcpDiscoveryMdcSelfPlainTest { /** * @throws Exception If fails. */ - public TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest() throws Exception { + public TcpDiscoveryMdcSelReversedChangeTest() throws Exception { } /** */ @@ -36,35 +35,4 @@ public TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest() throws E System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); } - - /** - * @throws Exception If failed. - */ - @Test - @Override public void testPendingMessagesOverflow() throws Exception { - startGrid(0); - - super.testPendingMessagesOverflow(); - } - - /** - * @throws Exception If failed. - */ - @Test - @Override public void testCustomMessageInSingletonCluster() throws Exception { - startGrid(0); - - super.testCustomMessageInSingletonCluster(); - } - - /** - * @throws Exception If failed. - */ - @Test - @Override public void testDeliveryAllFailedMessagesInCorrectOrder() throws Exception { - startGrid(0); - - super.testDeliveryAllFailedMessagesInCorrectOrder(); - } } - diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java deleted file mode 100644 index 1c8f0aa15bed75..00000000000000 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfWithCoordinatorChangeTest.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * 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.spi.discovery.tcp; - -import java.util.UUID; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteCache; -import org.apache.ignite.IgniteSystemProperties; -import org.apache.ignite.configuration.CacheConfiguration; -import org.apache.ignite.events.DiscoveryEvent; -import org.apache.ignite.events.Event; -import org.apache.ignite.internal.IgniteEx; -import org.apache.ignite.lang.IgnitePredicate; -import org.apache.ignite.plugin.segmentation.SegmentationPolicy; -import org.junit.Test; - -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; -import static org.apache.ignite.events.EventType.EVT_NODE_SEGMENTED; - -/** - * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. - */ -public class TcpDiscoveryMdcSelfWithCoordinatorChangeTest extends TcpDiscoveryMdcSelfPlainTest { - /** - * @throws Exception If fails. - */ - public TcpDiscoveryMdcSelfWithCoordinatorChangeTest() throws Exception { - } - - /** */ - @Override protected void applyDC() { - String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); - } - - /** - * @throws Exception If failed. - */ - @Test - @Override public void testDiscoveryEventsDiscard() throws Exception { - try { - // disable metrics to avoid sending metrics messages as they may mess with pending messages counting. - metricsEnabled = false; - - TestEventDiscardSpi spi = new TestEventDiscardSpi(); - - Ignite ignite0 = startGrid(0); - - nodeSpi.set(spi); - - startGrid(1); - - ignite0.createCache(new CacheConfiguration<>(DEFAULT_CACHE_NAME)); // Send custom message. - - ignite0.destroyCache(DEFAULT_CACHE_NAME); // Send custom message. - - // We need to wait for discartion of pending messages from asynchronous processes like removing cache - // metrics from DMS. Initially the test was correct as createCache/destroyCache methods are synchronous - // and block test-runner thread for long enough for pending messages to be discarded. - // But at some point aforementioned operations were added and implicit assumption the test relies on was broken. - boolean pendingMsgsDiscarded = waitPendingMessagesDiscarded(spi); - assertTrue(pendingMsgsDiscarded); - - stopGrid(0); - - log.info("Start new node."); - - spi.checkDuplicates = true; - - startGrid(0); - - spi.checkDuplicates = false; - - assertFalse(spi.failed); - } - finally { - stopAllGrids(); - - metricsEnabled = true; - } - } - - /** - * @throws Exception If any error occurs. - */ - @Test - @Override public void testDuplicateId() throws Exception { - try { - startGrid(0); - - super.testDuplicateId(); - } - finally { - stopAllGrids(); - } - } - - /** - * Test verifies Ignite nodes don't exchange system types on discovery phase but only user types. - */ - @Test - @Override public void testSystemMarshallerTypesFilteredOut() throws Exception { - try { - nodeSpi.set(new TestTcpDiscoveryMarshallerDataSpi()); - - Ignite srv0 = startGrid(0); - - IgniteCache organizations = srv0.createCache("organizations"); - - organizations.put(1, new Organization()); - - startGrid(1); - - assertEquals("Expected items in marshaller discovery data: 1, actual: " - + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, - 1, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); - - IgniteCache employees = srv0.createCache("employees"); - - employees.put(1, new Employee()); - - startGrid(2); - - assertEquals("Expected items in marshaller discovery data: 2, actual: " - + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, - 2, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); - } - finally { - stopAllGrids(); - } - } - - /** - * @param segPlc Segmentation policy. - * @throws Exception If failed. - */ - @Override protected void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { - try { - this.segPlc = segPlc; - - for (int i = 0; i < 4; i++) - startGrid(i); - - IgniteEx coord = grid(1); - - UUID coordId = coord.localNode().id(); - - IgniteEx ignite = grid(2); - - AtomicBoolean coordSegmented = new AtomicBoolean(); - - coord.events().localListen(evt -> { - assertEquals(EVT_NODE_SEGMENTED, evt.type()); - - UUID nodeId = ((DiscoveryEvent)evt).eventNode().id(); - - if (coordId.equals(nodeId)) - coordSegmented.set(true); - - return true; - }, EVT_NODE_SEGMENTED); - - CountDownLatch failedLatch = new CountDownLatch(2); - - IgnitePredicate failLsnr = evt -> { - assertEquals(EVT_NODE_FAILED, evt.type()); - - UUID nodeId = ((DiscoveryEvent)evt).eventNode().id(); - - if (coordId.equals(nodeId)) - failedLatch.countDown(); - - return true; - }; - - ignite.events().localListen(failLsnr, EVT_NODE_FAILED); - - grid(3).events().localListen(failLsnr, EVT_NODE_FAILED); - - ignite.configuration().getDiscoverySpi().failNode(coordId, null); - - assertTrue(failedLatch.await(2000, MILLISECONDS)); - - assertTrue(coordSegmented.get()); - - if (segPlc == SegmentationPolicy.STOP) { - assertTrue(coord.context().isStopping()); - - waitNodeStop(coord.name()); - } - else - assertFalse(coord.context().isStopping()); - - assertEquals(3, ignite.context().discovery().allNodes().size()); - } - finally { - stopAllGrids(); - } - } -} diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index e6f661a3738516..3195284ba92621 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -121,13 +121,13 @@ public class TcpDiscoverySelfTest extends GridCommonAbstractTest { private Map discoMap = new HashMap<>(); /** */ - protected UUID nodeId; + private UUID nodeId; /** Flag to disable metrics for some tests. */ - protected boolean metricsEnabled = true; + private boolean metricsEnabled = true; /** */ - protected static ThreadLocal nodeSpi = new ThreadLocal<>(); + private static ThreadLocal nodeSpi = new ThreadLocal<>(); /** */ private GridStringLogger strLog; @@ -136,7 +136,7 @@ public class TcpDiscoverySelfTest extends GridCommonAbstractTest { private CacheConfiguration[] ccfgs; /** */ - protected SegmentationPolicy segPlc; + private SegmentationPolicy segPlc; /** */ private ListeningTestLogger testLog; @@ -1182,7 +1182,7 @@ public void testDuplicateId() throws Exception { // Duplicate ID. GridTestUtils.assertThrows( log, - new Callable<>() { + new Callable() { @Nullable @Override public Object call() throws Exception { // Exception will be thrown and output to log. startGrid(3); @@ -1947,7 +1947,7 @@ public void testFailedCoordinatorNodeNoopSegmentationPolicy() throws Exception { * @return {@code true} If pending messages were discarded in a timeout period. * @throws IgniteInterruptedCheckedException If wait was interrupted. */ - protected boolean waitPendingMessagesDiscarded(TcpDiscoverySpi spi) throws IgniteInterruptedCheckedException { + private boolean waitPendingMessagesDiscarded(TcpDiscoverySpi spi) throws IgniteInterruptedCheckedException { Iterable pendingMsgsIterable = GridTestUtils.getFieldValue(spi.impl, "msgWorker", "pendingMsgs"); return GridTestUtils.waitForCondition(() -> !pendingMsgsIterable.iterator().hasNext(), 1000); @@ -1957,7 +1957,7 @@ protected boolean waitPendingMessagesDiscarded(TcpDiscoverySpi spi) throws Ignit * @param segPlc Segmentation policy. * @throws Exception If failed. */ - protected void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { + private void checkFailedCoordinatorNode(SegmentationPolicy segPlc) throws Exception { try { this.segPlc = segPlc; @@ -2151,9 +2151,9 @@ public void testSystemMarshallerTypesFilteredOut() throws Exception { try { nodeSpi.set(new TestTcpDiscoveryMarshallerDataSpi()); - Ignite srv0 = startGrid(0); + Ignite srv1 = startGrid(0); - IgniteCache organizations = srv0.createCache("organizations"); + IgniteCache organizations = srv1.createCache("organizations"); organizations.put(1, new Organization()); @@ -2163,7 +2163,7 @@ public void testSystemMarshallerTypesFilteredOut() throws Exception { + TestTcpDiscoveryMarshallerDataSpi.marshalledItems, 1, TestTcpDiscoveryMarshallerDataSpi.marshalledItems); - IgniteCache employees = srv0.createCache("employees"); + IgniteCache employees = srv1.createCache("employees"); employees.put(1, new Employee()); @@ -2328,7 +2328,7 @@ public void testCheckRingLatency() throws Exception { * @param nodeName Node name. * @throws Exception If failed. */ - protected void waitNodeStop(final String nodeName) throws Exception { + private void waitNodeStop(final String nodeName) throws Exception { boolean wait = GridTestUtils.waitForCondition(new GridAbsPredicate() { @Override public boolean apply() { try { @@ -2383,7 +2383,7 @@ static class DummyPredicate implements IgniteBiPredicate { * SPI used in {@link #testSystemMarshallerTypesFilteredOut()} test to check that only * user types get to discovery messages on joining new nodes. */ - protected static class TestTcpDiscoveryMarshallerDataSpi extends TcpDiscoverySpi { + private static class TestTcpDiscoveryMarshallerDataSpi extends TcpDiscoverySpi { /** Marshalled items. */ static volatile int marshalledItems; @@ -2417,12 +2417,12 @@ private Map getJavaMappings(List allMappings) { /** * User class used in {@link #testSystemMarshallerTypesFilteredOut()} test to feed into marshaller cache. */ - protected static class Organization { } + private static class Organization { } /** * User class used in {@link #testSystemMarshallerTypesFilteredOut()} test to feed into marshaller cache. */ - protected static class Employee { } + private static class Employee { } /** * @@ -2566,15 +2566,15 @@ else if (msg instanceof TcpDiscoveryNodeAddFinishedMessage) /** * */ - protected static class TestEventDiscardSpi extends TcpDiscoverySpi { + private static class TestEventDiscardSpi extends TcpDiscoverySpi { /** */ private GridConcurrentHashSet msgIds = new GridConcurrentHashSet<>(); /** */ - protected volatile boolean checkDuplicates; + private volatile boolean checkDuplicates; /** */ - protected volatile boolean failed; + private volatile boolean failed; /** {@inheritDoc} */ @Override protected void writeMessage(TcpDiscoveryIoSession ses, diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index c3dd9ec3787611..e9d33d91b24a7d 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -51,8 +51,8 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainPendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfPlainTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfWithCoordinatorChangeTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelReversedChangeTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcReversedPendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; @@ -192,9 +192,9 @@ // MDC. TcpDiscoveryMdcSelfPlainTest.class, - TcpDiscoveryMdcSelfWithCoordinatorChangeTest.class, + TcpDiscoveryMdcSelReversedChangeTest.class, TcpDiscoveryMdcPlainPendingMessageDeliveryTest.class, - TcpDiscoveryMdcWithCoordinatorChangePendingMessageDeliveryTest.class, + TcpDiscoveryMdcReversedPendingMessageDeliveryTest.class, MultiDataCenterDeploymentTest.class, MultiDataCenterRignTest.class, MultiDataCenterClientRoutingTest.class, From 02341b3983f378fa9754bed8cd6dac737cca906a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 17:53:27 +0300 Subject: [PATCH 50/86] WIP --- .../ignite/spi/discovery/tcp/MultiDataCenterRignTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 81baf63d6c8fc9..f9fb5f87fe206c 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -106,7 +106,7 @@ private void checkSwitches(int expected) { /** */ @Test - public void testCoordinatorChangeOnJoin() throws Exception { + public void testDcReversedChange() throws Exception { System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); startGrid(0); From b9872aade53538549a351c530fbd12e9ff370711 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 18:13:44 +0300 Subject: [PATCH 51/86] WIP --- .../spi/discovery/tcp/MultiDataCenterRignTest.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index f9fb5f87fe206c..163ae13c113313 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -21,7 +21,6 @@ import java.util.concurrent.ThreadLocalRandom; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteSystemProperties; -import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.discovery.DiscoverySpi; @@ -66,18 +65,14 @@ public void testRing() throws Exception { waitForTopology(cnt); - Collection nodes = grid(rnd.nextInt(cnt)).cluster().nodes(); - - assertEquals(cnt, nodes.size()); + assertEquals(cnt, grid(rnd.nextInt(cnt)).cluster().nodes().size()); checkSwitches(2); stopGrid(cnt - 1); stopGrid(0); - nodes = grid(rnd.nextInt(cnt)).cluster().nodes(); - - assertEquals(cnt - 2, nodes.size()); + assertEquals(cnt - 2, grid(rnd.nextInt(cnt)).cluster().nodes().size()); checkSwitches(2); } From 270dc39c6255086cf88b471d7f28d26321fc4538 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 18:14:01 +0300 Subject: [PATCH 52/86] WIP --- .../ignite/spi/discovery/tcp/MultiDataCenterRignTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 163ae13c113313..4f50be02a15904 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -91,9 +91,8 @@ private void checkSwitches(int expected) { String nextDcId = serverImpl.ring().nextNode().dataCenterId(); String localDcId = node.cluster().localNode().dataCenterId(); - if (!localDcId.equals(nextDcId)) { + if (!localDcId.equals(nextDcId)) swithes++; - } } assertEquals(expected, swithes); From 5129948da38ff3cd5140ea08aa9b9e8bc73ecbde Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 18:53:51 +0300 Subject: [PATCH 53/86] WIP --- .../tcp/MultiDataCenterRignTest.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 4f50be02a15904..9e71665c82c6d2 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -47,12 +47,27 @@ public class MultiDataCenterRignTest extends GridCommonAbstractTest { /** */ @Test public void testRing() throws Exception { + int cnt = 10; + + generateRandomDcCluster(cnt); + + assertEquals(cnt, grid(0).cluster().nodes().size()); + + checkSwitches(2); + + stopGrid(cnt - 1); + stopGrid(0); + + assertEquals(cnt - 2, grid(1).cluster().nodes().size()); + + checkSwitches(2); + } + + private void generateRandomDcCluster(int cnt) throws Exception { ThreadLocalRandom rnd = ThreadLocalRandom.current(); boolean order = rnd.nextBoolean(); - int cnt = 10; - for (int i = 0; i < cnt; i += 2) { System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_0 : DC_ID_1); @@ -64,17 +79,6 @@ public void testRing() throws Exception { } waitForTopology(cnt); - - assertEquals(cnt, grid(rnd.nextInt(cnt)).cluster().nodes().size()); - - checkSwitches(2); - - stopGrid(cnt - 1); - stopGrid(0); - - assertEquals(cnt - 2, grid(rnd.nextInt(cnt)).cluster().nodes().size()); - - checkSwitches(2); } /** */ From f2defda5c69de204479c68860e85f14af52bb37a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 18:55:01 +0300 Subject: [PATCH 54/86] WIP --- .../ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index e9d33d91b24a7d..e3f3f7d13c0a49 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -28,7 +28,6 @@ import org.apache.ignite.spi.discovery.LongClientConnectToClusterTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterClientRoutingTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterDeploymentTest; -import org.apache.ignite.spi.discovery.tcp.MultiDataCenterRignTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryClientSocketTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest; import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectSslTest; @@ -36,6 +35,7 @@ import org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownSslTest; import org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownTest; import org.apache.ignite.spi.discovery.tcp.IgniteMetricsOverflowTest; +import org.apache.ignite.spi.discovery.tcp.MultiDataCenterRignTest; import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoveryMarshallerCheckSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiCoordinatorChangeTest; import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiFailureTimeoutSelfTest; @@ -50,9 +50,9 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainPendingMessageDeliveryTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfPlainTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelReversedChangeTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcReversedPendingMessageDeliveryTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelReversedChangeTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfPlainTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; From 7db5da559b3443d9f925c2464eea7f160d9b28a8 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 19:42:41 +0300 Subject: [PATCH 55/86] WIP --- .../tcp/MultiDataCenterRignTest.java | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 9e71665c82c6d2..fd8577a13235b3 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -17,13 +17,20 @@ package org.apache.ignite.spi.discovery.tcp; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.Ignition; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.spi.discovery.DiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAbstractMessage; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -53,16 +60,60 @@ public void testRing() throws Exception { assertEquals(cnt, grid(0).cluster().nodes().size()); - checkSwitches(2); + checkHops(2); stopGrid(cnt - 1); stopGrid(0); assertEquals(cnt - 2, grid(1).cluster().nodes().size()); - checkSwitches(2); + checkHops(2); } + /** */ + @Test + public void testMessageOrder() throws Exception { + int cnt = 10; + + generateRandomDcCluster(cnt); + + Collection nodes = G.allGrids(); + + CountDownLatch latch = new CountDownLatch(cnt); + List dcs = new ArrayList<>(); + + for (Ignite node : nodes) { + DiscoverySpi disco = node.configuration().getDiscoverySpi(); + + ((TcpDiscoverySpi)disco).addSendMessageListener(new IgniteInClosure<>() { + @Override public void apply(TcpDiscoveryAbstractMessage msg) { + if (msg instanceof TcpDiscoveryNodeAddedMessage) { + dcs.add(Ignition.localIgnite().cluster().localNode().dataCenterId()); + + latch.countDown(); + } + } + }); + } + + startGrid(cnt + 1); + + latch.await(); + + String curDC = null; + int hops = 0; + + for (String dcId : dcs) { + if (!dcId.equals(curDC)) { + hops++; + curDC = dcId; + } + } + + assertEquals(2, hops); + } + + /** */ private void generateRandomDcCluster(int cnt) throws Exception { ThreadLocalRandom rnd = ThreadLocalRandom.current(); @@ -82,10 +133,10 @@ private void generateRandomDcCluster(int cnt) throws Exception { } /** */ - private void checkSwitches(int expected) { + private void checkHops(int expected) { Collection nodes = G.allGrids(); - int swithes = 0; + int hops = 0; for (Ignite node : nodes) { DiscoverySpi disco = node.configuration().getDiscoverySpi(); @@ -93,13 +144,13 @@ private void checkSwitches(int expected) { ServerImpl serverImpl = U.field(disco, "impl"); String nextDcId = serverImpl.ring().nextNode().dataCenterId(); - String localDcId = node.cluster().localNode().dataCenterId(); + String locDcId = node.cluster().localNode().dataCenterId(); - if (!localDcId.equals(nextDcId)) - swithes++; + if (!locDcId.equals(nextDcId)) + hops++; } - assertEquals(expected, swithes); + assertEquals(expected, hops); } /** */ From 94143ad5d68b73dc4ee18b8418c1ca4ae902b1df Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 19:43:15 +0300 Subject: [PATCH 56/86] WIP --- .../ignite/spi/discovery/tcp/MultiDataCenterRignTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index fd8577a13235b3..0f2ad35e96c481 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -56,7 +56,7 @@ public class MultiDataCenterRignTest extends GridCommonAbstractTest { public void testRing() throws Exception { int cnt = 10; - generateRandomDcCluster(cnt); + generateRandomDcOrderCluster(cnt); assertEquals(cnt, grid(0).cluster().nodes().size()); @@ -75,7 +75,7 @@ public void testRing() throws Exception { public void testMessageOrder() throws Exception { int cnt = 10; - generateRandomDcCluster(cnt); + generateRandomDcOrderCluster(cnt); Collection nodes = G.allGrids(); @@ -114,7 +114,7 @@ public void testMessageOrder() throws Exception { } /** */ - private void generateRandomDcCluster(int cnt) throws Exception { + private void generateRandomDcOrderCluster(int cnt) throws Exception { ThreadLocalRandom rnd = ThreadLocalRandom.current(); boolean order = rnd.nextBoolean(); From 4889784381a9bd5fcfe9d904cc246eefee4f1c7d Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 20:05:02 +0300 Subject: [PATCH 57/86] WIP --- ...lfPlainTest.java => TcpDiscoveryMdcPlainSelfTest.java} | 4 ++-- ...angeTest.java => TcpDiscoveryMdcReversedSelfTest.java} | 4 ++-- .../testsuites/IgniteSpiDiscoverySelfTestSuite.java | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcSelfPlainTest.java => TcpDiscoveryMdcPlainSelfTest.java} (93%) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcSelReversedChangeTest.java => TcpDiscoveryMdcReversedSelfTest.java} (89%) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainSelfTest.java similarity index 93% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainSelfTest.java index a7e45e9f266344..a7107f24d16f9d 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfPlainTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainSelfTest.java @@ -23,7 +23,7 @@ /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers. */ -public class TcpDiscoveryMdcSelfPlainTest extends TcpDiscoverySelfTest { +public class TcpDiscoveryMdcPlainSelfTest extends TcpDiscoverySelfTest { /** */ protected static final String DC_ID_0 = "DC0"; @@ -33,7 +33,7 @@ public class TcpDiscoveryMdcSelfPlainTest extends TcpDiscoverySelfTest { /** * @throws Exception If fails. */ - public TcpDiscoveryMdcSelfPlainTest() throws Exception { + public TcpDiscoveryMdcPlainSelfTest() throws Exception { } /** {@inheritDoc} */ diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelReversedChangeTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedSelfTest.java similarity index 89% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelReversedChangeTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedSelfTest.java index 63da83f81c57be..1a826a5d992434 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelReversedChangeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedSelfTest.java @@ -22,11 +22,11 @@ /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. */ -public class TcpDiscoveryMdcSelReversedChangeTest extends TcpDiscoveryMdcSelfPlainTest { +public class TcpDiscoveryMdcReversedSelfTest extends TcpDiscoveryMdcPlainSelfTest { /** * @throws Exception If fails. */ - public TcpDiscoveryMdcSelReversedChangeTest() throws Exception { + public TcpDiscoveryMdcReversedSelfTest() throws Exception { } /** */ diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index e3f3f7d13c0a49..2146f6cb0b724e 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -50,9 +50,9 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainPendingMessageDeliveryTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcReversedPendingMessageDeliveryTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelReversedChangeTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfPlainTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcReversedSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; @@ -191,8 +191,8 @@ TcpDiscoveryDeadNodeAddressResolvingTest.class, // MDC. - TcpDiscoveryMdcSelfPlainTest.class, - TcpDiscoveryMdcSelReversedChangeTest.class, + TcpDiscoveryMdcPlainSelfTest.class, + TcpDiscoveryMdcReversedSelfTest.class, TcpDiscoveryMdcPlainPendingMessageDeliveryTest.class, TcpDiscoveryMdcReversedPendingMessageDeliveryTest.class, MultiDataCenterDeploymentTest.class, From e949d59e5c81e429c86bf2a1f07f0b196e80bbbc Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 20:16:56 +0300 Subject: [PATCH 58/86] WIP --- .../tcp/internal/MdcAwareComparator.java | 37 +++++++++++++++++++ .../tcp/internal/TcpDiscoveryNodesRing.java | 18 +-------- 2 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java new file mode 100644 index 00000000000000..0280482ccd95e8 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java @@ -0,0 +1,37 @@ +/* + * 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.spi.discovery.tcp.internal; + +import java.util.Comparator; + +/** Compares nodes using the Data Center id as a primary factor. */ +public class MdcAwareComparator implements Comparator { + /** */ + @Override public int compare(TcpDiscoveryNode n1, TcpDiscoveryNode n2) { + String n1DcId = n1.dataCenterId() == null ? "" : n1.dataCenterId(); + String n2DcId = n2.dataCenterId() == null ? "" : n2.dataCenterId(); + + int res = n1DcId.compareTo(n2DcId); + + if (res == 0) { + res = n1.compareTo(n2); + } + + return res; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 7fb021b7994512..256514f768b806 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -505,22 +504,7 @@ public void clear() { try { List filtered = new ArrayList<>(serverNodes(excluded)); - Comparator comparator = new Comparator<>() { - @Override public int compare(TcpDiscoveryNode n1, TcpDiscoveryNode n2) { - String n1DcId = n1.dataCenterId() == null ? "" : n1.dataCenterId(); - String n2DcId = n2.dataCenterId() == null ? "" : n2.dataCenterId(); - - int res = n1DcId.compareTo(n2DcId); - - if (res == 0) { - res = n1.compareTo(n2); - } - - return res; - } - }; - - filtered.sort(comparator); + filtered.sort(new MdcAwareComparator()); if (filtered.size() < 2) return null; From cbcab6bba09244910551f178b7ad203e3fa21305 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 1 Dec 2025 20:53:36 +0300 Subject: [PATCH 59/86] WIP --- .../spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 256514f768b806..760d3cfb79ece9 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -504,11 +504,11 @@ public void clear() { try { List filtered = new ArrayList<>(serverNodes(excluded)); - filtered.sort(new MdcAwareComparator()); - if (filtered.size() < 2) return null; + filtered.sort(new MdcAwareComparator()); + Iterator iter = filtered.iterator(); while (iter.hasNext()) { From 8b29eb82b4a73aaa6841d5c3172507f9d8e804fb Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 17:28:50 +0300 Subject: [PATCH 60/86] WIP --- .../CacheExchangeMergeMdcTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeMdcTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeMdcTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeMdcTest.java new file mode 100644 index 00000000000000..89439e4abcaf23 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeMdcTest.java @@ -0,0 +1,56 @@ +/* + * 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.internal.processors.cache.distributed; + +import java.util.concurrent.ThreadLocalRandom; +import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** */ +public class CacheExchangeMergeMdcTest extends CacheExchangeMergeTest { + /** */ + protected static final String DC_ID_0 = "DC0"; + + /** */ + protected static final String DC_ID_1 = "DC1"; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + applyDC(); + + return cfg; + } + + /** */ + protected void applyDC() { + ThreadLocalRandom rnd = ThreadLocalRandom.current(); + + boolean mainDc = rnd.nextBoolean(); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, mainDc ? DC_ID_0 : DC_ID_1); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + } +} From c0903a5745dfc95e876952403f3b1336e1a1e277 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 17:29:29 +0300 Subject: [PATCH 61/86] WIP --- .../org/apache/ignite/testsuites/IgniteCacheTestSuite6.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java index d0b620794a3164..1f6bae5f4cdd3e 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java @@ -36,6 +36,7 @@ import org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerCoordinatorFailTest; import org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerDiscoHistoryTest; import org.apache.ignite.internal.processors.cache.distributed.CacheClientsConcurrentStartTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeMdcTest; import org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeTest; import org.apache.ignite.internal.processors.cache.distributed.CacheParallelStartTest; import org.apache.ignite.internal.processors.cache.distributed.CachePartitionLossWithRestartsTest; @@ -100,6 +101,7 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, IgnitePessimisticTxSuspendResumeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheExchangeMergeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheExchangeMergeMdcTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, OnePhaseCommitAndNodeLeftTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, PendingExchangeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ExchangeMergeStaleServerNodesTest.class, ignoredTests); From f6e5c857e61b8d24ecf6f36c21e04a89bfd6f69e Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 17:40:23 +0300 Subject: [PATCH 62/86] WIP --- ...t.java => TcpDiscoveryMdcRandomSelfTest.java} | 11 +++++++---- ...elfTest.java => TcpDiscoveryMdcSelfTest.java} | 4 ++-- ...veryPendingMessageDeliveryMdcRandomTest.java} | 9 ++++++--- ...pDiscoveryPendingMessageDeliveryMdcTest.java} | 2 +- .../IgniteSpiDiscoverySelfTestSuite.java | 16 ++++++++-------- 5 files changed, 24 insertions(+), 18 deletions(-) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcReversedSelfTest.java => TcpDiscoveryMdcRandomSelfTest.java} (78%) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcPlainSelfTest.java => TcpDiscoveryMdcSelfTest.java} (93%) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java => TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java} (77%) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java => TcpDiscoveryPendingMessageDeliveryMdcTest.java} (94%) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java similarity index 78% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedSelfTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java index 1a826a5d992434..fc60e64303117a 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java @@ -17,22 +17,25 @@ package org.apache.ignite.spi.discovery.tcp; +import java.util.concurrent.ThreadLocalRandom; import org.apache.ignite.IgniteSystemProperties; /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. */ -public class TcpDiscoveryMdcReversedSelfTest extends TcpDiscoveryMdcPlainSelfTest { +public class TcpDiscoveryMdcRandomSelfTest extends TcpDiscoveryMdcSelfTest { /** * @throws Exception If fails. */ - public TcpDiscoveryMdcReversedSelfTest() throws Exception { + public TcpDiscoveryMdcRandomSelfTest() throws Exception { } /** */ @Override protected void applyDC() { - String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + ThreadLocalRandom rnd = ThreadLocalRandom.current(); - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); + boolean mainDc = rnd.nextBoolean(); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, mainDc ? DC_ID_0 : DC_ID_1); } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java similarity index 93% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainSelfTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java index a7107f24d16f9d..098b281b12f81b 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java @@ -23,7 +23,7 @@ /** * Test for {@link TcpDiscoverySpi} with Multi Data Centers. */ -public class TcpDiscoveryMdcPlainSelfTest extends TcpDiscoverySelfTest { +public class TcpDiscoveryMdcSelfTest extends TcpDiscoverySelfTest { /** */ protected static final String DC_ID_0 = "DC0"; @@ -33,7 +33,7 @@ public class TcpDiscoveryMdcPlainSelfTest extends TcpDiscoverySelfTest { /** * @throws Exception If fails. */ - public TcpDiscoveryMdcPlainSelfTest() throws Exception { + public TcpDiscoveryMdcSelfTest() throws Exception { } /** {@inheritDoc} */ diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java similarity index 77% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java index a872b9be340d7f..a4061c82a93342 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcReversedPendingMessageDeliveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java @@ -17,17 +17,20 @@ package org.apache.ignite.spi.discovery.tcp; +import java.util.concurrent.ThreadLocalRandom; import org.apache.ignite.IgniteSystemProperties; /** * */ -public class TcpDiscoveryMdcReversedPendingMessageDeliveryTest extends TcpDiscoveryMdcPlainPendingMessageDeliveryTest { +public class TcpDiscoveryPendingMessageDeliveryMdcRandomTest extends TcpDiscoveryPendingMessageDeliveryMdcTest { /** */ @Override protected void applyDC() { - String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + ThreadLocalRandom rnd = ThreadLocalRandom.current(); - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); + boolean mainDc = rnd.nextBoolean(); + + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, mainDc ? DC_ID_0 : DC_ID_1); } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcTest.java similarity index 94% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcTest.java index 1abf3509c3f9c4..f4d53f2c85f069 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcPlainPendingMessageDeliveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcTest.java @@ -23,7 +23,7 @@ /** * */ -public class TcpDiscoveryMdcPlainPendingMessageDeliveryTest extends TcpDiscoveryPendingMessageDeliveryTest { +public class TcpDiscoveryPendingMessageDeliveryMdcTest extends TcpDiscoveryPendingMessageDeliveryTest { /** */ protected static final String DC_ID_0 = "DC0"; diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index 2146f6cb0b724e..465ecbd433c3c1 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -49,10 +49,8 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryFailedJoinTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainPendingMessageDeliveryTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcPlainSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcReversedPendingMessageDeliveryTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcReversedSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcRandomSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; @@ -60,6 +58,8 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConfigConsistentIdSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConsistentIdSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeJoinAndFailureTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcRandomTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryReconnectUnstableTopologyTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryRestartTest; @@ -191,10 +191,10 @@ TcpDiscoveryDeadNodeAddressResolvingTest.class, // MDC. - TcpDiscoveryMdcPlainSelfTest.class, - TcpDiscoveryMdcReversedSelfTest.class, - TcpDiscoveryMdcPlainPendingMessageDeliveryTest.class, - TcpDiscoveryMdcReversedPendingMessageDeliveryTest.class, + TcpDiscoveryMdcSelfTest.class, + TcpDiscoveryMdcRandomSelfTest.class, + TcpDiscoveryPendingMessageDeliveryMdcTest.class, + TcpDiscoveryPendingMessageDeliveryMdcRandomTest.class, MultiDataCenterDeploymentTest.class, MultiDataCenterRignTest.class, MultiDataCenterClientRoutingTest.class, From f14abe952157d0583f62e0560c0192ff9d0d7511 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 19:45:11 +0300 Subject: [PATCH 63/86] WIP --- ...pDiscoveryPendingMessageDeliveryMdcReversedTest.java} | 9 +++------ .../tcp/TcpDiscoveryPendingMessageDeliveryTest.java | 2 +- .../testsuites/IgniteSpiDiscoverySelfTestSuite.java | 4 ++-- 3 files changed, 6 insertions(+), 9 deletions(-) rename modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/{TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java => TcpDiscoveryPendingMessageDeliveryMdcReversedTest.java} (77%) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcReversedTest.java similarity index 77% rename from modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java rename to modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcReversedTest.java index a4061c82a93342..3b525df7b60481 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcRandomTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryMdcReversedTest.java @@ -17,20 +17,17 @@ package org.apache.ignite.spi.discovery.tcp; -import java.util.concurrent.ThreadLocalRandom; import org.apache.ignite.IgniteSystemProperties; /** * */ -public class TcpDiscoveryPendingMessageDeliveryMdcRandomTest extends TcpDiscoveryPendingMessageDeliveryMdcTest { +public class TcpDiscoveryPendingMessageDeliveryMdcReversedTest extends TcpDiscoveryPendingMessageDeliveryMdcTest { /** */ @Override protected void applyDC() { - ThreadLocalRandom rnd = ThreadLocalRandom.current(); + String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); - boolean mainDc = rnd.nextBoolean(); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, mainDc ? DC_ID_0 : DC_ID_1); + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_1 : DC_ID_0); } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java index 15cb1f903827de..f975d0ae2710d3 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java @@ -121,7 +121,7 @@ public void testPendingMessagesOverflow() throws Exception { log.info("Sending dummy custom messages"); // Non-discarded messages shouldn't be dropped from the queue. - int msgsNum = 2000; + int msgsNum = 20000; for (int i = 0; i < msgsNum; i++) sendDummyCustomMessage(coordDisco, IgniteUuid.randomUuid()); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index 465ecbd433c3c1..6c0b2fa77713f1 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -58,7 +58,7 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConfigConsistentIdSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConsistentIdSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeJoinAndFailureTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcRandomTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcReversedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryReconnectUnstableTopologyTest; @@ -194,7 +194,7 @@ TcpDiscoveryMdcSelfTest.class, TcpDiscoveryMdcRandomSelfTest.class, TcpDiscoveryPendingMessageDeliveryMdcTest.class, - TcpDiscoveryPendingMessageDeliveryMdcRandomTest.class, + TcpDiscoveryPendingMessageDeliveryMdcReversedTest.class, MultiDataCenterDeploymentTest.class, MultiDataCenterRignTest.class, MultiDataCenterClientRoutingTest.class, From dc919948b9ffae357756e4a1bfb975d485e7006c Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 19:47:11 +0300 Subject: [PATCH 64/86] WIP --- .../discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java index f975d0ae2710d3..15cb1f903827de 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java @@ -121,7 +121,7 @@ public void testPendingMessagesOverflow() throws Exception { log.info("Sending dummy custom messages"); // Non-discarded messages shouldn't be dropped from the queue. - int msgsNum = 20000; + int msgsNum = 2000; for (int i = 0; i < msgsNum; i++) sendDummyCustomMessage(coordDisco, IgniteUuid.randomUuid()); From b8cda3cf497e6f23db1c048ed5bd99f0cd291e33 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 19:52:39 +0300 Subject: [PATCH 65/86] WIP --- .../ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java index fc60e64303117a..0474a6f3b8cb8a 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java @@ -21,7 +21,7 @@ import org.apache.ignite.IgniteSystemProperties; /** - * Test for {@link TcpDiscoverySpi} with Multi Data Centers where coordinator changed on second node join. + * Test for {@link TcpDiscoverySpi} with Multi Data Centers. */ public class TcpDiscoveryMdcRandomSelfTest extends TcpDiscoveryMdcSelfTest { /** From f1a9aa5704df10717eb92eea480c17279eafb723 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 19:55:26 +0300 Subject: [PATCH 66/86] WIP --- .../{MdcAwareComparator.java => MdcAwareNodesComparator.java} | 2 +- .../spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/{MdcAwareComparator.java => MdcAwareNodesComparator.java} (94%) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareNodesComparator.java similarity index 94% rename from modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java rename to modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareNodesComparator.java index 0280482ccd95e8..895caf066c137d 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareComparator.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/MdcAwareNodesComparator.java @@ -20,7 +20,7 @@ import java.util.Comparator; /** Compares nodes using the Data Center id as a primary factor. */ -public class MdcAwareComparator implements Comparator { +public class MdcAwareNodesComparator implements Comparator { /** */ @Override public int compare(TcpDiscoveryNode n1, TcpDiscoveryNode n2) { String n1DcId = n1.dataCenterId() == null ? "" : n1.dataCenterId(); diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 760d3cfb79ece9..6b976dc51f859d 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -507,7 +507,7 @@ public void clear() { if (filtered.size() < 2) return null; - filtered.sort(new MdcAwareComparator()); + filtered.sort(new MdcAwareNodesComparator()); Iterator iter = filtered.iterator(); From c3d05ae0ffd5a4dc545a1aefb2e9fcd65aa84a27 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 21:56:59 +0300 Subject: [PATCH 67/86] WIP --- .../apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 3195284ba92621..469523ec7d9de2 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -311,11 +311,15 @@ public void testThreeNodesStartStop() throws Exception { assertNotNull(node); assertNotNull(node.lastSuccessfulAddress()); + assertTrue(spi2.pingNode(ignite3.localNode().id())); + node = (TcpDiscoveryNode)spi2.getNode(ignite3.localNode().id()); assertNotNull(node); assertNotNull(node.lastSuccessfulAddress()); + assertTrue(spi3.pingNode(ignite1.localNode().id())); + node = (TcpDiscoveryNode)spi3.getNode(ignite1.localNode().id()); assertNotNull(node); From 8b41e49e2b41d60080e1af0333570b7ac6f98f4f Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 2 Dec 2025 22:14:45 +0300 Subject: [PATCH 68/86] WIP --- .../ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 469523ec7d9de2..3b729cb19ea778 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -1905,11 +1905,7 @@ public void testFailedNodes5() throws Exception { spi.failSingleMsg = true; - long order = ignite.cluster().localNode().order(); - - long nextOrder = order == NODES ? 1 : order + 1; - - Ignite failingNode = nodes.get(nextOrder); + Ignite failingNode = nodes.get(((ServerImpl)spi.impl).ring().nextNode().order()); assertNotNull(failingNode); From 126d0be19612f8738c01d1a71a7f3cf66b7e5678 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 12 Dec 2025 21:25:45 +0300 Subject: [PATCH 69/86] WIP --- .../cache/distributed/dht/preloader/GridDhtPreloader.java | 7 +++++-- .../org/apache/ignite/spi/discovery/tcp/ClientImpl.java | 2 +- .../org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java index b4126c955f97fc..ccba94eacdae23 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java @@ -41,6 +41,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemander.RebalanceFuture; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtLocalPartition; +import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionTopology; import org.apache.ignite.internal.util.future.GridCompoundFuture; import org.apache.ignite.internal.util.future.GridFinishedFuture; @@ -221,12 +222,14 @@ public boolean disableRebalancingCancellationOptimization() { assert part != null; assert part.id() == p; + GridDhtPartitionState state = part.state(); + // Do not rebalance OWNING or LOST partitions. - if (part.state() == OWNING || part.state() == LOST) + if (state == OWNING || state == LOST) continue; // State should be switched to MOVING during PME. - if (part.state() != MOVING) { + if (state != MOVING) { throw new AssertionError("Partition has invalid state for rebalance " + aff.topologyVersion() + " " + part); } diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java index 2fbb44bad8443b..f02d4403dc5532 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java @@ -920,7 +920,7 @@ private Collection updateTopologyHistory(long topVer, @Nullable Tcp Collection top = topHist.get(topVer); - assert top != null : "Failed to find topology history [msg=" + msg + ", hist=" + topHist + ']'; + assert top != null : "Failed to find topology history [top=" + topVer + ", msg=" + msg + ", hist=" + topHist + ']'; return top; } 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 c8456e937807cf..44ec1a957c737f 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 @@ -5210,9 +5210,6 @@ else if (spiState == CONNECTING) topHist.clear(); topHist.putAll(msg.topologyHistory()); - - pendingMsgs.reset(msg.messages(), msg.discardedMessageId(), - msg.discardedCustomMessageId()); } else { if (log.isDebugEnabled()) From ebed582a708e07ee78144f0bc5e4f531fdc39d05 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 12 Dec 2025 23:53:42 +0300 Subject: [PATCH 70/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 3 +++ 1 file changed, 3 insertions(+) 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 44ec1a957c737f..c8456e937807cf 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 @@ -5210,6 +5210,9 @@ else if (spiState == CONNECTING) topHist.clear(); topHist.putAll(msg.topologyHistory()); + + pendingMsgs.reset(msg.messages(), msg.discardedMessageId(), + msg.discardedCustomMessageId()); } else { if (log.isDebugEnabled()) From 776f906e953b37991243ad2eb0ea9b542f5cd9a6 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 16 Dec 2025 15:32:08 +0300 Subject: [PATCH 71/86] WIP --- .../ignite/spi/discovery/tcp/ServerImpl.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) 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 c8456e937807cf..e6057a026e0e09 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 @@ -1837,6 +1837,7 @@ private void prepareNodeAddedMessage( TcpDiscoveryAbstractMessage msg, UUID destNodeId, @Nullable Collection msgs, + @Nullable IgniteUuid discardMsgId, @Nullable IgniteUuid discardCustomMsgId ) { assert destNodeId != null; @@ -1874,10 +1875,7 @@ private void prepareNodeAddedMessage( } } - // No need to send discardMsgId because we already filtered out - // cleaned up messages. - // TODO IGNITE-11271 - nodeAddedMsg.messages(msgs0, null, discardCustomMsgId); + nodeAddedMsg.messages(msgs0, discardMsgId, discardCustomMsgId); Map> hist; @@ -2659,7 +2657,7 @@ private TcpDiscoveryAbstractMessage prepare(TcpDiscoveryAbstractMessage msg, UUI TcpDiscoveryNodeAddedMessage msg0 = new TcpDiscoveryNodeAddedMessage(addedMsg); - prepareNodeAddedMessage(msg0, destNodeId, null, null); + prepareNodeAddedMessage(msg0, destNodeId, null, null, null); msg0.topology(addedMsg.clientTopology()); @@ -3401,7 +3399,7 @@ private void sendMessageToClients(TcpDiscoveryAbstractMessage msg) { msg0 = U.unmarshal(spi.marshaller(), msgBytes, U.resolveClassLoader(spi.ignite().configuration())); - prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null); + prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null, null); msgBytes0 = null; } @@ -3751,7 +3749,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof long tsNanos = System.nanoTime(); prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs, - pendingMsgs.customDiscardId); + pendingMsgs.discardId, pendingMsgs.customDiscardId); addFailedNodes(pendingMsg, failedNodes); @@ -3793,7 +3791,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof if (!(msg instanceof TcpDiscoveryConnectionCheckMessage)) prepareNodeAddedMessage(msg, next.id(), pendingMsgs.msgs, - pendingMsgs.customDiscardId); + pendingMsgs.discardId, pendingMsgs.customDiscardId); try { SecurityUtils.serializeVersion(1); @@ -4007,7 +4005,7 @@ private void processPendingMessagesLocally(TcpDiscoveryAbstractMessage curMsg) { for (TcpDiscoveryAbstractMessage pendingMsg : pendingMsgs) { prepareNodeAddedMessage(pendingMsg, locNodeId, pendingMsgs.msgs, - pendingMsgs.customDiscardId); + pendingMsgs.discardId, pendingMsgs.customDiscardId); pendingMsg.senderNodeId(locNodeId); From af4bf935a1803daa81ba02da4454ba6c3c2866a0 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 16 Dec 2025 21:50:16 +0300 Subject: [PATCH 72/86] WIP --- .../ignite/spi/discovery/tcp/ServerImpl.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) 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 e6057a026e0e09..c8456e937807cf 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 @@ -1837,7 +1837,6 @@ private void prepareNodeAddedMessage( TcpDiscoveryAbstractMessage msg, UUID destNodeId, @Nullable Collection msgs, - @Nullable IgniteUuid discardMsgId, @Nullable IgniteUuid discardCustomMsgId ) { assert destNodeId != null; @@ -1875,7 +1874,10 @@ private void prepareNodeAddedMessage( } } - nodeAddedMsg.messages(msgs0, discardMsgId, discardCustomMsgId); + // No need to send discardMsgId because we already filtered out + // cleaned up messages. + // TODO IGNITE-11271 + nodeAddedMsg.messages(msgs0, null, discardCustomMsgId); Map> hist; @@ -2657,7 +2659,7 @@ private TcpDiscoveryAbstractMessage prepare(TcpDiscoveryAbstractMessage msg, UUI TcpDiscoveryNodeAddedMessage msg0 = new TcpDiscoveryNodeAddedMessage(addedMsg); - prepareNodeAddedMessage(msg0, destNodeId, null, null, null); + prepareNodeAddedMessage(msg0, destNodeId, null, null); msg0.topology(addedMsg.clientTopology()); @@ -3399,7 +3401,7 @@ private void sendMessageToClients(TcpDiscoveryAbstractMessage msg) { msg0 = U.unmarshal(spi.marshaller(), msgBytes, U.resolveClassLoader(spi.ignite().configuration())); - prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null, null); + prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null); msgBytes0 = null; } @@ -3749,7 +3751,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof long tsNanos = System.nanoTime(); prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs, - pendingMsgs.discardId, pendingMsgs.customDiscardId); + pendingMsgs.customDiscardId); addFailedNodes(pendingMsg, failedNodes); @@ -3791,7 +3793,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof if (!(msg instanceof TcpDiscoveryConnectionCheckMessage)) prepareNodeAddedMessage(msg, next.id(), pendingMsgs.msgs, - pendingMsgs.discardId, pendingMsgs.customDiscardId); + pendingMsgs.customDiscardId); try { SecurityUtils.serializeVersion(1); @@ -4005,7 +4007,7 @@ private void processPendingMessagesLocally(TcpDiscoveryAbstractMessage curMsg) { for (TcpDiscoveryAbstractMessage pendingMsg : pendingMsgs) { prepareNodeAddedMessage(pendingMsg, locNodeId, pendingMsgs.msgs, - pendingMsgs.discardId, pendingMsgs.customDiscardId); + pendingMsgs.customDiscardId); pendingMsg.senderNodeId(locNodeId); From 386048103ac81d702191a5e6834f9729fda9b286 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 17 Dec 2025 00:29:24 +0300 Subject: [PATCH 73/86] WIP --- .../tcp/internal/TcpDiscoveryNodesRing.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java index 6b976dc51f859d..fc8d4b1a5e1ea9 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNodesRing.java @@ -17,7 +17,6 @@ package org.apache.ignite.spi.discovery.tcp.internal; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -502,14 +501,15 @@ public void clear() { rwLock.readLock().lock(); try { - List filtered = new ArrayList<>(serverNodes(excluded)); + Collection filtered = serverNodes(excluded); if (filtered.size() < 2) return null; - filtered.sort(new MdcAwareNodesComparator()); + NavigableSet sorted = new TreeSet<>(new MdcAwareNodesComparator()); + sorted.addAll(filtered); - Iterator iter = filtered.iterator(); + Iterator iter = sorted.iterator(); while (iter.hasNext()) { TcpDiscoveryNode node = iter.next(); @@ -518,7 +518,7 @@ public void clear() { break; } - return iter.hasNext() ? iter.next() : F.first(filtered); + return iter.hasNext() ? iter.next() : F.first(sorted); } finally { rwLock.readLock().unlock(); @@ -544,10 +544,13 @@ public void clear() { if (filtered.size() < 2) return null; + NavigableSet sorted = new TreeSet<>(new MdcAwareNodesComparator()); + sorted.addAll(filtered); + TcpDiscoveryNode previous = null; // Get last node that is previous in a ring - for (TcpDiscoveryNode node : filtered) { + for (TcpDiscoveryNode node : sorted) { if (locNode.equals(node) && previous != null) break; @@ -572,11 +575,14 @@ public TcpDiscoveryNode previousNodeOf(TcpDiscoveryNode ringNode) { try { TcpDiscoveryNode prev = null; - for (TcpDiscoveryNode node : nodes) { + NavigableSet sorted = new TreeSet<>(new MdcAwareNodesComparator()); + sorted.addAll(nodes); + + for (TcpDiscoveryNode node : sorted) { if (node.equals(ringNode)) { if (prev == null) // ringNode is the first node, return last node in the ring. - return nodes.last(); + return sorted.last(); return prev; } From 67f6311f709e834fff27520ee553f351f29e2313 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 16 Dec 2025 15:32:08 +0300 Subject: [PATCH 74/86] WIP --- .../ignite/spi/discovery/tcp/ServerImpl.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) 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 c8456e937807cf..e6057a026e0e09 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 @@ -1837,6 +1837,7 @@ private void prepareNodeAddedMessage( TcpDiscoveryAbstractMessage msg, UUID destNodeId, @Nullable Collection msgs, + @Nullable IgniteUuid discardMsgId, @Nullable IgniteUuid discardCustomMsgId ) { assert destNodeId != null; @@ -1874,10 +1875,7 @@ private void prepareNodeAddedMessage( } } - // No need to send discardMsgId because we already filtered out - // cleaned up messages. - // TODO IGNITE-11271 - nodeAddedMsg.messages(msgs0, null, discardCustomMsgId); + nodeAddedMsg.messages(msgs0, discardMsgId, discardCustomMsgId); Map> hist; @@ -2659,7 +2657,7 @@ private TcpDiscoveryAbstractMessage prepare(TcpDiscoveryAbstractMessage msg, UUI TcpDiscoveryNodeAddedMessage msg0 = new TcpDiscoveryNodeAddedMessage(addedMsg); - prepareNodeAddedMessage(msg0, destNodeId, null, null); + prepareNodeAddedMessage(msg0, destNodeId, null, null, null); msg0.topology(addedMsg.clientTopology()); @@ -3401,7 +3399,7 @@ private void sendMessageToClients(TcpDiscoveryAbstractMessage msg) { msg0 = U.unmarshal(spi.marshaller(), msgBytes, U.resolveClassLoader(spi.ignite().configuration())); - prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null); + prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null, null); msgBytes0 = null; } @@ -3751,7 +3749,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof long tsNanos = System.nanoTime(); prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs, - pendingMsgs.customDiscardId); + pendingMsgs.discardId, pendingMsgs.customDiscardId); addFailedNodes(pendingMsg, failedNodes); @@ -3793,7 +3791,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof if (!(msg instanceof TcpDiscoveryConnectionCheckMessage)) prepareNodeAddedMessage(msg, next.id(), pendingMsgs.msgs, - pendingMsgs.customDiscardId); + pendingMsgs.discardId, pendingMsgs.customDiscardId); try { SecurityUtils.serializeVersion(1); @@ -4007,7 +4005,7 @@ private void processPendingMessagesLocally(TcpDiscoveryAbstractMessage curMsg) { for (TcpDiscoveryAbstractMessage pendingMsg : pendingMsgs) { prepareNodeAddedMessage(pendingMsg, locNodeId, pendingMsgs.msgs, - pendingMsgs.customDiscardId); + pendingMsgs.discardId, pendingMsgs.customDiscardId); pendingMsg.senderNodeId(locNodeId); From ac91b59cce6693cf8b90228590e308768fb759ba Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Tue, 23 Dec 2025 21:11:11 +0300 Subject: [PATCH 75/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e6057a026e0e09..15d227ac533c2e 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 @@ -5277,7 +5277,7 @@ private void processNodeAddFinishedMessage(TcpDiscoveryNodeAddFinishedMessage ms UUID locNodeId = getLocalNodeId(); if (locNodeCoord) { - if (msg.verified()) { + if (msg.verified() && msg.verifierNodeId().equals(locNodeId)) { addMessage(new TcpDiscoveryDiscardMessage(locNodeId, msg.id(), false)); return; From 18ce7aed14f07275445a224fd6f1571d90bc4b52 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 24 Dec 2025 19:06:53 +0300 Subject: [PATCH 76/86] WIP --- .../org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 15d227ac533c2e..6710e208ef4357 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 @@ -4212,7 +4212,7 @@ private void processJoinRequestMessage(final TcpDiscoveryJoinRequestMessage msg) if (isLocalNodeCoordinator()) { TcpDiscoveryNode existingNode = ring.node(node.id()); - if (existingNode != null) { + if (existingNode != null && existingNode.visible()) { if (!node.socketAddresses().equals(existingNode.socketAddresses())) { if (!pingNode(existingNode)) { U.warn(log, "Sending node failed message for existing node: " + node); @@ -4985,6 +4985,8 @@ private void processNodeAddedMessage(TcpDiscoveryNodeAddedMessage msg) { if (isLocalNodeCoordinator()) { if (msg.verified()) { + log.warning("YYYYYYYYYYYYYYYYYY "+msg); + TcpDiscoveryNodeAddFinishedMessage addFinishMsg = new TcpDiscoveryNodeAddFinishedMessage(locNodeId, node.id()); @@ -5010,6 +5012,8 @@ private void processNodeAddedMessage(TcpDiscoveryNodeAddedMessage msg) { return; } + log.warning("XXXXXXXXXXXXXXXXXX "+msg); + msg.verifierNodeId(locNodeId); msg.spanContainer().span() From 3d7c70209cb27d5c5f41c0420c1cc67d610b77e6 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 24 Dec 2025 19:18:42 +0300 Subject: [PATCH 77/86] WIP --- .../java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 4 ---- 1 file changed, 4 deletions(-) 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 6710e208ef4357..4d469bceba9e0d 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 @@ -4985,8 +4985,6 @@ private void processNodeAddedMessage(TcpDiscoveryNodeAddedMessage msg) { if (isLocalNodeCoordinator()) { if (msg.verified()) { - log.warning("YYYYYYYYYYYYYYYYYY "+msg); - TcpDiscoveryNodeAddFinishedMessage addFinishMsg = new TcpDiscoveryNodeAddFinishedMessage(locNodeId, node.id()); @@ -5012,8 +5010,6 @@ private void processNodeAddedMessage(TcpDiscoveryNodeAddedMessage msg) { return; } - log.warning("XXXXXXXXXXXXXXXXXX "+msg); - msg.verifierNodeId(locNodeId); msg.spanContainer().span() From c7e1ce3aec272bac98bc735a6b189efd457d86dc Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Wed, 24 Dec 2025 20:08:17 +0300 Subject: [PATCH 78/86] WIP --- .../spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java index f6b7024474451f..8f20384a6252c2 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java @@ -39,6 +39,7 @@ import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.After; +import org.junit.Ignore; import org.junit.Test; /** @@ -120,6 +121,7 @@ public void testCoordinatorFailedNoAddFinishedMessageStartTwoNodes() throws Exce * @throws Exception if failed. */ @Test + @Ignore public void testClusterFailedNewCoordinatorInitialized() throws Exception { StallingJoinDiscoverySpi stallSpi = new StallingJoinDiscoverySpi(); From 429a37b0542fd16300630cf647afdfc0b448072a Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Thu, 25 Dec 2025 14:50:40 +0300 Subject: [PATCH 79/86] WIP --- .../spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java index 8f20384a6252c2..f6b7024474451f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryCoordinatorFailureTest.java @@ -39,7 +39,6 @@ import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.After; -import org.junit.Ignore; import org.junit.Test; /** @@ -121,7 +120,6 @@ public void testCoordinatorFailedNoAddFinishedMessageStartTwoNodes() throws Exce * @throws Exception if failed. */ @Test - @Ignore public void testClusterFailedNewCoordinatorInitialized() throws Exception { StallingJoinDiscoverySpi stallSpi = new StallingJoinDiscoverySpi(); From 52caab433d17076cb04fb0a0a1a5db71e1c803e9 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 16 Jan 2026 21:22:38 +0300 Subject: [PATCH 80/86] WIP --- .../ignite/spi/discovery/tcp/ServerImpl.java | 215 ++++-------------- .../TcpDiscoveryNodeAddedMessage.java | 35 +-- 2 files changed, 46 insertions(+), 204 deletions(-) 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 d2b56eb00d0dda..b205a74405b9a7 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 @@ -41,7 +41,6 @@ import java.util.List; import java.util.Map; import java.util.NavigableMap; -import java.util.NoSuchElementException; import java.util.Objects; import java.util.Queue; import java.util.Set; @@ -1129,7 +1128,7 @@ private void joinTopology() throws IgniteSpiException { FutureTask fut = msgWorker.addTask(new FutureTask() { @Override protected Void body() { pendingCustomMsgs.clear(); - msgWorker.pendingMsgs.reset(null, null, null); + msgWorker.pendingMsgs.reset(null); msgWorker.newNextNode(null); failedNodes.clear(); leavingNodes.clear(); @@ -1836,9 +1835,7 @@ private void printStatistics() { private void prepareNodeAddedMessage( TcpDiscoveryAbstractMessage msg, UUID destNodeId, - @Nullable Collection msgs, - @Nullable IgniteUuid discardMsgId, - @Nullable IgniteUuid discardCustomMsgId + @Nullable Collection msgs ) { assert destNodeId != null; @@ -1875,7 +1872,7 @@ private void prepareNodeAddedMessage( } } - nodeAddedMsg.messages(msgs0, discardMsgId, discardCustomMsgId); + nodeAddedMsg.messages(msgs0); Map> hist; @@ -1898,7 +1895,7 @@ private void clearNodeAddedMessage(TcpDiscoveryAbstractMessage msg) { nodeAddedMsg.topology(null); nodeAddedMsg.topologyHistory(null); - nodeAddedMsg.messages(null, null, null); + nodeAddedMsg.messages(null); nodeAddedMsg.clearUnmarshalledDiscoveryData(); } } @@ -2657,7 +2654,7 @@ private TcpDiscoveryAbstractMessage prepare(TcpDiscoveryAbstractMessage msg, UUI TcpDiscoveryNodeAddedMessage msg0 = new TcpDiscoveryNodeAddedMessage(addedMsg); - prepareNodeAddedMessage(msg0, destNodeId, null, null, null); + prepareNodeAddedMessage(msg0, destNodeId, null); msg0.topology(addedMsg.clientTopology()); @@ -2708,20 +2705,11 @@ private static class PendingMessage { * Pending messages container. */ private static class PendingMessages implements Iterable { - /** */ - private static final int MAX = 1024; - /** Pending messages. */ - private final Queue msgs = new ArrayDeque<>(MAX * 2); + private final Queue msgs = new ArrayDeque<>(); /** Processed custom message IDs. */ - private Set procCustomMsgs = new GridBoundedLinkedHashSet<>(MAX * 2); - - /** Discarded message ID. */ - private IgniteUuid discardId; - - /** Discarded custom message ID. */ - private IgniteUuid customDiscardId; + private final Set procCustomMsgs = new GridBoundedLinkedHashSet<>(2048); /** * Adds pending message and shrinks queue if it exceeds limit @@ -2731,42 +2719,15 @@ private static class PendingMessages implements Iterable MAX) { - PendingMessage queueHead = msgs.peek(); - - assert queueHead != null; - - if (queueHead.customMsg && customDiscardId != null) { - if (queueHead.id.equals(customDiscardId)) - customDiscardId = null; - } - else if (!queueHead.customMsg && discardId != null) { - if (queueHead.id.equals(discardId)) - discardId = null; - } - else - break; - - msgs.poll(); - } } /** * Resets pending messages. * * @param msgs Message. - * @param discardId Discarded message ID. - * @param customDiscardId Discarded custom event message ID. */ - void reset( - @Nullable Collection msgs, - @Nullable IgniteUuid discardId, - @Nullable IgniteUuid customDiscardId - ) { + void reset(@Nullable Collection msgs) { this.msgs.clear(); - this.customDiscardId = null; - this.discardId = null; if (msgs != null) { for (TcpDiscoveryAbstractMessage msg : msgs) { @@ -2775,9 +2736,6 @@ void reset( this.msgs.add(pm); } } - - this.discardId = discardId; - this.customDiscardId = customDiscardId; } /** @@ -2790,12 +2748,31 @@ void discard(IgniteUuid id, boolean custom) { if (!hasPendingMessage(custom, id)) return; - if (custom) - customDiscardId = id; - else - discardId = id; + IgniteUuid customDiscardId = custom ? id : null; + IgniteUuid discardId = custom ? null : id; + + Iterator it = msgs.iterator(); + + while (it.hasNext()) { + PendingMessage msg = it.next(); + + if (msg.customMsg) { + if (customDiscardId != null) { + it.remove(); - cleanup(); + if (Objects.equals(customDiscardId, msg.id)) + customDiscardId = null; + } + } + else { + if (discardId != null) { + it.remove(); + + if (Objects.equals(discardId, msg.id)) + discardId = null; + } + } + } } /** @@ -2812,134 +2789,36 @@ private boolean hasPendingMessage(boolean custom, IgniteUuid id) { return false; } - /** - * - */ - void cleanup() { - Iterator msgIt = msgs.iterator(); - - boolean skipMsg = discardId != null; - boolean skipCustomMsg = customDiscardId != null; - - while (msgIt.hasNext()) { - PendingMessage msg = msgIt.next(); - - if (msg.customMsg) { - if (skipCustomMsg) { - assert customDiscardId != null; - - if (Objects.equals(customDiscardId, msg.id)) { - msg.msg = null; - - if (msg.verified) - return; - } - } - } - else { - if (skipMsg) { - assert discardId != null; - - if (Objects.equals(discardId, msg.id)) { - msg.msg = null; - - if (msg.verified) - return; - } - } - } - } - } - /** * Gets iterator for non-discarded messages. * * @return Non-discarded messages iterator. */ @Override public Iterator iterator() { - return new SkipIterator(); + return new PendingMessageIterator(); } /** * */ - private class SkipIterator implements Iterator { - /** Skip non-custom messages flag. */ - private boolean skipMsg = discardId != null; - - /** Skip custom messages flag. */ - private boolean skipCustomMsg = customDiscardId != null; - + private class PendingMessageIterator implements Iterator { /** Internal iterator. */ - private Iterator msgIt = msgs.iterator(); - - /** Next message. */ - private TcpDiscoveryAbstractMessage next; - - { - advance(); - } + private final Iterator msgIt = msgs.iterator(); /** {@inheritDoc} */ @Override public boolean hasNext() { - return next != null; + return msgIt.hasNext(); } /** {@inheritDoc} */ @Override public TcpDiscoveryAbstractMessage next() { - if (next == null) - throw new NoSuchElementException(); - - TcpDiscoveryAbstractMessage next0 = next; - - advance(); - - return next0; + return msgIt.next().msg; } /** {@inheritDoc} */ @Override public void remove() { throw new UnsupportedOperationException(); } - - /** - * Advances iterator to the next available item. - */ - private void advance() { - next = null; - - while (msgIt.hasNext()) { - PendingMessage msg0 = msgIt.next(); - - if (msg0.customMsg) { - if (skipCustomMsg) { - assert customDiscardId != null; - - if (Objects.equals(customDiscardId, msg0.id) && msg0.verified) - skipCustomMsg = false; - - continue; - } - } - else { - if (skipMsg) { - assert discardId != null; - - if (Objects.equals(discardId, msg0.id) && msg0.verified) - skipMsg = false; - - continue; - } - } - - if (msg0.msg == null) - continue; - - next = msg0.msg; - - break; - } - } } } @@ -3399,7 +3278,7 @@ private void sendMessageToClients(TcpDiscoveryAbstractMessage msg) { msg0 = U.unmarshal(spi.marshaller(), msgBytes, U.resolveClassLoader(spi.ignite().configuration())); - prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null, null, null); + prepareNodeAddedMessage(msg0, clientMsgWorker.clientNodeId, null); msgBytes0 = null; } @@ -3748,8 +3627,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof for (TcpDiscoveryAbstractMessage pendingMsg : pendingMsgs) { long tsNanos = System.nanoTime(); - prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs, - pendingMsgs.discardId, pendingMsgs.customDiscardId); + prepareNodeAddedMessage(pendingMsg, next.id(), pendingMsgs.msgs); addFailedNodes(pendingMsg, failedNodes); @@ -3790,8 +3668,7 @@ else if (!spi.failureDetectionTimeoutEnabled() && (e instanceof } if (!(msg instanceof TcpDiscoveryConnectionCheckMessage)) - prepareNodeAddedMessage(msg, next.id(), pendingMsgs.msgs, - pendingMsgs.discardId, pendingMsgs.customDiscardId); + prepareNodeAddedMessage(msg, next.id(), pendingMsgs.msgs); try { SecurityUtils.serializeVersion(1); @@ -4004,8 +3881,7 @@ private void processPendingMessagesLocally(TcpDiscoveryAbstractMessage curMsg) { UUID locNodeId = getLocalNodeId(); for (TcpDiscoveryAbstractMessage pendingMsg : pendingMsgs) { - prepareNodeAddedMessage(pendingMsg, locNodeId, pendingMsgs.msgs, - pendingMsgs.discardId, pendingMsgs.customDiscardId); + prepareNodeAddedMessage(pendingMsg, locNodeId, pendingMsgs.msgs); pendingMsg.senderNodeId(locNodeId); @@ -4124,7 +4000,7 @@ private boolean hasPendingAddMessage(UUID nodeId) { if (pendingMsg.msg instanceof TcpDiscoveryNodeAddedMessage) { TcpDiscoveryNodeAddedMessage addMsg = (TcpDiscoveryNodeAddedMessage)pendingMsg.msg; - if (addMsg.node().id().equals(nodeId) && addMsg.id().compareTo(pendingMsgs.discardId) > 0) + if (addMsg.node().id().equals(nodeId)) return true; } } @@ -4212,7 +4088,7 @@ private void processJoinRequestMessage(final TcpDiscoveryJoinRequestMessage msg) if (isLocalNodeCoordinator()) { TcpDiscoveryNode existingNode = ring.node(node.id()); - if (existingNode != null && existingNode.visible()) { + if (existingNode != null) { if (!node.socketAddresses().equals(existingNode.socketAddresses())) { if (!pingNode(existingNode)) { U.warn(log, "Sending node failed message for existing node: " + node); @@ -5209,8 +5085,7 @@ else if (spiState == CONNECTING) topHist.clear(); topHist.putAll(msg.topologyHistory()); - pendingMsgs.reset(msg.messages(), msg.discardedMessageId(), - msg.discardedCustomMessageId()); + pendingMsgs.reset(msg.messages()); } else { if (log.isDebugEnabled()) @@ -5277,7 +5152,7 @@ private void processNodeAddFinishedMessage(TcpDiscoveryNodeAddFinishedMessage ms UUID locNodeId = getLocalNodeId(); if (locNodeCoord) { - if (msg.verified() && msg.verifierNodeId().equals(locNodeId)) { + if (msg.verified()) { addMessage(new TcpDiscoveryDiscardMessage(locNodeId, msg.id(), false)); return; diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeAddedMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeAddedMessage.java index 5c624b4c6bba01..36540d8b7dfc15 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeAddedMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeAddedMessage.java @@ -23,7 +23,6 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.spi.discovery.tcp.internal.DiscoveryDataPacket; import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; import org.jetbrains.annotations.Nullable; @@ -48,12 +47,6 @@ public class TcpDiscoveryNodeAddedMessage extends TcpDiscoveryAbstractTraceableM /** Pending messages from previous node. */ private Collection msgs; - /** Discarded message ID. */ - private IgniteUuid discardMsgId; - - /** Discarded message ID. */ - private IgniteUuid discardCustomMsgId; - /** Current topology. Initialized by coordinator. */ @GridToStringInclude private Collection top; @@ -99,8 +92,6 @@ public TcpDiscoveryNodeAddedMessage(TcpDiscoveryNodeAddedMessage msg) { this.node = msg.node; this.msgs = msg.msgs; - this.discardMsgId = msg.discardMsgId; - this.discardCustomMsgId = msg.discardCustomMsgId; this.top = msg.top; this.clientTop = msg.clientTop; this.topHist = msg.topHist; @@ -126,39 +117,15 @@ public TcpDiscoveryNode node() { return msgs; } - /** - * Gets discarded message ID. - * - * @return Discarded message ID. - */ - @Nullable public IgniteUuid discardedMessageId() { - return discardMsgId; - } - - /** - * Gets discarded custom message ID. - * - * @return Discarded message ID. - */ - @Nullable public IgniteUuid discardedCustomMessageId() { - return discardCustomMsgId; - } - /** * Sets pending messages to send to new node. * * @param msgs Pending messages to send to new node. - * @param discardMsgId Discarded message ID. - * @param discardCustomMsgId Discarded custom message ID. */ public void messages( - @Nullable Collection msgs, - @Nullable IgniteUuid discardMsgId, - @Nullable IgniteUuid discardCustomMsgId + @Nullable Collection msgs ) { this.msgs = msgs; - this.discardMsgId = discardMsgId; - this.discardCustomMsgId = discardCustomMsgId; } /** From 19e5b24c11395fc32e90cf8c2b7a5a53522307e4 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 16 Jan 2026 23:23:41 +0300 Subject: [PATCH 81/86] WIP --- .../tcp/TcpDiscoveryMdcRandomSelfTest.java | 41 ------------------- .../tcp/TcpDiscoveryMdcSelfTest.java | 13 ++---- .../IgniteSpiDiscoverySelfTestSuite.java | 2 - 3 files changed, 4 insertions(+), 52 deletions(-) delete mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java deleted file mode 100644 index 0474a6f3b8cb8a..00000000000000 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcRandomSelfTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.spi.discovery.tcp; - -import java.util.concurrent.ThreadLocalRandom; -import org.apache.ignite.IgniteSystemProperties; - -/** - * Test for {@link TcpDiscoverySpi} with Multi Data Centers. - */ -public class TcpDiscoveryMdcRandomSelfTest extends TcpDiscoveryMdcSelfTest { - /** - * @throws Exception If fails. - */ - public TcpDiscoveryMdcRandomSelfTest() throws Exception { - } - - /** */ - @Override protected void applyDC() { - ThreadLocalRandom rnd = ThreadLocalRandom.current(); - - boolean mainDc = rnd.nextBoolean(); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, mainDc ? DC_ID_0 : DC_ID_1); - } -} diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java index 098b281b12f81b..89ecb9bca94e46 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryMdcSelfTest.java @@ -25,10 +25,10 @@ */ public class TcpDiscoveryMdcSelfTest extends TcpDiscoverySelfTest { /** */ - protected static final String DC_ID_0 = "DC0"; + private static final String DC_ID_0 = "DC0"; /** */ - protected static final String DC_ID_1 = "DC1"; + private static final String DC_ID_1 = "DC1"; /** * @throws Exception If fails. @@ -40,16 +40,11 @@ public TcpDiscoveryMdcSelfTest() throws Exception { @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - applyDC(); - - return cfg; - } - - /** */ - protected void applyDC() { String prev = System.getProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, prev == null ? DC_ID_0 : DC_ID_1); + + return cfg; } /** {@inheritDoc} */ diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index 4922ae2eeae823..ab62046aed090a 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -50,7 +50,6 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryFailedJoinTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcRandomSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; @@ -193,7 +192,6 @@ // MDC. TcpDiscoveryMdcSelfTest.class, - TcpDiscoveryMdcRandomSelfTest.class, TcpDiscoveryPendingMessageDeliveryMdcTest.class, TcpDiscoveryPendingMessageDeliveryMdcReversedTest.class, MultiDataCenterDeploymentTest.class, From bacb35076e400eb88fd14c88a3648df4e8782f05 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 19 Jan 2026 10:29:02 +0300 Subject: [PATCH 82/86] WIP --- .../org/apache/ignite/spi/discovery/tcp/ServerImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 b205a74405b9a7..ddb33a9ce07da0 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 @@ -2705,11 +2705,14 @@ private static class PendingMessage { * Pending messages container. */ private static class PendingMessages implements Iterable { + /** */ + private static final int MAX = 1024; + /** Pending messages. */ - private final Queue msgs = new ArrayDeque<>(); + private final Queue msgs = new ArrayDeque<>(MAX * 2); /** Processed custom message IDs. */ - private final Set procCustomMsgs = new GridBoundedLinkedHashSet<>(2048); + private final Set procCustomMsgs = new GridBoundedLinkedHashSet<>(MAX * 2); /** * Adds pending message and shrinks queue if it exceeds limit From 042d7f790d6e6ce87871e8d5564b0e91de39e492 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 19 Jan 2026 10:32:02 +0300 Subject: [PATCH 83/86] WIP --- .../ignite/spi/discovery/tcp/MultiDataCenterRignTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 0f2ad35e96c481..eb8d7694e48349 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -100,13 +100,13 @@ public void testMessageOrder() throws Exception { latch.await(); - String curDC = null; + String curDc = null; int hops = 0; for (String dcId : dcs) { - if (!dcId.equals(curDC)) { + if (!dcId.equals(curDc)) { hops++; - curDC = dcId; + curDc = dcId; } } From 8b39a9260219ca4ee8be99dc46aaf05356ad7650 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 19 Jan 2026 10:37:45 +0300 Subject: [PATCH 84/86] WIP --- .../spi/discovery/tcp/MultiDataCenterRignTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index eb8d7694e48349..24a0da05bfe346 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -117,16 +117,10 @@ public void testMessageOrder() throws Exception { private void generateRandomDcOrderCluster(int cnt) throws Exception { ThreadLocalRandom rnd = ThreadLocalRandom.current(); - boolean order = rnd.nextBoolean(); - - for (int i = 0; i < cnt; i += 2) { - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_0 : DC_ID_1); + for (int i = 0; i < cnt; i ++) { + System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, rnd.nextBoolean() ? DC_ID_0 : DC_ID_1); startGrid(i); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, order ? DC_ID_1 : DC_ID_0); - - startGrid(i + 1); } waitForTopology(cnt); From 9ab80cbc2268670f7586ec1b413688e4a77f5d2e Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 19 Jan 2026 10:52:07 +0300 Subject: [PATCH 85/86] WIP --- .../ignite/spi/discovery/tcp/MultiDataCenterRignTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index 24a0da05bfe346..c17e405b2f6056 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -117,7 +117,7 @@ public void testMessageOrder() throws Exception { private void generateRandomDcOrderCluster(int cnt) throws Exception { ThreadLocalRandom rnd = ThreadLocalRandom.current(); - for (int i = 0; i < cnt; i ++) { + for (int i = 0; i < cnt; i++) { System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, rnd.nextBoolean() ? DC_ID_0 : DC_ID_1); startGrid(i); From 4763603043d15a0b7b3cf6700aa42c37f8060a53 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Mon, 19 Jan 2026 11:06:13 +0300 Subject: [PATCH 86/86] WIP --- .../spi/discovery/tcp/MultiDataCenterRignTest.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java index c17e405b2f6056..f7160cf4200d67 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/MultiDataCenterRignTest.java @@ -146,16 +146,4 @@ private void checkHops(int expected) { assertEquals(expected, hops); } - - /** */ - @Test - public void testDcReversedChange() throws Exception { - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_1); - startGrid(0); - - System.setProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID, DC_ID_0); - startGrid(1); - - awaitPartitionMapExchange(); - } }