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.

Reply via email to