From 1740273da20568067a1a524dab000c79f8068d3d Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Thu, 11 Jun 2026 12:23:26 +0300
Subject: [PATCH 01/47] impl
---
.../internal/managers/communication/UnknownMessageException.java | 0
.../apache/ignite/plugin/extensions/communication/Message.java | 0
2 files changed, 0 insertions(+), 0 deletions(-)
rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java (100%)
rename modules/{core => commons}/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java (100%)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java b/modules/commons/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java
similarity index 100%
rename from modules/core/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java
rename to modules/commons/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java b/modules/commons/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java
similarity index 100%
rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java
rename to modules/commons/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java
From baa147367a3876e08e30661b87fa6251cdd61290 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Fri, 12 Jun 2026 12:43:24 +0300
Subject: [PATCH 02/47] in-progress
---
...utedOperationContextAttributeRegistry.java | 83 +++++++++++++++++++
.../thread/context/OperationContext.java | 2 +-
.../context/OperationContextAttribute.java | 1 +
.../ignite/spi/discovery/tcp/ClientImpl.java | 14 +++-
.../ignite/spi/discovery/tcp/ServerImpl.java | 26 ++++--
.../messages/InetSocketAddressMessage.java | 1 -
.../messages/TcpDiscoveryAbstractMessage.java | 6 ++
.../OperationContextAttributesTest.java | 76 ++++++++++++++++-
8 files changed, 199 insertions(+), 10 deletions(-)
create mode 100644 modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
new file mode 100644
index 0000000000000..93c4ddb621c34
--- /dev/null
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
@@ -0,0 +1,83 @@
+/*
+ * 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.thread.context;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.jetbrains.annotations.Nullable;
+
+/** */
+public class DistributedOperationContextAttributeRegistry {
+ /** */
+ private static final DistributedOperationContextAttributeRegistry INSTANCE = new DistributedOperationContextAttributeRegistry();
+
+ /** Attributes by their id. */
+ private final Map> attributes = new ConcurrentHashMap<>();
+
+ /** */
+ public static DistributedOperationContextAttributeRegistry instance() {
+ return INSTANCE;
+ }
+
+ /** */
+ public void register(byte id, OperationContextAttribute attr) {
+ assert id >= 0;
+
+ if(attributes.size() == OperationContextAttribute.MAX_ATTR_CNT)
+ throw new IgniteException("Maximum number of attributes is exceeded [" + OperationContextAttribute.MAX_ATTR_CNT + "].");
+
+ if (attributes.putIfAbsent(id, attr) != null)
+ throw new IgniteException("Duplicated attribute id: " + id);
+ }
+
+ /** @return Values for all registered operation context attributes. */
+ public @Nullable Map collectContext() {
+ Map res = null;
+
+ for (Map.Entry> e : attributes.entrySet()) {
+ OperationContextAttribute extends Message> attr = e.getValue();
+
+ Message curVal = OperationContext.get(attr);
+
+ if (!Objects.equals(attr.initialValue(), curVal)) {
+ if (res == null)
+ res = new HashMap<>(attributes.size(), 1.0f);
+
+ res.put(e.getKey(), curVal);
+ }
+ }
+
+ return res;
+ }
+
+ /** */
+ public Scope restoreContext(Map res) {
+ if (F.isEmpty(res))
+ return Scope.NOOP_SCOPE;
+
+ OperationContext.ContextUpdater updater = OperationContext.ContextUpdater.create();
+
+ res.forEach((id, attr) -> updater.set((OperationContextAttribute)attributes.get(id), attr));
+
+ return updater.apply();
+ }
+}
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java
index 6953d8b853891..4a8f556781cf7 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java
@@ -322,7 +322,7 @@ private static class AttributeValueHolder {
}
/** Allows to change multiple attribute values in a single update operation and skip updates that changes nothing. */
- private static class ContextUpdater {
+ static class ContextUpdater {
/** */
private static final int INIT_UPDATES_CAPACITY = 3;
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java
index 499d241d9ccba..f5f20066a3d2f 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java
@@ -18,6 +18,7 @@
package org.apache.ignite.internal.thread.context;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.ignite.plugin.extensions.communication.Message;
import org.jetbrains.annotations.Nullable;
/**
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 a0e1a20048786..3476ba8785843 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
@@ -70,6 +70,8 @@
import org.apache.ignite.internal.processors.tracing.messages.SpanContainer;
import org.apache.ignite.internal.processors.tracing.messages.TraceableMessage;
import org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable;
+import org.apache.ignite.internal.thread.context.DistributedOperationContextAttributeRegistry;
+import org.apache.ignite.internal.thread.context.Scope;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.F;
@@ -1310,6 +1312,8 @@ private class SocketWriter extends IgniteSpiThread {
* @param msg Message.
*/
private void sendMessage(TcpDiscoveryAbstractMessage msg) {
+ msg.opCtxAttrs = DistributedOperationContextAttributeRegistry.instance().collectContext();
+
synchronized (mux) {
queue.add(msg);
@@ -2001,7 +2005,15 @@ else if (discoMsg instanceof TcpDiscoveryCheckFailedMessage)
}
}
- processDiscoveryMessage((TcpDiscoveryAbstractMessage)msg);
+ TcpDiscoveryAbstractMessage msg0 = (TcpDiscoveryAbstractMessage)msg;
+
+ if (F.isEmpty(msg0.opCtxAttrs))
+ processDiscoveryMessage(msg0);
+ else {
+ try (Scope ignored = DistributedOperationContextAttributeRegistry.instance().restoreContext(msg0.opCtxAttrs)) {
+ processDiscoveryMessage(msg0);
+ }
+ }
}
}
}
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 82c012c2a1a94..a32bf95fd1bc5 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
@@ -95,6 +95,8 @@
import org.apache.ignite.internal.processors.tracing.messages.SpanContainer;
import org.apache.ignite.internal.processors.tracing.messages.TraceableMessage;
import org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable;
+import org.apache.ignite.internal.thread.context.DistributedOperationContextAttributeRegistry;
+import org.apache.ignite.internal.thread.context.Scope;
import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor;
import org.apache.ignite.internal.util.GridBoundedLinkedHashSet;
import org.apache.ignite.internal.util.GridConcurrentHashSet;
@@ -3046,6 +3048,9 @@ void addMessage(TcpDiscoveryAbstractMessage msg, boolean ignoreHighPriority, boo
return;
}
+ if (!fromSocket)
+ msg.opCtxAttrs = DistributedOperationContextAttributeRegistry.instance().collectContext();
+
if (msg instanceof TraceableMessage) {
TraceableMessage tMsg = (TraceableMessage)msg;
@@ -3173,11 +3178,8 @@ protected void runTasks() {
task.run();
}
- /** {@inheritDoc} */
- @Override protected void processMessage(TcpDiscoveryAbstractMessage msg) {
- if (msg == WAKEUP)
- return;
-
+ /** */
+ private void processMessage0(TcpDiscoveryAbstractMessage msg) {
notifiedDiscovery.set(false);
if (msg instanceof TraceableMessage) {
@@ -3315,6 +3317,20 @@ else if (msg instanceof TcpDiscoveryAuthFailedMessage)
}
}
+ /** {@inheritDoc} */
+ @Override protected void processMessage(TcpDiscoveryAbstractMessage msg) {
+ if (msg == WAKEUP)
+ return;
+
+ if (F.isEmpty(msg.opCtxAttrs))
+ processMessage0(msg);
+ else {
+ try (Scope ignored = DistributedOperationContextAttributeRegistry.instance().restoreContext(msg.opCtxAttrs)) {
+ processMessage0(msg);
+ }
+ }
+ }
+
/**
* Processes authentication failed message.
*
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java
index f23e36f200d27..d76279fb28082 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java
@@ -52,7 +52,6 @@ public int port() {
return port;
}
-
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(InetSocketAddressMessage.class, this);
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java
index 7a97763c36b25..e04f1d856c0ec 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java
@@ -19,6 +19,7 @@
import java.io.Externalizable;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.ignite.internal.Order;
@@ -76,6 +77,11 @@ public abstract class TcpDiscoveryAbstractMessage implements Message {
@Order(4)
Set failedNodes;
+ /** Operation context attributes: id -> attribute value. */
+ @GridToStringInclude
+ @Order(5)
+ public @Nullable Map opCtxAttrs;
+
/**
* Default no-arg constructor for {@link Externalizable} interface.
*/
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
index 9de906b27290c..e6454be489cc7 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.thread.context;
+import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
@@ -35,9 +36,17 @@
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
+import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteException;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.Event;
+import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.managers.communication.GridIoPolicy;
+import org.apache.ignite.internal.managers.discovery.CustomEventListener;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.DynamicCacheChangeBatch;
import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
import org.apache.ignite.internal.thread.context.concurrent.IgniteCompletableFuture;
@@ -48,20 +57,24 @@
import org.apache.ignite.internal.thread.pool.IgniteStripedThreadPoolExecutor;
import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
+import org.apache.ignite.internal.util.typedef.G;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.util.worker.queue.IgniteAsyncObjectHandler;
import org.apache.ignite.internal.util.worker.queue.IgniteDelayedObjectHandler;
import org.apache.ignite.lang.IgniteClosure;
import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.lang.IgniteOutClosure;
+import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteRunnable;
import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.spi.discovery.tcp.messages.InetSocketAddressMessage;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.apache.ignite.thread.IgniteThread;
import org.junit.Test;
import org.springframework.lang.NonNull;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT;
import static org.apache.ignite.testframework.GridTestUtils.assertThrowsAnyCause;
import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause;
@@ -85,6 +98,9 @@ public class OperationContextAttributesTest extends GridCommonAbstractTest {
/** */
private int beforeTestReservedAttrIds;
+ /** */
+ private IgnitePredicate extends Event> evtLsnr;
+
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
super.beforeTest();
@@ -98,6 +114,8 @@ public class OperationContextAttributesTest extends GridCommonAbstractTest {
@Override protected void afterTest() throws Exception {
super.afterTest();
+ stopAllGrids();
+
if (poolToShutdownAfterTest != null)
poolToShutdownAfterTest.shutdownNow();
@@ -105,6 +123,16 @@ public class OperationContextAttributesTest extends GridCommonAbstractTest {
OperationContextAttribute.ID_GEN.set(beforeTestReservedAttrIds);
}
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+ if (evtLsnr != null)
+ cfg.setLocalEventListeners(Collections.singletonMap(evtLsnr, new int[] {EVT_DISCOVERY_CUSTOM_EVT}));
+
+ return cfg;
+ }
+
/** */
@Test
public void testNotAttachedAttribute() {
@@ -808,6 +836,51 @@ public void testContextAwareDelayQueue() throws Exception {
}
}
+ /** */
+ @Test
+ public void testSendAttributesByDiscovery() throws Exception {
+ byte attrId = (byte)(OperationContextAttribute.MAX_ATTR_CNT + 1);
+
+ InetSocketAddressMessage dfltAttrVal = new InetSocketAddressMessage(InetAddress.getLoopbackAddress(), 80);
+
+ OperationContextAttribute attr = OperationContextAttribute.newInstance();
+
+ DistributedOperationContextAttributeRegistry.instance().register(attrId, attr);
+
+ startGrids(2);
+ Ignite cli = startClientGrid();
+
+ CountDownLatch clientLatch = new CountDownLatch(1);
+ CountDownLatch srvrLatch = new CountDownLatch(1);
+
+ for (int i = 1; i < G.allGrids().size(); ++i) {
+ int i0 = i;
+
+ grid(i).context().discovery().setCustomEventListener(
+ DynamicCacheChangeBatch.class, new CustomEventListener<>() {
+ @Override public void onCustomEvent(AffinityTopologyVersion topVer, ClusterNode snd,
+ DynamicCacheChangeBatch msg) {
+
+ if (grid(i0).localNode().isClient())
+ clientLatch.countDown();
+ else
+ srvrLatch.countDown();
+ }
+ });
+ }
+
+ InetSocketAddressMessage newAttrVal = new InetSocketAddressMessage(dfltAttrVal.address(), 443);
+
+ assertFalse(newAttrVal.equals(dfltAttrVal));
+
+ try (Scope ignored = OperationContext.set(attr, newAttrVal)) {
+ grid(0).createCache(defaultCacheConfiguration());
+ }
+
+ assertTrue(clientLatch.await(getTestTimeout(), TimeUnit.MILLISECONDS));
+ assertTrue(srvrLatch.await(getTestTimeout(), TimeUnit.MILLISECONDS));
+ }
+
/** */
private void doContextAwareExecutorServiceTest(ExecutorService pool) throws Exception {
CountDownLatch poolUnblockedLatch = blockPool(pool);
@@ -923,9 +996,8 @@ public AttributeValueChecker(String expStrAttrVal, Integer expIntAttrVal) {
/** */
static void assertAllCreatedChecksPassed() throws Exception {
- for (AttributeValueChecker check : CHECKS) {
+ for (AttributeValueChecker check : CHECKS)
check.get(5_000, MILLISECONDS);
- }
}
/** */
From 9f8e09d8a01167e5b8bb7a6b576353850cc792a4 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Sun, 14 Jun 2026 20:39:02 +0300
Subject: [PATCH 03/47] raw
---
...utedOperationContextAttributeRegistry.java | 2 +-
.../context/OperationContextAttribute.java | 1 -
.../OperationContextAttributesTest.java | 59 +++++++++++++++----
3 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
index 93c4ddb621c34..4d9e9c0fd6698 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
@@ -42,7 +42,7 @@ public static DistributedOperationContextAttributeRegistry instance() {
public void register(byte id, OperationContextAttribute attr) {
assert id >= 0;
- if(attributes.size() == OperationContextAttribute.MAX_ATTR_CNT)
+ if (attributes.size() == OperationContextAttribute.MAX_ATTR_CNT)
throw new IgniteException("Maximum number of attributes is exceeded [" + OperationContextAttribute.MAX_ATTR_CNT + "].");
if (attributes.putIfAbsent(id, attr) != null)
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java
index f5f20066a3d2f..499d241d9ccba 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContextAttribute.java
@@ -18,7 +18,6 @@
package org.apache.ignite.internal.thread.context;
import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.ignite.plugin.extensions.communication.Message;
import org.jetbrains.annotations.Nullable;
/**
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
index e6454be489cc7..e82721c10b114 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
@@ -36,12 +36,10 @@
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
-import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteException;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.events.Event;
-import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.managers.communication.GridIoPolicy;
import org.apache.ignite.internal.managers.discovery.CustomEventListener;
@@ -77,6 +75,7 @@
import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT;
import static org.apache.ignite.testframework.GridTestUtils.assertThrowsAnyCause;
import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause;
+import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
/** */
public class OperationContextAttributesTest extends GridCommonAbstractTest {
@@ -848,12 +847,15 @@ public void testSendAttributesByDiscovery() throws Exception {
DistributedOperationContextAttributeRegistry.instance().register(attrId, attr);
startGrids(2);
- Ignite cli = startClientGrid();
+ startClientGrid(2);
- CountDownLatch clientLatch = new CountDownLatch(1);
- CountDownLatch srvrLatch = new CountDownLatch(1);
+ CountDownLatch coordLatch = new CountDownLatch(3);
+ CountDownLatch srvrLatch = new CountDownLatch(3);
+ CountDownLatch clientLatch = new CountDownLatch(3);
- for (int i = 1; i < G.allGrids().size(); ++i) {
+ InetSocketAddressMessage valToSend = new InetSocketAddressMessage(dfltAttrVal.address(), 443);
+
+ for (int i = 0; i < G.allGrids().size(); ++i) {
int i0 = i;
grid(i).context().discovery().setCustomEventListener(
@@ -861,24 +863,61 @@ public void testSendAttributesByDiscovery() throws Exception {
@Override public void onCustomEvent(AffinityTopologyVersion topVer, ClusterNode snd,
DynamicCacheChangeBatch msg) {
+ InetSocketAddressMessage receivedVal = OperationContext.get(attr);
+
+ assertNotNull(receivedVal);
+
+ assertFalse(dfltAttrVal.port() == receivedVal.port());
+
+ assertEquals(receivedVal.port(), valToSend.port());
+ assertEquals(receivedVal.address(), valToSend.address());
+
if (grid(i0).localNode().isClient())
clientLatch.countDown();
+ else if (grid(i0).localNode().order() == 1)
+ coordLatch.countDown();
else
srvrLatch.countDown();
}
});
}
- InetSocketAddressMessage newAttrVal = new InetSocketAddressMessage(dfltAttrVal.address(), 443);
+ assertFalse(valToSend.equals(dfltAttrVal));
- assertFalse(newAttrVal.equals(dfltAttrVal));
+ assertNull(OperationContext.get(attr));
- try (Scope ignored = OperationContext.set(attr, newAttrVal)) {
+ // Send from a coordinator.
+ try (Scope ignored = OperationContext.set(attr, valToSend)) {
grid(0).createCache(defaultCacheConfiguration());
}
- assertTrue(clientLatch.await(getTestTimeout(), TimeUnit.MILLISECONDS));
+ assertTrue(waitForCondition(() -> coordLatch.getCount() == 2, getTestTimeout()));
+ assertTrue(waitForCondition(() -> srvrLatch.getCount() == 2, getTestTimeout()));
+ assertTrue(waitForCondition(() -> clientLatch.getCount() == 2, getTestTimeout()));
+
+ assertNull(OperationContext.get(attr));
+
+ // Send from a server.
+ try (Scope ignored = OperationContext.set(attr, valToSend)) {
+ grid(1).destroyCache(DEFAULT_CACHE_NAME);
+ }
+
+ assertTrue(waitForCondition(() -> coordLatch.getCount() == 1, getTestTimeout()));
+ assertTrue(waitForCondition(() -> srvrLatch.getCount() == 1, getTestTimeout()));
+ assertTrue(waitForCondition(() -> clientLatch.getCount() == 1, getTestTimeout()));
+
+ assertNull(OperationContext.get(attr));
+
+ // Send from a client.
+ try (Scope ignored = OperationContext.set(attr, valToSend)) {
+ grid(2).createCache(defaultCacheConfiguration());
+ }
+
+ assertNull(OperationContext.get(attr));
+
+ assertTrue(coordLatch.await(getTestTimeout(), TimeUnit.MILLISECONDS));
assertTrue(srvrLatch.await(getTestTimeout(), TimeUnit.MILLISECONDS));
+ assertTrue(clientLatch.await(getTestTimeout(), TimeUnit.MILLISECONDS));
}
/** */
From 9f4ccecbea9382da2a1da57cd5d595d6c9966045 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Mon, 15 Jun 2026 20:42:00 +0300
Subject: [PATCH 04/47] impl
---
...utedOperationContextAttributeRegistry.java | 21 +++++++++----------
.../UnknownMessageException.java | 0
.../extensions/communication/Message.java | 0
3 files changed, 10 insertions(+), 11 deletions(-)
rename modules/{commons => core}/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java (100%)
rename modules/{commons => core}/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java (100%)
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
index 4d9e9c0fd6698..d81b0d1d321cb 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
@@ -22,7 +22,6 @@
import java.util.concurrent.ConcurrentHashMap;
import org.apache.ignite.IgniteException;
import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.plugin.extensions.communication.Message;
import org.jetbrains.annotations.Nullable;
/** */
@@ -31,7 +30,7 @@ public class DistributedOperationContextAttributeRegistry {
private static final DistributedOperationContextAttributeRegistry INSTANCE = new DistributedOperationContextAttributeRegistry();
/** Attributes by their id. */
- private final Map> attributes = new ConcurrentHashMap<>();
+ private final Map> attributes = new ConcurrentHashMap<>();
/** */
public static DistributedOperationContextAttributeRegistry instance() {
@@ -39,7 +38,7 @@ public static DistributedOperationContextAttributeRegistry instance() {
}
/** */
- public void register(byte id, OperationContextAttribute attr) {
+ public void register(byte id, OperationContextAttribute> attr) {
assert id >= 0;
if (attributes.size() == OperationContextAttribute.MAX_ATTR_CNT)
@@ -50,19 +49,19 @@ public void register(byte id, OperationContextAttribute a
}
/** @return Values for all registered operation context attributes. */
- public @Nullable Map collectContext() {
- Map res = null;
+ public @Nullable Map collectContext() {
+ Map res = null;
- for (Map.Entry> e : attributes.entrySet()) {
- OperationContextAttribute extends Message> attr = e.getValue();
+ for (Map.Entry> e : attributes.entrySet()) {
+ OperationContextAttribute> attr = e.getValue();
- Message curVal = OperationContext.get(attr);
+ Object curVal = OperationContext.get(attr);
if (!Objects.equals(attr.initialValue(), curVal)) {
if (res == null)
res = new HashMap<>(attributes.size(), 1.0f);
- res.put(e.getKey(), curVal);
+ res.put(e.getKey(), (T)curVal);
}
}
@@ -70,13 +69,13 @@ public void register(byte id, OperationContextAttribute a
}
/** */
- public Scope restoreContext(Map res) {
+ public Scope restoreContext(Map res) {
if (F.isEmpty(res))
return Scope.NOOP_SCOPE;
OperationContext.ContextUpdater updater = OperationContext.ContextUpdater.create();
- res.forEach((id, attr) -> updater.set((OperationContextAttribute)attributes.get(id), attr));
+ res.forEach((id, attr) -> updater.set((OperationContextAttribute)attributes.get(id), attr));
return updater.apply();
}
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java
similarity index 100%
rename from modules/commons/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java
rename to modules/core/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java
diff --git a/modules/commons/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java
similarity index 100%
rename from modules/commons/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java
rename to modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java
From 1987030a0b85fa0ce730b60afd2639c4c661be84 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Wed, 17 Jun 2026 13:50:35 +0300
Subject: [PATCH 05/47] review fixes
---
...utedOperationContextAttributeRegistry.java | 32 ++++++++++++----
.../context/OperationContextAttribute.java | 2 +-
.../ignite/internal/CoreMessagesProvider.java | 4 ++
.../internal/OperationContexMessage.java | 37 +++++++++++++++++++
.../ignite/spi/discovery/tcp/ClientImpl.java | 7 ++--
.../ignite/spi/discovery/tcp/ServerImpl.java | 9 +++--
.../spi/discovery/tcp/TcpDiscoveryImpl.java | 24 ++++++++++++
.../messages/TcpDiscoveryAbstractMessage.java | 6 +--
.../OperationContextAttributesTest.java | 2 +-
9 files changed, 105 insertions(+), 18 deletions(-)
create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/OperationContexMessage.java
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
index d81b0d1d321cb..9208fb5add00d 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttributeRegistry.java
@@ -16,6 +16,7 @@
*/
package org.apache.ignite.internal.thread.context;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@@ -48,17 +49,25 @@ public void register(byte id, OperationContextAttribute> attr) {
throw new IgniteException("Duplicated attribute id: " + id);
}
- /** @return Values for all registered operation context attributes. */
- public @Nullable Map collectContext() {
- Map res = null;
+ /**
+ * TODO : Declare distributed attributes as 'extends Message' after https://issues.apache.org/jira/browse/IGNITE-28766
+ * @return Values for all registered operation context attributes.
+ * */
+ public Map collectContext(@Nullable Class checkValuesType) {
+ Map res = Collections.emptyMap();
for (Map.Entry> e : attributes.entrySet()) {
OperationContextAttribute> attr = e.getValue();
Object curVal = OperationContext.get(attr);
+ if (curVal != null && checkValuesType != null && !checkValuesType.isAssignableFrom(curVal.getClass())) {
+ throw new IgniteException("To distribute operation context attributes they have to be a "
+ + checkValuesType.getSimpleName());
+ }
+
if (!Objects.equals(attr.initialValue(), curVal)) {
- if (res == null)
+ if (res == Collections.EMPTY_MAP)
res = new HashMap<>(attributes.size(), 1.0f);
res.put(e.getKey(), (T)curVal);
@@ -69,13 +78,22 @@ public void register(byte id, OperationContextAttribute> attr) {
}
/** */
- public Scope restoreContext(Map res) {
- if (F.isEmpty(res))
+ public Scope restoreContext(int idBitmask, Object[] values) {
+ if (F.isEmpty(values) || idBitmask == 0)
return Scope.NOOP_SCOPE;
OperationContext.ContextUpdater updater = OperationContext.ContextUpdater.create();
- res.forEach((id, attr) -> updater.set((OperationContextAttribute)attributes.get(id), attr));
+ for (byte attrId = 0; attrId < OperationContextAttribute.MAX_ATTR_CNT; attrId++) {
+ assert attrId < Integer.SIZE;
+
+ int mask = 1 << attrId;
+
+ if ((mask & idBitmask) == 0)
+ continue;
+
+ updater.set((OperationContextAttribute
*
*
To enable propagation of an {@link OperationContextAttribute} value across cluster nodes, the
- * attribute must be created using the {@link #createDistributedAttribute(byte, Message)} method.
+ * attribute must be created using the {@link #registerDistributedAttribute(byte, Message)} method.
*
*
Note, that the maximum number of distributed attribute instances that can be created is currently limited to
* {@link #MAX_DISTRIBUTED_ATTR_CNT} for implementation reasons.
@@ -50,7 +50,7 @@ public class DistributedOperationContextManager {
static final byte MAX_DISTRIBUTED_ATTR_CNT = Byte.SIZE;
/** Registered distributed attributes by their cluster-wide id. */
- private final Map> attrs = new ConcurrentSkipListMap<>();
+ private final Map> attrs = new ConcurrentSkipListMap<>();
/**
* Creates a new {@link OperationContext} attribute with the specified distributed ID and initial value.
@@ -63,14 +63,14 @@ public class DistributedOperationContextManager {
*
* @see OperationContextAttribute#newInstance(Object)
*/
- public OperationContextAttribute createDistributedAttribute(byte id, @Nullable T initVal) {
+ public OperationContextAttribute registerDistributedAttribute(byte id, OperationContextAttribute attr) {
assert id >= 0 && id < MAX_DISTRIBUTED_ATTR_CNT : "Invalid distributed attributed id [id=" + id + ']';
return (OperationContextAttribute)attrs.compute(id, (id0, attr0) -> {
if (attr0 != null)
throw new IgniteException("Duplicated distributed attribute id [id=" + id + ']');
- return OperationContextAttribute.newInstance(initVal);
+ return attr;
});
}
@@ -84,7 +84,7 @@ public OperationContextAttribute createDistributedAttribu
DistributedOperationContextMessage res = null;
List vals = null;
- for (Map.Entry> e : attrs.entrySet()) {
+ for (Map.Entry> e : attrs.entrySet()) {
OperationContextAttribute extends Message> attr = e.getValue();
Message curVal = OperationContext.get(attr);
@@ -128,7 +128,7 @@ public Scope restoreDistributedAttributes(@Nullable DistributedOperationContextM
while ((msg.idBitmap & (1 << maskIdx)) == 0)
++maskIdx;
- OperationContextAttribute attr = attrs.get(maskIdx++);
+ OperationContextAttribute attr = (OperationContextAttribute)attrs.get(maskIdx++);
assert attr != null;
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
index 8caa21403c59e..8b443c5887091 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
@@ -860,13 +860,13 @@ public void testSendAttributesByDiscovery() throws Exception {
@Override public void start(PluginContext ctx) {
// Distributed attribute 1.
OperationContextAttribute a1 = ((IgniteEx)ctx.grid()).context()
- .distributedOperationContextManager().createDistributedAttribute(attrId1, dfltDistAttr1Val);
+ .distributedOperationContextManager().registerDistributedAttribute(attrId1, dfltDistAttr1Val);
dAttr1.set(a1);
// Distributed attribute 2.
OperationContextAttribute a2 = ((IgniteEx)ctx.grid()).context()
- .distributedOperationContextManager().createDistributedAttribute(attrId2, dfltDistrAttr2Val);
+ .distributedOperationContextManager().registerDistributedAttribute(attrId2, dfltDistrAttr2Val);
dAttr2.set(a2);
}
@@ -880,7 +880,7 @@ public void testSendAttributesByDiscovery() throws Exception {
assertThrows(
null,
- () -> grid(0).context().distributedOperationContextManager().createDistributedAttribute((byte)1, null),
+ () -> grid(0).context().distributedOperationContextManager().registerDistributedAttribute((byte)1, null),
IgniteException.class,
"Distributed operation context attributes is registered only at the starting"
);
From 91a65a15f1284135258a9888b2c502c5797d10e4 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Wed, 24 Jun 2026 20:39:23 +0300
Subject: [PATCH 35/47] fixes
---
.../apache/ignite/internal/IgniteKernal.java | 8 ++++--
.../DistributedOperationContextManager.java | 4 +--
.../OperationContextAttributesTest.java | 28 ++++++-------------
3 files changed, 16 insertions(+), 24 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 41832237f4ab2..0482ff5838937 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -937,12 +937,14 @@ public void start(
);
distrOperationContextMgr = new DistributedOperationContextManager() {
- @Override public OperationContextAttribute registerDistributedAttribute(byte id,
- @Nullable T initVal) {
+ @Override public void registerDistributedAttribute(
+ byte id,
+ OperationContextAttribute attr
+ ) {
if (gw.getState() != STARTING)
throw new IgniteException("Distributed operation context attributes is registered only at the starting.");
- return super.registerDistributedAttribute(id, initVal);
+ super.registerDistributedAttribute(id, attr);
}
};
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
index 463b08e2f52e8..f3b84313a26cd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
@@ -63,10 +63,10 @@ public class DistributedOperationContextManager {
*
* @see OperationContextAttribute#newInstance(Object)
*/
- public OperationContextAttribute registerDistributedAttribute(byte id, OperationContextAttribute attr) {
+ public void registerDistributedAttribute(byte id, OperationContextAttribute attr) {
assert id >= 0 && id < MAX_DISTRIBUTED_ATTR_CNT : "Invalid distributed attributed id [id=" + id + ']';
- return (OperationContextAttribute)attrs.compute(id, (id0, attr0) -> {
+ attrs.compute(id, (id0, attr0) -> {
if (attr0 != null)
throw new IgniteException("Duplicated distributed attribute id [id=" + id + ']');
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
index 8b443c5887091..ab382b39a503e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
@@ -31,7 +31,6 @@
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
@@ -849,8 +848,8 @@ public void testSendAttributesByDiscovery() throws Exception {
InetSocketAddressMessage dfltDistAttr1Val = new InetSocketAddressMessage(InetAddress.getLoopbackAddress(), 80);
GridCacheVersion dfltDistrAttr2Val = new GridCacheVersion(1, 1, 1);
- AtomicReference> dAttr1 = new AtomicReference<>();
- AtomicReference> dAttr2 = new AtomicReference<>();
+ OperationContextAttribute dAttr1 = OperationContextAttribute.newInstance(dfltDistAttr1Val);
+ OperationContextAttribute dAttr2 = OperationContextAttribute.newInstance(dfltDistrAttr2Val);
pluginProvider = new AbstractTestPluginProvider() {
@Override public String name() {
@@ -858,17 +857,8 @@ public void testSendAttributesByDiscovery() throws Exception {
}
@Override public void start(PluginContext ctx) {
- // Distributed attribute 1.
- OperationContextAttribute a1 = ((IgniteEx)ctx.grid()).context()
- .distributedOperationContextManager().registerDistributedAttribute(attrId1, dfltDistAttr1Val);
-
- dAttr1.set(a1);
-
- // Distributed attribute 2.
- OperationContextAttribute a2 = ((IgniteEx)ctx.grid()).context()
- .distributedOperationContextManager().registerDistributedAttribute(attrId2, dfltDistrAttr2Val);
-
- dAttr2.set(a2);
+ ((IgniteEx)ctx.grid()).context().distributedOperationContextManager().registerDistributedAttribute(attrId1, dAttr1);
+ ((IgniteEx)ctx.grid()).context().distributedOperationContextManager().registerDistributedAttribute(attrId2, dAttr2);
}
};
@@ -903,8 +893,8 @@ public void testSendAttributesByDiscovery() throws Exception {
@Override public void onCustomEvent(AffinityTopologyVersion topVer, ClusterNode snd,
DynamicCacheChangeBatch msg) {
- InetSocketAddressMessage receivedVal1 = OperationContext.get(dAttr1.get());
- GridCacheVersion receivedVal2 = OperationContext.get(dAttr2.get());
+ InetSocketAddressMessage receivedVal1 = OperationContext.get(dAttr1);
+ GridCacheVersion receivedVal2 = OperationContext.get(dAttr2);
assertNotNull(receivedVal1);
assertNotNull(receivedVal2);
@@ -927,7 +917,7 @@ else if (grid(i0).localNode().order() == 1)
}
// Send from the coordinator.
- try (Scope ignored = OperationContext.set(dAttr1.get(), valToSend1, dAttr2.get(), valToSend2)) {
+ try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) {
grid(0).createCache(defaultCacheConfiguration());
}
@@ -936,7 +926,7 @@ else if (grid(i0).localNode().order() == 1)
assertTrue(waitForCondition(() -> clientLatch.getCount() == 2, getTestTimeout()));
// Send from a server.
- try (Scope ignored = OperationContext.set(dAttr1.get(), valToSend1, dAttr2.get(), valToSend2)) {
+ try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) {
grid(1).destroyCache(DEFAULT_CACHE_NAME);
}
@@ -945,7 +935,7 @@ else if (grid(i0).localNode().order() == 1)
assertTrue(waitForCondition(() -> clientLatch.getCount() == 1, getTestTimeout()));
// Send from a client.
- try (Scope ignored = OperationContext.set(dAttr1.get(), valToSend1, dAttr2.get(), valToSend2)) {
+ try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) {
grid(2).createCache(defaultCacheConfiguration());
}
From 28844874740d9ea1949e67de05e2575f064bc302 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Wed, 24 Jun 2026 21:14:11 +0300
Subject: [PATCH 36/47] fix
---
.../thread/context/DistributedOperationContextManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
index f3b84313a26cd..f91f62294c94c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
@@ -37,7 +37,7 @@
* {@link OperationContextAttribute} instance that is consistent across all cluster nodes.
*
*
To enable propagation of an {@link OperationContextAttribute} value across cluster nodes, the
- * attribute must be created using the {@link #registerDistributedAttribute(byte, Message)} method.
+fi * attribute must be created using the {@link #registerDistributedAttribute(byte, OperationContextAttribute)} method.
*
*
Note, that the maximum number of distributed attribute instances that can be created is currently limited to
* {@link #MAX_DISTRIBUTED_ATTR_CNT} for implementation reasons.
From 915cfd59ecb705f4bff79ee7f531831d1be78137 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Thu, 25 Jun 2026 12:51:50 +0300
Subject: [PATCH 37/47] review fixes
---
.../apache/ignite/internal/IgniteKernal.java | 18 ++++--------------
.../DistributedOperationContextManager.java | 13 ++++++++++++-
.../OperationContextAttributesTest.java | 4 ++--
3 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 0482ff5838937..d06e0fd55f29f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -175,7 +175,6 @@
import org.apache.ignite.internal.suggestions.OsConfigurationSuggestions;
import org.apache.ignite.internal.systemview.ConfigurationViewWalker;
import org.apache.ignite.internal.thread.context.DistributedOperationContextManager;
-import org.apache.ignite.internal.thread.context.OperationContextAttribute;
import org.apache.ignite.internal.util.TimeBag;
import org.apache.ignite.internal.util.future.GridCompoundFuture;
import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -212,7 +211,6 @@
import org.apache.ignite.plugin.IgnitePlugin;
import org.apache.ignite.plugin.PluginNotFoundException;
import org.apache.ignite.plugin.PluginProvider;
-import org.apache.ignite.plugin.extensions.communication.Message;
import org.apache.ignite.plugin.extensions.communication.MessageFactory;
import org.apache.ignite.plugin.extensions.communication.MessageFactoryProvider;
import org.apache.ignite.spi.IgniteSpi;
@@ -936,17 +934,7 @@ public void start(
longJVMPauseDetector
);
- distrOperationContextMgr = new DistributedOperationContextManager() {
- @Override public void registerDistributedAttribute(
- byte id,
- OperationContextAttribute attr
- ) {
- if (gw.getState() != STARTING)
- throw new IgniteException("Distributed operation context attributes is registered only at the starting.");
-
- super.registerDistributedAttribute(id, attr);
- }
- };
+ distrOperationContextMgr = new DistributedOperationContextManager();
startProcessor(new DiagnosticProcessor(ctx));
@@ -1170,6 +1158,8 @@ public void start(
// All components exept Discovery are started, time to check if maintenance is still needed.
mntcProc.prepareAndExecuteMaintenance();
+ distrOperationContextMgr.initialized();
+
gw.writeLock();
try {
@@ -3077,7 +3067,7 @@ MessageFactory messageFactory() {
return msgFactory;
}
- /** @return Instance of {@link DistributedOperationContextManager}. */
+ /** @return Distributed operation context manager. */
DistributedOperationContextManager distributedOperationContextManager() {
return distrOperationContextMgr;
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
index f91f62294c94c..9cb79f7fe5bcb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextManager.java
@@ -37,7 +37,7 @@
* {@link OperationContextAttribute} instance that is consistent across all cluster nodes.
*
*
To enable propagation of an {@link OperationContextAttribute} value across cluster nodes, the
-fi * attribute must be created using the {@link #registerDistributedAttribute(byte, OperationContextAttribute)} method.
+ * attribute must be created using the {@link #registerDistributedAttribute(byte, OperationContextAttribute)} method.
*
*
Note, that the maximum number of distributed attribute instances that can be created is currently limited to
* {@link #MAX_DISTRIBUTED_ATTR_CNT} for implementation reasons.
The distributed ID is used to consistently identify the attribute across all nodes in the cluster.
- * It must be unique, and its value must be in the range from {@code 0} (inclusive) to {@code Byte.SIZE} (exclusive).
+ * It must be unique, and its value must be in the range [{@code 0} : {@code Byte.SIZE}).
*
- *
The value of the created attribute is automatically captured and propagated between cluster nodes
+ *
A value of the attribute is automatically captured and propagated between cluster nodes
* during message transmission.
- *
- * @see OperationContextAttribute#newInstance(Object)
*/
public void registerDistributedAttribute(byte id, OperationContextAttribute attr) {
if (initialized)
@@ -81,8 +79,7 @@ public void registerDistributedAttribute(byte id, OperationC
}
/**
- * Collects the values of all distributed {@link OperationContextAttribute}s registered by this manager in a format
- * suitable for transmission between cluster nodes.
+ * Collects the values of all distributed {@link OperationContextAttribute}s registered by this manager.
*
* @see OperationContext#get(OperationContextAttribute)
*/
From 91904614e0c1bb51d58d58fad11bd15fe7ab8830 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Thu, 25 Jun 2026 14:49:41 +0300
Subject: [PATCH 42/47] minor coding
---
.../thread/context/OperationContextDispatcher.java | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java
index e65b05d0308a4..e0bfd16ae1f9e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java
@@ -70,12 +70,8 @@ public void registerDistributedAttribute(byte id, OperationC
assert id >= 0 && id < MAX_DISTRIBUTED_ATTR_CNT : "Invalid distributed attributed id [id=" + id + ']';
- attrs.compute(id, (id0, attr0) -> {
- if (attr0 != null)
- throw new IgniteException("Duplicated distributed attribute id [id=" + id + ']');
-
- return attr;
- });
+ if (attrs.putIfAbsent(id, attr) != null)
+ throw new IgniteException("Duplicated distributed attribute id [id=" + id + ']');
}
/**
From d570302de58dfcfe6bab0abba85570acd1c84bb1 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Thu, 25 Jun 2026 19:26:30 +0300
Subject: [PATCH 43/47] raw
---
.../ignite/internal/CoreMessagesProvider.java | 5 +-
.../discovery/GridDiscoveryManager.java | 27 +++--
.../SecurityAwareCustomMessageWrapper.java | 75 ------------
.../IgniteAuthenticationProcessor.java | 76 +-----------
.../security/IgniteSecurityProcessor.java | 3 +
.../security/SecurityContextImpl.java | 111 ++++++++++++++++++
.../context/OperationContextDispatcher.java | 4 +-
.../ignite/internal/util/IgniteUtils.java | 6 +-
.../NodeSecurityContextPropagationTest.java | 3 -
9 files changed, 137 insertions(+), 173 deletions(-)
delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
index d2180dc2baf9e..e82679318b425 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
@@ -35,7 +35,6 @@
import org.apache.ignite.internal.managers.deployment.GridDeploymentInfoBean;
import org.apache.ignite.internal.managers.deployment.GridDeploymentRequest;
import org.apache.ignite.internal.managers.deployment.GridDeploymentResponse;
-import org.apache.ignite.internal.managers.discovery.SecurityAwareCustomMessageWrapper;
import org.apache.ignite.internal.managers.encryption.ChangeCacheEncryptionRequest;
import org.apache.ignite.internal.managers.encryption.EncryptionDataBagItem;
import org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyRequest;
@@ -236,6 +235,7 @@
import org.apache.ignite.internal.processors.query.stat.messages.StatisticsResponse;
import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultRequest;
import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultResponse;
+import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.processors.service.ServiceChangeBatchRequest;
import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResult;
import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResultBatch;
@@ -432,7 +432,7 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C
withNoSchema(FullMessage.class);
withNoSchema(InitMessage.class);
withNoSchema(CacheStatisticsModeChangeMessage.class);
- withNoSchema(SecurityAwareCustomMessageWrapper.class);
+ ++msgIdx; // Former SecurityAwareCustomMessageWrapper
withNoSchema(MetadataRemoveAcceptedMessage.class);
withNoSchema(MetadataRemoveProposedMessage.class);
withNoSchema(WalStateFinishMessage.class);
@@ -683,6 +683,7 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C
// [13400 - 13500]: Operation context messages.
msgIdx = 13400;
withNoSchema(OperationContextMessage.class);
+ withNoSchema(SecurityContextImpl.class);
assert msgIdx <= MAX_MESSAGE_ID;
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index da9b54b2440f7..d083d6571794c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -88,14 +88,15 @@
import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateMessage;
import org.apache.ignite.internal.processors.cluster.DiscoveryDataClusterState;
import org.apache.ignite.internal.processors.cluster.IGridClusterStateProcessor;
-import org.apache.ignite.internal.processors.security.IgniteSecurity;
import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.processors.tracing.messages.SpanContainer;
import org.apache.ignite.internal.systemview.ClusterNodeViewWalker;
import org.apache.ignite.internal.systemview.NodeAttributeViewWalker;
import org.apache.ignite.internal.systemview.NodeMetricsViewWalker;
import org.apache.ignite.internal.thread.OomExceptionHandler;
import org.apache.ignite.internal.thread.context.OperationContext;
+import org.apache.ignite.internal.thread.context.OperationContextAttribute;
import org.apache.ignite.internal.thread.context.Scope;
import org.apache.ignite.internal.thread.context.function.OperationContextAwareWrapper;
import org.apache.ignite.internal.util.GridAtomicLong;
@@ -134,7 +135,6 @@
import org.apache.ignite.spi.discovery.DiscoveryMetricsProvider;
import org.apache.ignite.spi.discovery.DiscoveryNotification;
import org.apache.ignite.spi.discovery.DiscoverySpi;
-import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage;
import org.apache.ignite.spi.discovery.DiscoverySpiDataExchange;
import org.apache.ignite.spi.discovery.DiscoverySpiHistorySupport;
import org.apache.ignite.spi.discovery.DiscoverySpiListener;
@@ -191,6 +191,8 @@
* Discovery SPI manager.
*/
public class GridDiscoveryManager extends GridManagerAdapter {
+ /** */
+ public static final OperationContextAttribute SEC_OP_CTX_ATTR = OperationContextAttribute.newInstance();
/** */
private static final String PREFIX = "Topology snapshot";
@@ -226,7 +228,7 @@ public class GridDiscoveryManager extends GridManagerAdapter {
};
/** Discovery cached history size. */
- private final int DISCOVERY_HISTORY_SIZE = getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, DFLT_DISCOVERY_HISTORY_SIZE);
+ private static final int DISCOVERY_HISTORY_SIZE = getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, DFLT_DISCOVERY_HISTORY_SIZE);
/** */
private final Object discoEvtMux = new Object();
@@ -924,12 +926,10 @@ public SecurityAwareNotificationTask(DiscoveryNotification notification) {
/** */
@Override public void run() {
- DiscoverySpiCustomMessage customMsg = notification.customMessage();
-
- if (customMsg instanceof SecurityAwareCustomMessageWrapper) {
- UUID secSubjId = ((SecurityAwareCustomMessageWrapper)customMsg).securitySubjectId();
+ SecurityContext secOpCtx = OperationContext.get(SEC_OP_CTX_ATTR);
- try (Scope ignored = ctx.security().withContext(secSubjId)) {
+ if (secOpCtx != null) {
+ try (Scope ignored = ctx.security().withContext(secOpCtx.subject().id())) {
super.run();
}
}
@@ -2334,12 +2334,13 @@ public GridFutureAdapter localJoinFuture() {
* @throws IgniteCheckedException If failed.
*/
public void sendCustomEvent(DiscoveryCustomMessage msg) throws IgniteCheckedException {
- try {
- IgniteSecurity security = ctx.security();
+ UUID secSubjId = ctx.security().enabled() ? ctx.security().securityContext().subject().id() : null;
- getSpi().sendCustomEvent(security.enabled()
- ? new SecurityAwareCustomMessageWrapper(msg, security.securityContext().subject().id())
- : msg);
+ try (Scope ignored = secSubjId == null
+ ? Scope.NOOP_SCOPE
+ : OperationContext.set(SEC_OP_CTX_ATTR, new SecurityContextImpl(secSubjId))
+ ) {
+ getSpi().sendCustomEvent(msg);
}
catch (IgniteClientDisconnectedException e) {
IgniteFuture> reconnectFut = ctx.cluster().clientReconnectFuture();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
deleted file mode 100644
index e9d33b8433cbf..0000000000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
+++ /dev/null
@@ -1,75 +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.internal.managers.discovery;
-
-import java.util.UUID;
-import org.apache.ignite.internal.Order;
-import org.apache.ignite.plugin.extensions.communication.MessageFactory;
-import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage;
-import org.jetbrains.annotations.Nullable;
-
-/** Custom message wrapper with ID of security subject that initiated the current message. */
-public class SecurityAwareCustomMessageWrapper implements DiscoverySpiCustomMessage {
- /** Security subject ID. */
- @Order(0)
- UUID secSubjId;
-
- /** Original message. */
- @Order(1)
- DiscoveryCustomMessage delegate;
-
- /** Default constructor for {@link MessageFactory}. */
- public SecurityAwareCustomMessageWrapper() {
- // No-op.
- }
-
- /** */
- public SecurityAwareCustomMessageWrapper(DiscoveryCustomMessage delegate, UUID secSubjId) {
- this.delegate = delegate;
- this.secSubjId = secSubjId;
- }
-
- /** Gets security Subject ID. */
- public UUID securitySubjectId() {
- return secSubjId;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isMutable() {
- return delegate().isMutable();
- }
-
- /** {@inheritDoc} */
- @Override public boolean stopProcess() {
- return delegate().stopProcess();
- }
-
- /**
- * @return Delegate.
- */
- public DiscoveryCustomMessage delegate() {
- return delegate;
- }
-
- /** {@inheritDoc} */
- @Override public @Nullable DiscoverySpiCustomMessage ackMessage() {
- DiscoveryCustomMessage ack = (DiscoveryCustomMessage)delegate().ackMessage();
-
- return ack == null ? null : new SecurityAwareCustomMessageWrapper(ack, secSubjId);
- }
-}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
index 55a5c22f2a813..3aab17857a63d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
@@ -17,7 +17,6 @@
package org.apache.ignite.internal.processors.authentication;
-import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collection;
@@ -57,12 +56,12 @@
import org.apache.ignite.internal.processors.security.GridSecurityProcessor;
import org.apache.ignite.internal.processors.security.IgniteSecurityProcessor;
import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.CU;
-import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.util.worker.GridWorker;
import org.apache.ignite.lang.IgniteFuture;
@@ -73,7 +72,6 @@
import org.apache.ignite.plugin.security.SecurityException;
import org.apache.ignite.plugin.security.SecurityPermission;
import org.apache.ignite.plugin.security.SecuritySubject;
-import org.apache.ignite.plugin.security.SecuritySubjectType;
import org.apache.ignite.spi.discovery.DiscoveryDataBag;
import org.apache.ignite.spi.discovery.DiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -1302,7 +1300,7 @@ private RefreshUsersStorageWorker(ArrayList usrs) {
}
/** {@inheritDoc} */
- @Override protected void body() throws InterruptedException, IgniteInterruptedCheckedException {
+ @Override protected void body() {
if (ctx.clientNode())
return;
@@ -1331,74 +1329,4 @@ private RefreshUsersStorageWorker(ArrayList usrs) {
}
}
}
-
- /** Represents {@link SecuritySubject} implementation. */
- private static class SecuritySubjectImpl implements SecuritySubject {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** Security subject identifier. */
- private final UUID id;
-
- /** Security subject login. */
- private final String login;
-
- /** Security subject type. */
- private final SecuritySubjectType type;
-
- /** Security subject address. */
- private final InetSocketAddress addr;
-
- /** */
- public SecuritySubjectImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
- this.id = id;
- this.login = login;
- this.type = type;
- this.addr = addr;
- }
-
- /** {@inheritDoc} */
- @Override public UUID id() {
- return id;
- }
-
- /** {@inheritDoc} */
- @Override public String login() {
- return login;
- }
-
- /** {@inheritDoc} */
- @Override public SecuritySubjectType type() {
- return type;
- }
-
- /** {@inheritDoc} */
- @Override public InetSocketAddress address() {
- return addr;
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return S.toString(SecuritySubjectImpl.class, this);
- }
- }
-
- /** Represents {@link SecurityContext} implementation that ignores any security permission checks. */
- private static class SecurityContextImpl implements SecurityContext, Serializable {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** */
- private final SecuritySubject subj;
-
- /** */
- public SecurityContextImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
- subj = new SecuritySubjectImpl(id, login, type, addr);
- }
-
- /** {@inheritDoc} */
- @Override public SecuritySubject subject() {
- return subj;
- }
- }
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
index 7b34ed75db2dc..30f4034046a13 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
@@ -29,6 +29,7 @@
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
import org.apache.ignite.internal.processors.security.sandbox.AccessControllerSandbox;
import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
import org.apache.ignite.internal.processors.security.sandbox.NoOpSandbox;
@@ -236,6 +237,8 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP
@Override public void start() throws IgniteCheckedException {
super.start();
+ ctx.operationContextDispatcher().registerDistributedAttribute(0, GridDiscoveryManager.SEC_OP_CTX_ATTR);
+
ctx.addNodeAttribute(ATTR_GRID_SEC_PROC_CLASS, secPrc.getClass().getName());
secPrc.start();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
new file mode 100644
index 0000000000000..f798f3542a4d7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
@@ -0,0 +1,111 @@
+/*
+ * 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.security;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.UUID;
+import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.plugin.security.SecuritySubject;
+import org.apache.ignite.plugin.security.SecuritySubjectType;
+
+/** Represents {@link SecurityContext} implementation that ignores any security permission checks. */
+public class SecurityContextImpl implements SecurityContext, Message, Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** */
+ private SecuritySubject subj;
+
+ /** */
+ @Order(0)
+ transient UUID subjId;
+
+ /** Empty constructor for serialization purposes. */
+ public SecurityContextImpl() {
+ // No-op.
+ }
+
+ /** */
+ public SecurityContextImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
+ subj = new SecuritySubjectImpl(id, login, type, addr);
+ }
+
+ /** */
+ public SecurityContextImpl(UUID id) {
+ subjId = id;
+ }
+
+ /** {@inheritDoc} */
+ @Override public SecuritySubject subject() {
+ return subj;
+ }
+
+ /** Represents {@link SecuritySubject} implementation. */
+ private static class SecuritySubjectImpl implements SecuritySubject {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Security subject identifier. */
+ private final UUID id;
+
+ /** Security subject login. */
+ private final String login;
+
+ /** Security subject type. */
+ private final SecuritySubjectType type;
+
+ /** Security subject address. */
+ private final InetSocketAddress addr;
+
+ /** */
+ public SecuritySubjectImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
+ this.id = id;
+ this.login = login;
+ this.type = type;
+ this.addr = addr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public UUID id() {
+ return id;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String login() {
+ return login;
+ }
+
+ /** {@inheritDoc} */
+ @Override public SecuritySubjectType type() {
+ return type;
+ }
+
+ /** {@inheritDoc} */
+ @Override public InetSocketAddress address() {
+ return addr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(SecuritySubjectImpl.class, this);
+ }
+ }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java
index e0bfd16ae1f9e..18281f3112dd9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java
@@ -64,13 +64,13 @@ public class OperationContextDispatcher {
*
A value of the attribute is automatically captured and propagated between cluster nodes
* during message transmission.
*/
- public void registerDistributedAttribute(byte id, OperationContextAttribute attr) {
+ public void registerDistributedAttribute(int id, OperationContextAttribute attr) {
if (initialized)
throw new IgniteException("Initialization of distributed operation context attributes has already finished.");
assert id >= 0 && id < MAX_DISTRIBUTED_ATTR_CNT : "Invalid distributed attributed id [id=" + id + ']';
- if (attrs.putIfAbsent(id, attr) != null)
+ if (attrs.putIfAbsent((byte)id, attr) != null)
throw new IgniteException("Duplicated distributed attribute id [id=" + id + ']');
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 1513346138589..cfb2245498c23 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -188,7 +188,6 @@
import org.apache.ignite.internal.managers.deployment.GridDeploymentInfo;
import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
-import org.apache.ignite.internal.managers.discovery.SecurityAwareCustomMessageWrapper;
import org.apache.ignite.internal.mxbean.IgniteStandardMXBean;
import org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper;
import org.apache.ignite.internal.processors.cache.CacheObjectContext;
@@ -8128,12 +8127,11 @@ public static IgniteDataTransferObjectSeria
}
/**
- * Unwraps messsage if it is wrapped by {@link SecurityAwareCustomMessageWrapper}.
+ * Unwraps messsage as {@link DiscoveryCustomMessage}.
*
* @param msg Message.
*/
public static DiscoveryCustomMessage unwrapCustomMessage(DiscoverySpiCustomMessage msg) {
- return msg instanceof SecurityAwareCustomMessageWrapper ?
- ((SecurityAwareCustomMessageWrapper)msg).delegate() : (DiscoveryCustomMessage)msg;
+ return (DiscoveryCustomMessage)msg;
}
}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java
index 8619509d5cd34..99a028c363d81 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java
@@ -34,7 +34,6 @@
import org.apache.ignite.failure.StopNodeOrHaltFailureHandler;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.events.DiscoveryCustomEvent;
-import org.apache.ignite.internal.managers.discovery.SecurityAwareCustomMessageWrapper;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.spi.MessagesPluginProvider;
import org.apache.ignite.spi.discovery.DiscoverySpi;
@@ -186,8 +185,6 @@ private boolean anyReceivedMessageMatch(IgniteEx ignite, Predicate predi
if (msg instanceof TcpDiscoveryCustomEventMessage) {
DiscoverySpiCustomMessage customMsg = ((TcpDiscoveryCustomEventMessage)msg).message();
- assert customMsg instanceof SecurityAwareCustomMessageWrapper;
-
unwrappedMsg = U.unwrapCustomMessage(customMsg);
}
From 0955e6529919192fca3de8b10b4d2b7cfa1f7d9f Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Fri, 26 Jun 2026 11:57:54 +0300
Subject: [PATCH 44/47] raw
---
.../ignite/internal/CoreMessagesProvider.java | 5 +-
.../discovery/GridDiscoveryManager.java | 15 ++-
.../IgniteAuthenticationProcessor.java | 74 +++++++++++-
.../security/IgniteSecurityProcessor.java | 3 -
.../security/SecurityContextImpl.java | 111 ------------------
.../security/SecurityContextMessage.java | 46 ++++++++
.../ignite/internal/util/IgniteUtils.java | 2 +
7 files changed, 134 insertions(+), 122 deletions(-)
delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
index 118c6de7c9aee..3de42dbaab5bb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
@@ -238,6 +238,7 @@
import org.apache.ignite.internal.processors.rollingupgrade.RollingUpgradeNodeData;
import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureSet;
import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteProductFeatures;
+import org.apache.ignite.internal.processors.security.SecurityContextMessage;
import org.apache.ignite.internal.processors.service.ServiceChangeBatchRequest;
import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResult;
import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResultBatch;
@@ -605,7 +606,9 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C
// [11500 - 11600]: IO, networking messages.
msgIdx = NODE_ID_MSG_TYPE;
withNoSchema(NodeIdMessage.class);
+ msgIdx = HANDSHAKE_MSG_TYPE;
withNoSchema(HandshakeMessage.class);
+ msgIdx = HANDSHAKE_WAIT_MSG_TYPE;
withNoSchema(HandshakeWaitMessage.class);
withNoSchema(GridIoMessage.class);
withNoSchema(IgniteIoTestMessage.class);
@@ -687,7 +690,7 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C
// [13400 - 13500]: Operation context messages.
msgIdx = 13400;
withNoSchema(OperationContextMessage.class);
- withNoSchema(SecurityContextImpl.class);
+ withNoSchema(SecurityContextMessage.class);
// [13600 - 13700]: Rolling Upgrade messages.
msgIdx = 13600;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index e3c9f6bc4019b..b0ba8ebffb946 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -89,7 +89,7 @@
import org.apache.ignite.internal.processors.cluster.DiscoveryDataClusterState;
import org.apache.ignite.internal.processors.cluster.IGridClusterStateProcessor;
import org.apache.ignite.internal.processors.security.SecurityContext;
-import org.apache.ignite.internal.processors.security.SecurityContextImpl;
+import org.apache.ignite.internal.processors.security.SecurityContextMessage;
import org.apache.ignite.internal.processors.tracing.messages.SpanContainer;
import org.apache.ignite.internal.systemview.ClusterNodeViewWalker;
import org.apache.ignite.internal.systemview.NodeAttributeViewWalker;
@@ -192,7 +192,8 @@
*/
public class GridDiscoveryManager extends GridManagerAdapter {
/** */
- public static final OperationContextAttribute SEC_OP_CTX_ATTR = OperationContextAttribute.newInstance();
+ private static final OperationContextAttribute SEC_OP_CTX_ATTR = OperationContextAttribute.newInstance();
+
/** */
private static final String PREFIX = "Topology snapshot";
@@ -480,6 +481,8 @@ private void updateClientNodes(UUID leftNodeId) {
/** {@inheritDoc} */
@Override public void start() throws IgniteCheckedException {
+ ctx.operationContextDispatcher().registerDistributedAttribute(0, SEC_OP_CTX_ATTR);
+
ctx.addNodeAttribute(ATTR_OFFHEAP_SIZE, requiredOffheap());
ctx.addNodeAttribute(ATTR_DATA_REGIONS_OFFHEAP_SIZE, configuredOffheap());
@@ -931,10 +934,10 @@ public SecurityAwareNotificationTask(DiscoveryNotification notification) {
/** */
@Override public void run() {
- SecurityContext secOpCtx = OperationContext.get(SEC_OP_CTX_ATTR);
+ SecurityContextMessage secCtxMsg = OperationContext.get(SEC_OP_CTX_ATTR);
- if (secOpCtx != null) {
- try (Scope ignored = ctx.security().withContext(secOpCtx.subject().id())) {
+ if (secCtxMsg != null) {
+ try (Scope ignored = ctx.security().withContext(secCtxMsg.subjId)) {
super.run();
}
}
@@ -2343,7 +2346,7 @@ public void sendCustomEvent(DiscoveryCustomMessage msg) throws IgniteCheckedExce
try (Scope ignored = secSubjId == null
? Scope.NOOP_SCOPE
- : OperationContext.set(SEC_OP_CTX_ATTR, new SecurityContextImpl(secSubjId))
+ : OperationContext.set(SEC_OP_CTX_ATTR, new SecurityContextMessage(secSubjId))
) {
getSpi().sendCustomEvent(msg);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
index 3aab17857a63d..74a7dca34a827 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.processors.authentication;
+import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collection;
@@ -56,12 +57,12 @@
import org.apache.ignite.internal.processors.security.GridSecurityProcessor;
import org.apache.ignite.internal.processors.security.IgniteSecurityProcessor;
import org.apache.ignite.internal.processors.security.SecurityContext;
-import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.util.worker.GridWorker;
import org.apache.ignite.lang.IgniteFuture;
@@ -72,6 +73,7 @@
import org.apache.ignite.plugin.security.SecurityException;
import org.apache.ignite.plugin.security.SecurityPermission;
import org.apache.ignite.plugin.security.SecuritySubject;
+import org.apache.ignite.plugin.security.SecuritySubjectType;
import org.apache.ignite.spi.discovery.DiscoveryDataBag;
import org.apache.ignite.spi.discovery.DiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -1329,4 +1331,74 @@ private RefreshUsersStorageWorker(ArrayList usrs) {
}
}
}
+
+ /** Represents {@link SecuritySubject} implementation. */
+ private static class SecuritySubjectImpl implements SecuritySubject {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Security subject identifier. */
+ private final UUID id;
+
+ /** Security subject login. */
+ private final String login;
+
+ /** Security subject type. */
+ private final SecuritySubjectType type;
+
+ /** Security subject address. */
+ private final InetSocketAddress addr;
+
+ /** */
+ public SecuritySubjectImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
+ this.id = id;
+ this.login = login;
+ this.type = type;
+ this.addr = addr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public UUID id() {
+ return id;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String login() {
+ return login;
+ }
+
+ /** {@inheritDoc} */
+ @Override public SecuritySubjectType type() {
+ return type;
+ }
+
+ /** {@inheritDoc} */
+ @Override public InetSocketAddress address() {
+ return addr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(SecuritySubjectImpl.class, this);
+ }
+ }
+
+ /** Represents {@link SecurityContext} implementation that ignores any security permission checks. */
+ private static class SecurityContextImpl implements SecurityContext, Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** */
+ private final SecuritySubject subj;
+
+ /** */
+ public SecurityContextImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
+ subj = new SecuritySubjectImpl(id, login, type, addr);
+ }
+
+ /** {@inheritDoc} */
+ @Override public SecuritySubject subject() {
+ return subj;
+ }
+ }
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
index 30f4034046a13..7b34ed75db2dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
@@ -29,7 +29,6 @@
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
import org.apache.ignite.internal.processors.security.sandbox.AccessControllerSandbox;
import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
import org.apache.ignite.internal.processors.security.sandbox.NoOpSandbox;
@@ -237,8 +236,6 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP
@Override public void start() throws IgniteCheckedException {
super.start();
- ctx.operationContextDispatcher().registerDistributedAttribute(0, GridDiscoveryManager.SEC_OP_CTX_ATTR);
-
ctx.addNodeAttribute(ATTR_GRID_SEC_PROC_CLASS, secPrc.getClass().getName());
secPrc.start();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
deleted file mode 100644
index f798f3542a4d7..0000000000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
+++ /dev/null
@@ -1,111 +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.internal.processors.security;
-
-import java.io.Serializable;
-import java.net.InetSocketAddress;
-import java.util.UUID;
-import org.apache.ignite.internal.Order;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.plugin.extensions.communication.Message;
-import org.apache.ignite.plugin.security.SecuritySubject;
-import org.apache.ignite.plugin.security.SecuritySubjectType;
-
-/** Represents {@link SecurityContext} implementation that ignores any security permission checks. */
-public class SecurityContextImpl implements SecurityContext, Message, Serializable {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** */
- private SecuritySubject subj;
-
- /** */
- @Order(0)
- transient UUID subjId;
-
- /** Empty constructor for serialization purposes. */
- public SecurityContextImpl() {
- // No-op.
- }
-
- /** */
- public SecurityContextImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
- subj = new SecuritySubjectImpl(id, login, type, addr);
- }
-
- /** */
- public SecurityContextImpl(UUID id) {
- subjId = id;
- }
-
- /** {@inheritDoc} */
- @Override public SecuritySubject subject() {
- return subj;
- }
-
- /** Represents {@link SecuritySubject} implementation. */
- private static class SecuritySubjectImpl implements SecuritySubject {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** Security subject identifier. */
- private final UUID id;
-
- /** Security subject login. */
- private final String login;
-
- /** Security subject type. */
- private final SecuritySubjectType type;
-
- /** Security subject address. */
- private final InetSocketAddress addr;
-
- /** */
- public SecuritySubjectImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
- this.id = id;
- this.login = login;
- this.type = type;
- this.addr = addr;
- }
-
- /** {@inheritDoc} */
- @Override public UUID id() {
- return id;
- }
-
- /** {@inheritDoc} */
- @Override public String login() {
- return login;
- }
-
- /** {@inheritDoc} */
- @Override public SecuritySubjectType type() {
- return type;
- }
-
- /** {@inheritDoc} */
- @Override public InetSocketAddress address() {
- return addr;
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return S.toString(SecuritySubjectImpl.class, this);
- }
- }
-}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java
new file mode 100644
index 0000000000000..79333397eb3e6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java
@@ -0,0 +1,46 @@
+/*
+ * 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.security;
+
+import java.util.UUID;
+import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.thread.context.OperationContextDispatcher;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.plugin.security.SecuritySubject;
+
+/**
+ * Message for {@link SecurityContext}.
+ *
+ * @see SecuritySubject
+ * @see OperationContextDispatcher
+ */
+public class SecurityContextMessage implements Message {
+ /** */
+ @Order(0)
+ public UUID subjId;
+
+ /** Empty constructor for serialization purposes. */
+ public SecurityContextMessage() {
+ // No-op.
+ }
+
+ /** */
+ public SecurityContextMessage(UUID subjId) {
+ this.subjId = subjId;
+ }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index cfb2245498c23..6e69a78746aa6 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -8132,6 +8132,8 @@ public static IgniteDataTransferObjectSeria
* @param msg Message.
*/
public static DiscoveryCustomMessage unwrapCustomMessage(DiscoverySpiCustomMessage msg) {
+ assert msg instanceof DiscoveryCustomMessage;
+
return (DiscoveryCustomMessage)msg;
}
}
From e1d7832829d0cca133b1903769a2e4f9deaec355 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Fri, 26 Jun 2026 12:10:09 +0300
Subject: [PATCH 45/47] test fixes
---
.../java/org/apache/ignite/internal/IgniteKernal.java | 4 ++--
.../java/org/apache/ignite/internal/util/IgniteUtils.java | 6 +++---
.../thread/context/OperationContextAttributesTest.java | 8 +++++---
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 063774e7b13b5..0e58bf6412037 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -1158,8 +1158,6 @@ public void start(
// All components exept Discovery are started, time to check if maintenance is still needed.
mntcProc.prepareAndExecuteMaintenance();
- operationCtxDispatcher.finishRegistration();
-
gw.writeLock();
try {
@@ -1172,6 +1170,8 @@ public void start(
gw.writeUnlock();
}
+ operationCtxDispatcher.finishRegistration();
+
startTimer.finishGlobalStage("Join topology");
// Check whether UTF-8 is the default character encoding.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 6e69a78746aa6..6e57e19b0fb1d 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -8115,7 +8115,7 @@ public void clearAllListener() {
/** */
public static IgniteDataTransferObjectSerializer loadSerializer(Class cls) {
try {
- Class cls0 = IgniteUtils.class.getClassLoader()
+ Class> cls0 = IgniteUtils.class.getClassLoader()
.loadClass(cls.getPackage().getName() + "." + cls.getSimpleName() + "Serializer");
return (IgniteDataTransferObjectSerializer)cls0.getDeclaredConstructor().newInstance();
@@ -8131,8 +8131,8 @@ public static IgniteDataTransferObjectSeria
*
* @param msg Message.
*/
- public static DiscoveryCustomMessage unwrapCustomMessage(DiscoverySpiCustomMessage msg) {
- assert msg instanceof DiscoveryCustomMessage;
+ public static DiscoveryCustomMessage unwrapCustomMessage(@Nullable DiscoverySpiCustomMessage msg) {
+ assert msg == null || msg instanceof DiscoveryCustomMessage;
return (DiscoveryCustomMessage)msg;
}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
index b4003de3bcf72..c14f52087d400 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java
@@ -877,14 +877,16 @@ private void doTestOperationContextAttributesPropagation(boolean discovery) thro
@Override public void start(PluginContext ctx) {
GridKernalContext kctx = ((IgniteEx)ctx.grid()).context();
- kctx.operationContextDispatcher().registerDistributedAttribute(0, dAttr1);
+ int dAttr1Id = OperationContextDispatcher.MAX_ATTRS_CNT - 2;
+ int dAttr2Id = OperationContextDispatcher.MAX_ATTRS_CNT - 1;
- kctx.operationContextDispatcher().registerDistributedAttribute(OperationContextDispatcher.MAX_ATTRS_CNT - 1, dAttr2);
+ kctx.operationContextDispatcher().registerDistributedAttribute(dAttr1Id, dAttr1);
+ kctx.operationContextDispatcher().registerDistributedAttribute(dAttr2Id, dAttr2);
assertThrowsAnyCause(
log,
() -> {
- kctx.operationContextDispatcher().registerDistributedAttribute(0, otherTestAttr);
+ kctx.operationContextDispatcher().registerDistributedAttribute(dAttr2Id, otherTestAttr);
return null;
}, IgniteException.class,
From 3eb7f8ce9bb79e8bc6fe40368a81eec1c09ec397 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Fri, 26 Jun 2026 13:40:17 +0300
Subject: [PATCH 46/47] reimpl
---
.../ignite/internal/CoreMessagesProvider.java | 4 +-
.../discovery/GridDiscoveryManager.java | 13 +-
.../IgniteAuthenticationProcessor.java | 74 +----------
.../security/IgniteSecurityProcessor.java | 12 +-
.../security/SecurityContextImpl.java | 123 ++++++++++++++++++
.../security/SecurityContextMessage.java | 46 -------
6 files changed, 137 insertions(+), 135 deletions(-)
create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
index 3de42dbaab5bb..f2a74ed3d550d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
@@ -238,7 +238,7 @@
import org.apache.ignite.internal.processors.rollingupgrade.RollingUpgradeNodeData;
import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureSet;
import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteProductFeatures;
-import org.apache.ignite.internal.processors.security.SecurityContextMessage;
+import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.processors.service.ServiceChangeBatchRequest;
import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResult;
import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResultBatch;
@@ -690,7 +690,7 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C
// [13400 - 13500]: Operation context messages.
msgIdx = 13400;
withNoSchema(OperationContextMessage.class);
- withNoSchema(SecurityContextMessage.class);
+ withNoSchema(SecurityContextImpl.class);
// [13600 - 13700]: Rolling Upgrade messages.
msgIdx = 13600;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index b0ba8ebffb946..b13b8ee104f39 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -88,15 +88,15 @@
import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateMessage;
import org.apache.ignite.internal.processors.cluster.DiscoveryDataClusterState;
import org.apache.ignite.internal.processors.cluster.IGridClusterStateProcessor;
+import org.apache.ignite.internal.processors.security.IgniteSecurityProcessor;
import org.apache.ignite.internal.processors.security.SecurityContext;
-import org.apache.ignite.internal.processors.security.SecurityContextMessage;
+import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.processors.tracing.messages.SpanContainer;
import org.apache.ignite.internal.systemview.ClusterNodeViewWalker;
import org.apache.ignite.internal.systemview.NodeAttributeViewWalker;
import org.apache.ignite.internal.systemview.NodeMetricsViewWalker;
import org.apache.ignite.internal.thread.OomExceptionHandler;
import org.apache.ignite.internal.thread.context.OperationContext;
-import org.apache.ignite.internal.thread.context.OperationContextAttribute;
import org.apache.ignite.internal.thread.context.Scope;
import org.apache.ignite.internal.thread.context.function.OperationContextAwareWrapper;
import org.apache.ignite.internal.util.GridAtomicLong;
@@ -191,9 +191,6 @@
* Discovery SPI manager.
*/
public class GridDiscoveryManager extends GridManagerAdapter {
- /** */
- private static final OperationContextAttribute SEC_OP_CTX_ATTR = OperationContextAttribute.newInstance();
-
/** */
private static final String PREFIX = "Topology snapshot";
@@ -481,8 +478,6 @@ private void updateClientNodes(UUID leftNodeId) {
/** {@inheritDoc} */
@Override public void start() throws IgniteCheckedException {
- ctx.operationContextDispatcher().registerDistributedAttribute(0, SEC_OP_CTX_ATTR);
-
ctx.addNodeAttribute(ATTR_OFFHEAP_SIZE, requiredOffheap());
ctx.addNodeAttribute(ATTR_DATA_REGIONS_OFFHEAP_SIZE, configuredOffheap());
@@ -934,7 +929,7 @@ public SecurityAwareNotificationTask(DiscoveryNotification notification) {
/** */
@Override public void run() {
- SecurityContextMessage secCtxMsg = OperationContext.get(SEC_OP_CTX_ATTR);
+ SecurityContextImpl secCtxMsg = OperationContext.get(IgniteSecurityProcessor.SEC_CTX_ATTR);
if (secCtxMsg != null) {
try (Scope ignored = ctx.security().withContext(secCtxMsg.subjId)) {
@@ -2346,7 +2341,7 @@ public void sendCustomEvent(DiscoveryCustomMessage msg) throws IgniteCheckedExce
try (Scope ignored = secSubjId == null
? Scope.NOOP_SCOPE
- : OperationContext.set(SEC_OP_CTX_ATTR, new SecurityContextMessage(secSubjId))
+ : OperationContext.set(IgniteSecurityProcessor.SEC_CTX_ATTR, new SecurityContextImpl(secSubjId))
) {
getSpi().sendCustomEvent(msg);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
index 74a7dca34a827..3aab17857a63d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
@@ -17,7 +17,6 @@
package org.apache.ignite.internal.processors.authentication;
-import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collection;
@@ -57,12 +56,12 @@
import org.apache.ignite.internal.processors.security.GridSecurityProcessor;
import org.apache.ignite.internal.processors.security.IgniteSecurityProcessor;
import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.internal.processors.security.SecurityContextImpl;
import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.CU;
-import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.util.worker.GridWorker;
import org.apache.ignite.lang.IgniteFuture;
@@ -73,7 +72,6 @@
import org.apache.ignite.plugin.security.SecurityException;
import org.apache.ignite.plugin.security.SecurityPermission;
import org.apache.ignite.plugin.security.SecuritySubject;
-import org.apache.ignite.plugin.security.SecuritySubjectType;
import org.apache.ignite.spi.discovery.DiscoveryDataBag;
import org.apache.ignite.spi.discovery.DiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -1331,74 +1329,4 @@ private RefreshUsersStorageWorker(ArrayList usrs) {
}
}
}
-
- /** Represents {@link SecuritySubject} implementation. */
- private static class SecuritySubjectImpl implements SecuritySubject {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** Security subject identifier. */
- private final UUID id;
-
- /** Security subject login. */
- private final String login;
-
- /** Security subject type. */
- private final SecuritySubjectType type;
-
- /** Security subject address. */
- private final InetSocketAddress addr;
-
- /** */
- public SecuritySubjectImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
- this.id = id;
- this.login = login;
- this.type = type;
- this.addr = addr;
- }
-
- /** {@inheritDoc} */
- @Override public UUID id() {
- return id;
- }
-
- /** {@inheritDoc} */
- @Override public String login() {
- return login;
- }
-
- /** {@inheritDoc} */
- @Override public SecuritySubjectType type() {
- return type;
- }
-
- /** {@inheritDoc} */
- @Override public InetSocketAddress address() {
- return addr;
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return S.toString(SecuritySubjectImpl.class, this);
- }
- }
-
- /** Represents {@link SecurityContext} implementation that ignores any security permission checks. */
- private static class SecurityContextImpl implements SecurityContext, Serializable {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** */
- private final SecuritySubject subj;
-
- /** */
- public SecurityContextImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
- subj = new SecuritySubjectImpl(id, login, type, addr);
- }
-
- /** {@inheritDoc} */
- @Override public SecuritySubject subject() {
- return subj;
- }
- }
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
index 7b34ed75db2dc..6c7cf57f95e9e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
@@ -88,8 +88,8 @@ static boolean hasSandboxedNodes() {
return SANDBOXED_NODES_COUNTER.get() > 0;
}
- /** Context attribute that holds Security Context. */
- private static final OperationContextAttribute SEC_CTX = OperationContextAttribute.newInstance();
+ /** Attribute that holds local and distributed Security Context. */
+ public static final OperationContextAttribute SEC_CTX_ATTR = OperationContextAttribute.newInstance();
/** Security processor. */
private final GridSecurityProcessor secPrc;
@@ -126,7 +126,7 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP
/** {@inheritDoc} */
@Override public Scope withContext(SecurityContext secCtx) {
- return OperationContext.set(SEC_CTX, secCtx == dfltSecCtx ? null : secCtx);
+ return OperationContext.set(SEC_CTX_ATTR, secCtx == dfltSecCtx ? null : SecurityContextImpl.of(secCtx));
}
/** {@inheritDoc} */
@@ -172,12 +172,12 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP
/** {@inheritDoc} */
@Override public boolean isDefaultContext() {
- return OperationContext.get(SEC_CTX) == null;
+ return OperationContext.get(SEC_CTX_ATTR) == null;
}
/** {@inheritDoc} */
@Override public SecurityContext securityContext() {
- SecurityContext res = OperationContext.get(SEC_CTX);
+ SecurityContext res = OperationContext.get(SEC_CTX_ATTR);
return res == null ? dfltSecCtx : res;
}
@@ -236,6 +236,8 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP
@Override public void start() throws IgniteCheckedException {
super.start();
+ ctx.operationContextDispatcher().registerDistributedAttribute(0, SEC_CTX_ATTR);
+
ctx.addNodeAttribute(ATTR_GRID_SEC_PROC_CLASS, secPrc.getClass().getName());
secPrc.start();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
new file mode 100644
index 0000000000000..02deae0d2358c
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextImpl.java
@@ -0,0 +1,123 @@
+/*
+ * 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.security;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.UUID;
+import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.plugin.security.SecuritySubject;
+import org.apache.ignite.plugin.security.SecuritySubjectType;
+import org.jetbrains.annotations.Nullable;
+
+/** Represents {@link SecurityContext} implementation that ignores any security permission checks. */
+public class SecurityContextImpl implements SecurityContext, Message, Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Security subject identifier. */
+ @Order(0)
+ public UUID subjId;
+
+ /** */
+ private @Nullable SecuritySubject subj;
+
+ /** Empty constructor for serialization purposes. */
+ public SecurityContextImpl() {
+ // No-op.
+ }
+
+ /** Constructor to be a {@link Message} only. */
+ public SecurityContextImpl(UUID subjId) {
+ this.subjId = subjId;
+ }
+
+ /** */
+ public SecurityContextImpl(SecuritySubject subj) {
+ this.subjId = subj.id();
+ this.subj = subj;
+ }
+
+ /** */
+ public SecurityContextImpl(UUID id, String login, SecuritySubjectType type, InetSocketAddress addr) {
+ subjId = id;
+ subj = new SecuritySubjectImpl(login, type, addr);
+ }
+
+ /** */
+ public static @Nullable SecurityContextImpl of(@Nullable SecurityContext ctx) {
+ if (ctx == null || ctx instanceof SecurityContextImpl)
+ return (SecurityContextImpl)ctx;
+
+ return new SecurityContextImpl(ctx.subject());
+ }
+
+ /** {@inheritDoc} */
+ @Override public @Nullable SecuritySubject subject() {
+ return subj;
+ }
+
+ /** Represents {@link SecuritySubject} implementation. */
+ private class SecuritySubjectImpl implements SecuritySubject {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Security subject login. */
+ private final String login;
+
+ /** Security subject type. */
+ private final SecuritySubjectType type;
+
+ /** Security subject address. */
+ private final InetSocketAddress addr;
+
+ /** */
+ private SecuritySubjectImpl(String login, SecuritySubjectType type, InetSocketAddress addr) {
+ this.login = login;
+ this.type = type;
+ this.addr = addr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public UUID id() {
+ return subjId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String login() {
+ return login;
+ }
+
+ /** {@inheritDoc} */
+ @Override public SecuritySubjectType type() {
+ return type;
+ }
+
+ /** {@inheritDoc} */
+ @Override public InetSocketAddress address() {
+ return addr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(SecuritySubjectImpl.class, this);
+ }
+ }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java
deleted file mode 100644
index 79333397eb3e6..0000000000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextMessage.java
+++ /dev/null
@@ -1,46 +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.internal.processors.security;
-
-import java.util.UUID;
-import org.apache.ignite.internal.Order;
-import org.apache.ignite.internal.thread.context.OperationContextDispatcher;
-import org.apache.ignite.plugin.extensions.communication.Message;
-import org.apache.ignite.plugin.security.SecuritySubject;
-
-/**
- * Message for {@link SecurityContext}.
- *
- * @see SecuritySubject
- * @see OperationContextDispatcher
- */
-public class SecurityContextMessage implements Message {
- /** */
- @Order(0)
- public UUID subjId;
-
- /** Empty constructor for serialization purposes. */
- public SecurityContextMessage() {
- // No-op.
- }
-
- /** */
- public SecurityContextMessage(UUID subjId) {
- this.subjId = subjId;
- }
-}
From 352c048dd1c7052c5cee5b929a78bed3ee282013 Mon Sep 17 00:00:00 2001
From: Vladimir Steshin
Date: Fri, 26 Jun 2026 13:55:13 +0300
Subject: [PATCH 47/47] fix
---
.../main/java/org/apache/ignite/internal/IgniteKernal.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 0e58bf6412037..063774e7b13b5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -1158,6 +1158,8 @@ public void start(
// All components exept Discovery are started, time to check if maintenance is still needed.
mntcProc.prepareAndExecuteMaintenance();
+ operationCtxDispatcher.finishRegistration();
+
gw.writeLock();
try {
@@ -1170,8 +1172,6 @@ public void start(
gw.writeUnlock();
}
- operationCtxDispatcher.finishRegistration();
-
startTimer.finishGlobalStage("Join topology");
// Check whether UTF-8 is the default character encoding.