This is an automated email from the ASF dual-hosted git repository.
sanpwc pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 3a88fd9defc IGNITE-27261 Graceful TimeoutException handling within
CMG/MG groups on node stop (#7193)
3a88fd9defc is described below
commit 3a88fd9defc4fe2199d5ca3201bfc35dfb9770e1
Author: Alexander Lapin <[email protected]>
AuthorDate: Wed Dec 10 11:41:58 2025 +0200
IGNITE-27261 Graceful TimeoutException handling within CMG/MG groups on
node stop (#7193)
---
.../management/ClusterManagementGroupManager.java | 14 +++++++++++
.../cluster/management/raft/CmgRaftService.java | 8 ++++++
.../metastorage/impl/MetaStorageManagerImpl.java | 8 ++++++
.../metastorage/impl/MetaStorageServiceImpl.java | 8 ++++++
.../internal/raft/service/RaftGroupService.java | 8 ++++++
.../ignite/internal/raft/RaftGroupServiceImpl.java | 29 +++++++++++++++++++---
.../PhysicalTopologyAwareRaftGroupService.java | 5 ++++
.../raft/client/TopologyAwareRaftGroupService.java | 5 ++++
.../org/apache/ignite/internal/app/IgniteImpl.java | 3 +++
9 files changed, 85 insertions(+), 3 deletions(-)
diff --git
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
index 33a683bf731..71dafbe4098 100644
---
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
+++
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
@@ -1433,4 +1433,18 @@ public class ClusterManagementGroupManager extends
AbstractEventProducer<Cluster
LogicalTopologyImpl logicalTopologyImpl() {
return (LogicalTopologyImpl) logicalTopology;
}
+
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp
hack
+ /**
+ * Mark component as stopping.
+ */
+ public void markAsStopping() {
+ var raftService0 = raftService;
+
+ if (raftService0 == null) {
+ return;
+ }
+
+ raftService0.thenAccept(CmgRaftService::markAsStopping);
+ }
}
diff --git
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
index 215e38feeae..deb4deecb3f 100644
---
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
+++
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
@@ -374,4 +374,12 @@ public class CmgRaftService implements ManuallyCloseable {
public void close() {
raftService.shutdown();
}
+
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp
hack
+ /**
+ * Mark service as stopping.
+ */
+ public void markAsStopping() {
+ raftService.markAsStopping();
+ }
}
diff --git
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
index 5b9bb88e17e..c2e01f6bede 100644
---
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
+++
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
@@ -1417,4 +1417,12 @@ public class MetaStorageManagerImpl implements
MetaStorageManager, MetastorageGr
CompletableFuture<Void> sendCompactionCommand(long compactionRevision) {
return inBusyLockAsync(busyLock, () ->
metaStorageSvcFut.thenCompose(svc ->
svc.sendCompactionCommand(compactionRevision)));
}
+
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp
hack
+ /**
+ * Mark component as stopping.
+ */
+ public void markAsStopping() {
+ metaStorageSvcFut.thenAccept(MetaStorageServiceImpl::markAsStopping);
+ }
}
diff --git
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
index 3d21dce163b..8ff08fa3f62 100644
---
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
+++
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
@@ -401,4 +401,12 @@ public class MetaStorageServiceImpl implements
MetaStorageService {
return context.raftService().run(command, TIMEOUT_MILLIS);
}
+
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp
hack
+ /**
+ * Mark component as stopping.
+ */
+ void markAsStopping() {
+ context.raftService().markAsStopping();
+ }
}
diff --git
a/modules/raft-api/src/main/java/org/apache/ignite/internal/raft/service/RaftGroupService.java
b/modules/raft-api/src/main/java/org/apache/ignite/internal/raft/service/RaftGroupService.java
index 2dfd5e87a0b..6b7c71578b3 100644
---
a/modules/raft-api/src/main/java/org/apache/ignite/internal/raft/service/RaftGroupService.java
+++
b/modules/raft-api/src/main/java/org/apache/ignite/internal/raft/service/RaftGroupService.java
@@ -256,4 +256,12 @@ public interface RaftGroupService extends
RaftCommandRunner {
* @param configuration Peers and learners configuration.
*/
void updateConfiguration(PeersAndLearners configuration);
+
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp
hack
+ /**
+ * Mark service as stopping.
+ */
+ default void markAsStopping() {
+ // No-op
+ }
}
diff --git
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/RaftGroupServiceImpl.java
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/RaftGroupServiceImpl.java
index d264f700527..f07f29e1dc1 100644
---
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/RaftGroupServiceImpl.java
+++
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/RaftGroupServiceImpl.java
@@ -25,6 +25,7 @@ import static
org.apache.ignite.internal.tostring.IgniteToStringBuilder.includeS
import static
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
import static org.apache.ignite.internal.util.ExceptionUtils.unwrapCause;
import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
+import static org.apache.ignite.lang.ErrorGroups.Common.NODE_STOPPING_ERR;
import static org.apache.ignite.raft.jraft.rpc.CliRequests.AddLearnersRequest;
import static org.apache.ignite.raft.jraft.rpc.CliRequests.AddPeerRequest;
import static org.apache.ignite.raft.jraft.rpc.CliRequests.AddPeerResponse;
@@ -57,6 +58,7 @@ import java.util.function.Function;
import java.util.function.Supplier;
import org.apache.ignite.internal.lang.IgniteInternalException;
import org.apache.ignite.internal.lang.IgniteSystemProperties;
+import org.apache.ignite.internal.lang.NodeStoppingException;
import org.apache.ignite.internal.logger.IgniteLogger;
import org.apache.ignite.internal.logger.Loggers;
import org.apache.ignite.internal.network.ClusterService;
@@ -133,6 +135,9 @@ public class RaftGroupServiceImpl implements
RaftGroupService {
private final TopologyEventHandler topologyEventHandler;
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp
hack
+ private volatile boolean stopping;
+
/**
* Constructor.
*
@@ -170,6 +175,7 @@ public class RaftGroupServiceImpl implements
RaftGroupService {
this.stoppingExceptionFactory = stoppingExceptionFactory;
this.throttlingContextHolder = throttlingContextHolder;
this.topologyEventHandler = topologyEventHandler();
+ this.stopping = false;
}
/**
@@ -716,8 +722,13 @@ public class RaftGroupServiceImpl implements
RaftGroupService {
long requestStartTime = currentTimeMillis();
if (requestStartTime >= retryContext.stopTime()) {
-
fut.completeExceptionally(retryContext.createTimeoutException());
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-26085
Remove, tmp hack
+ if (stopping) {
+ fut.completeExceptionally(new NodeStoppingException());
+ return;
+ }
+
fut.completeExceptionally(retryContext.createTimeoutException());
return;
}
@@ -727,8 +738,15 @@ public class RaftGroupServiceImpl implements
RaftGroupService {
? peerThrottlingContextHolder.peerRequestTimeoutMillis() :
retryContext.responseTimeoutMillis();
resolvePeer(retryContext.targetPeer())
- .thenCompose(node -> cluster.messagingService()
- .invoke(node, retryContext.request(),
responseTimeout))
+ .thenCompose(node -> {
+ // TODO:
https://issues.apache.org/jira/browse/IGNITE-26085 Remove, tmp hack
+ if (stopping) {
+ throw new
IgniteInternalException(NODE_STOPPING_ERR, new NodeStoppingException());
+ }
+
+ return cluster.messagingService()
+ .invoke(node, retryContext.request(),
responseTimeout);
+ })
.whenComplete((resp, err) -> {
if (LOG.isTraceEnabled()) {
LOG.trace("sendWithRetry req={} resp={} from={}
to={} err={}",
@@ -1104,4 +1122,9 @@ public class RaftGroupServiceImpl implements
RaftGroupService {
}
};
}
+
+ @Override
+ public void markAsStopping() {
+ stopping = true;
+ }
}
diff --git
a/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/PhysicalTopologyAwareRaftGroupService.java
b/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/PhysicalTopologyAwareRaftGroupService.java
index 4a8512cf659..b8c646c3b5f 100644
---
a/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/PhysicalTopologyAwareRaftGroupService.java
+++
b/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/PhysicalTopologyAwareRaftGroupService.java
@@ -508,4 +508,9 @@ public class PhysicalTopologyAwareRaftGroupService
implements RaftGroupService {
callbacks.remove(callback);
}
}
+
+ @Override
+ public void markAsStopping() {
+ raftClient.markAsStopping();
+ }
}
diff --git
a/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
b/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
index aeab8e01454..22858b244cd 100644
---
a/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
+++
b/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
@@ -640,4 +640,9 @@ public class TopologyAwareRaftGroupService implements
RaftGroupService {
return fut;
}
+
+ @Override
+ public void markAsStopping() {
+ raftClient.markAsStopping();
+ }
}
diff --git
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index bf0fe506f5a..0b51be05a1f 100644
---
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -1766,6 +1766,9 @@ public class IgniteImpl implements Ignite {
ExecutorService lifecycleExecutor = stopExecutor();
+ cmgMgr.markAsStopping();
+ metaStorageMgr.markAsStopping();
+
// TODO https://issues.apache.org/jira/browse/IGNITE-22570
lifecycleManager.stopNode(new ComponentContext(lifecycleExecutor))
// Moving to the common pool on purpose to close the stop pool
and proceed user's code in the common pool.